Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/branches/R_10_00@22356 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1258 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1258 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| // Stampa dettaglio disponibilita' articoli
 | |
| #include <applicat.h>
 | |
| #include <automask.h>
 | |
| #include <colors.h>
 | |
| #include <defmask.h>
 | |
| #include <execp.h>
 | |
| #include <progind.h>
 | |
| #include <reprint.h>
 | |
| #include <utility.h>
 | |
| #include <xvtility.h>
 | |
| 
 | |
| #include "../or/orlib.h"
 | |
| #include "../cg/cglib01.h"
 | |
| #include "../mg/anamag.h"
 | |
| #include "../ve/velib07.h"
 | |
| 
 | |
| #include "ps0430300a.h"
 | |
| 
 | |
| #include <clifo.h> 
 | |
| #include <cfven.h> 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TArticoli_recordset
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TArticoli_recordset : public TISAM_recordset
 | |
| {
 | |
|   static TString8 __codmag;
 | |
|   static int __codes;
 | |
| 	
 | |
|   bool _sottoscorta;
 | |
| 
 | |
| protected:
 | |
| 	static bool filtra_sottoscorta(const TRelation* rel);
 | |
| 
 | |
| public:
 | |
| 	virtual TCursor* cursor() const;
 | |
| 	TArticoli_recordset(const char* use, bool sottoscorta, int codes, const char * codmag) : TISAM_recordset(use), _sottoscorta(sottoscorta) { __codes = codes; __codmag = codmag;}
 | |
| 	virtual ~TArticoli_recordset() {}
 | |
| };
 | |
| 
 | |
| TString8 TArticoli_recordset::__codmag;
 | |
| int      TArticoli_recordset::__codes;
 | |
| 
 | |
| bool TArticoli_recordset::filtra_sottoscorta(const TRelation* rel)
 | |
| {
 | |
| 	((TRelation*)rel)->save_status();
 | |
|   const char* codart = rel->curr(LF_ANAMAG).get(ANAMAG_CODART);
 | |
|   TArticolo_giacenza artgiac(codart);
 | |
| 
 | |
|   const real giac = artgiac.giacenza_anno(__codmag, NULL, __codes);
 | |
| 
 | |
|   const bool ok = giac < artgiac.scorta_minima(__codmag, NULL, __codes);
 | |
| 	((TRelation*)rel)->restore_status();
 | |
| 	return ok;
 | |
| }
 | |
| 
 | |
| TCursor* TArticoli_recordset::cursor() const
 | |
| {
 | |
| 	TCursor* c = TISAM_recordset::cursor();
 | |
| 	if (c != NULL && _sottoscorta)
 | |
| 	  c->set_filterfunction(filtra_sottoscorta);
 | |
| 	return c;
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TConsumi_report
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TConsumi_report : public TDocument_report
 | |
| {
 | |
| protected:
 | |
|   virtual bool use_mask() { return false; }
 | |
| 
 | |
| public:
 | |
|   TConsumi_report();
 | |
| };
 | |
| 
 | |
| TConsumi_report::TConsumi_report()
 | |
| {
 | |
|   load("ps0430300a");
 | |
| }
 | |
| 
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TGenera_ordini_mask
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TGenera_ordini_mask : public TAutomask
 | |
| {
 | |
| 	TString _anamag_query;
 | |
| 	TString _disable_expr;
 | |
| 	TString8 _disable_num;
 | |
| 	TExpression _dis;
 | |
| 	TString _doc_filter;
 | |
| 	int _days_interval;
 | |
|   int _riga_da_selezionare;
 | |
|   short _campo_da_selezionare;
 | |
| 	bool _filter_changed, _order_changed;
 | |
| 	
 | |
| private:
 | |
|   void serialize(bool bSave);
 | |
| 	void load_user_defs();
 | |
| 	void update_sheet();
 | |
| 	void update_documents();
 | |
| 	void reconstruction(const TDocumento& doc2delete);
 | |
| 
 | |
| protected:
 | |
| 	bool on_sheet_event(TOperable_field& o, TField_event e, long jolly);
 | |
|   virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | |
| 	virtual void next_page(int p);
 | |
|   virtual void on_idle();
 | |
| 
 | |
| public:
 | |
| 
 | |
|   TGenera_ordini_mask();
 | |
|   ~TGenera_ordini_mask();
 | |
| };
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TCreazione_ordini
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| class TCreazione_ordini : public TSkeleton_application
 | |
| {
 | |
|   TGenera_ordini_mask* _mask;
 | |
| 
 | |
| protected:
 | |
|   virtual const char * extra_modules() const {return "or";}
 | |
| 	TString_array _userfld;
 | |
| 	void aggiorna_stato_doc_orig(const TRectype& rdoc);
 | |
| 
 | |
| public:
 | |
|   void generate_orders();
 | |
|   void generate_carics();
 | |
|   void generate_docs_head(const char type, const TSheet_field& sf, 
 | |
|                           long& minforn, long& maxforn, TAssoc_array& documents);
 | |
|   void generate_caric_row(const TSheet_field& sf, TToken_string* row, const real qta, 
 | |
|                           TDocumento* d,TRiga_documento& rdoc, TLocalisamfile& righedoc);
 | |
|   void generate_order_row(const TSheet_field& sf, TToken_string* row, const real qta,
 | |
|                           TDocumento* d, TRiga_documento& rdoc, const TRectype& forn, const TRectype& fornven);
 | |
|   void write_docs(const char tipo, const long& minforn, const long& maxforn, TAssoc_array& documents);
 | |
| 
 | |
|   virtual bool create(); 
 | |
|   virtual void main_loop();
 | |
|   virtual bool destroy(); 
 | |
|   virtual void print();
 | |
| 	void print_doc(const TRectype & doc);
 | |
| };
 | |
| 
 | |
| inline TCreazione_ordini & capp() { return (TCreazione_ordini &) main_app();}
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TGenera_ordini_mask
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| void TGenera_ordini_mask::update_sheet()
 | |
| {
 | |
| 	_filter_changed = false;
 | |
| 
 | |
|   TWait_cursor hourglass;
 | |
|   const TDate oggi(TODAY);
 | |
| 
 | |
| 	TSheet_field& sf = sfield(F_ARTICLES);
 | |
| 	TEsercizi_contabili esc;
 | |
| 	TString query(_anamag_query);
 | |
| 	TString16 grmerc(get(F_GRMERC));
 | |
| 	const int pos = query.find("KEY ");
 | |
| 	TArticolo_giacenza art;
 | |
| 	TString8 codmag(get(F_MAG));
 | |
| 	const TString4 codnum(get(F_CODNUM));
 | |
| 	const bool check_expr = codnum == _disable_num;
 | |
| 	int anno = get_int(F_ANNO);
 | |
|   if (anno <= 0)
 | |
|     anno = oggi.year();
 | |
| 
 | |
| 	codmag.left_just(3);
 | |
| 	codmag << get(F_DEP);
 | |
| 	codmag.trim();
 | |
| 	
 | |
| 	grmerc.left_just(3);
 | |
| 	grmerc << get(F_SGRMERC);
 | |
| 	grmerc.trim();
 | |
| 
 | |
| 	if (grmerc.full())
 | |
| 	{
 | |
| 		if (pos > 0)
 | |
| 			query[pos + 4] = '3';
 | |
| 		query << "\nFROM GRMERC=#GRMERC\nTO GRMERC=#GRMERC";
 | |
| 	}
 | |
| 	else
 | |
| 		if (pos > 0)
 | |
| 			query[pos + 4] = '2';
 | |
| 	
 | |
| 	TString select;
 | |
| 
 | |
| 	const TString & codart = get(F_SCODART);
 | |
| 
 | |
| 	if (codart.full())
 | |
| 		select << "(UPPER(" << ANAMAG_CODART << ")?=UPPER(\"" << codart << "\"))";
 | |
| 
 | |
| 	const TString & desart = get(F_SDESART);
 | |
| 
 | |
| 	if (desart.full())
 | |
| 	{
 | |
| 		if (select.full())
 | |
| 			select << "&&";
 | |
| 		select << "(UPPER(" << ANAMAG_DESCR << ")?=UPPER(\"" << desart << "\"))";
 | |
| 	}
 | |
| 
 | |
| 	const TString& desagg = get(F_SDESAGG);
 | |
| 	if (desagg.full())
 | |
| 	{
 | |
| 		if (select.full())
 | |
| 			select << "&&";
 | |
| 		select << "(UPPER(" << ANAMAG_DESCRAGG << ")?=UPPER(\"" << desagg << "\"))";
 | |
| 	}
 | |
| 
 | |
| 	const TString& codforn = get(F_SCODFOR);
 | |
| 	if (codforn.full())
 | |
| 	{
 | |
| 		if (select.full())
 | |
| 			select << "&&";
 | |
| 		select << "(" << ANAMAG_CODFORN << "==\"" << codforn << "\")";
 | |
| 	}
 | |
| 
 | |
| 	const TString& ragsoc = get(F_SRAGSOC);
 | |
| 
 | |
| 	if (ragsoc.full())
 | |
| 	{
 | |
| 		if (select.full())
 | |
| 			select << "&&";
 | |
| 		select << "(UPPER(CLIFO.RAGSOC)?=UPPER(\"" <<  ragsoc << "\"))";
 | |
| 	}
 | |
| 
 | |
| 	if (select.full())
 | |
| 	{
 | |
| 		int pos = query.find("SELECT ");
 | |
| 		if (pos > 0)
 | |
| 		{
 | |
| 			const int acapo = query.find('\n', pos);
 | |
| 			query.insert("((", pos+7);
 | |
|       select.insert(")&&(");
 | |
| 			select << "))";
 | |
| 			query.insert(select, acapo+2);
 | |
| 		}
 | |
| 		else
 | |
| 		{
 | |
| 		  pos = query.find('\n');
 | |
| 			select.insert("\nSELECT ");
 | |
| 			query.insert(select, pos);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 
 | |
| 	TArticoli_recordset recset(query, get_bool(F_SOTTOSCORTA), esc.date2esc(oggi), get(F_MAG));
 | |
| 	TVariant var ;
 | |
| 
 | |
| 	var = grmerc;
 | |
| 	recset.set_var("#GRMERC", var);
 | |
| 	var =  user();
 | |
| 	recset.set_var("#USER", var);
 | |
| 	TString8 codes; codes.format("%04d", esc.date2esc(oggi));
 | |
| 	var = codmag;
 | |
| 	recset.set_var("#CODMAG", var);
 | |
| 	var = (long)anno;
 | |
| 	recset.set_var("#ANNOES", var);
 | |
| 	
 | |
| 	int i = 0;
 | |
| 
 | |
| 	sf.destroy();
 | |
| 
 | |
|   for (bool ok = recset.move_first(); ok; ok = recset.move_next())
 | |
|   {
 | |
| 		TToken_string & row = sf.row(i);
 | |
| 		const TString & codart = recset.get(LF_ANAMAG, ANAMAG_CODART).as_string();
 | |
| 
 | |
| 		row.add(codart, sf.cid2index(SA_CODART));
 | |
| 		art.read(codart);
 | |
| 		const real giac = art.giacenza_anno(codmag, "", anno);
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_DESCR).as_string(), sf.cid2index(SA_DESCR));
 | |
| 		row.add(recset.get("UMART.UM").as_string(), sf.cid2index(SA_UM));
 | |
| 
 | |
| 		const long  codforn = recset.get(LF_ANAMAG, ANAMAG_CODFORN).as_int();
 | |
| 		
 | |
| 		row.add(codforn, sf.cid2index(SA_FORNITORE));
 | |
| 		row.add(recset.get("CLIFO.RAGSOC").as_string(), sf.cid2index(SA_RAGSOC));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_GIORNIRIOR).as_string(), sf.cid2index(SA_LEADTIME));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_LOTTORIOR).as_string(), sf.cid2index(SA_LOTTOMIN));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_DESCRAGG).as_string(), sf.cid2index(SA_DESCRAGG));
 | |
| 		row.add(giac.string(), sf.cid2index(SA_GIACENZA));
 | |
| 
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_PPCONF).as_string(), sf.cid2index(SA_PPCONF));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER1).as_string(), sf.cid2index(SA_USER1));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER2).as_string(), sf.cid2index(SA_USER2));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER3).as_string(), sf.cid2index(SA_USER3));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER4).as_string(), sf.cid2index(SA_USER4));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER5).as_string(), sf.cid2index(SA_USER5));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER6).as_string(), sf.cid2index(SA_USER6));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER7).as_string(), sf.cid2index(SA_USER7));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER8).as_string(), sf.cid2index(SA_USER8));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER9).as_string(), sf.cid2index(SA_USER9));
 | |
| 		row.add(recset.get(LF_ANAMAG, ANAMAG_USER10).as_string(), sf.cid2index(SA_USER10));
 | |
| 		const real disp = art.disponibilita(codes, get(F_MAG), NULL);
 | |
| 		row.add(disp.string(), sf.cid2index(SA_DISPON));
 | |
| 		sf.check_row(i);
 | |
| 		if (check_expr)
 | |
| 		{
 | |
| 			for (int j = _dis.numvar() - 1; j >= 0;  j--)
 | |
| 			{
 | |
| 				const TString16 varn =_dis.varname(j);
 | |
| 
 | |
| 				if (varn == "GIAC")
 | |
| 					_dis.setvar(j, giac.string());
 | |
| 				else
 | |
| 					if (varn == "USER")
 | |
| 						_dis.setvar(j, user());
 | |
| 					else
 | |
| 						_dis.setvar(j, recset.get(varn).as_string());
 | |
| 			}
 | |
| 			if (_dis.as_bool())
 | |
| 				sf.disable_row(i);
 | |
| 
 | |
| 		}
 | |
| 		i++;
 | |
| 	}
 | |
| 
 | |
|   sf.force_update();
 | |
| }
 | |
| 
 | |
| void TGenera_ordini_mask::update_documents()
 | |
| {
 | |
| 	_order_changed = false;
 | |
|   TWait_cursor hourglass;
 | |
| 
 | |
|   TSheet_field& sh = sfield(F_DOCUMENTS);
 | |
|   sh.destroy();
 | |
| 
 | |
|   TString query;
 | |
|   query << "USE RDOC\n";
 | |
|   query << "SELECT (CODARTMAG!=\"\")&&(CODCMS==#CODCMS)"
 | |
| 				<< "&&(BETWEEN(33.STATO,#DASTATO,#ASTATO))"
 | |
| 				<< "&&(RIGAEVASA!=\"X\")\n";
 | |
|   query << "JOIN ANAMAG INTO CODART==CODART\n";
 | |
|   query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n";
 | |
|   query << "JOIN CLIFO TO DOC INTO TIPOCF=\"F\" CODCF==CODCF\n";
 | |
|   query << "FROM CODNUM=#CODNUM ANNO=#DAANNO\n";
 | |
|   query << "TO   CODNUM=#CODNUM ANNO=#ADANNO\n";
 | |
| 
 | |
|   const long anno = get_int(F_ANNO);
 | |
| 
 | |
|   TISAM_recordset orders(query);
 | |
|   orders.set_var("#DASTATO", TVariant(get(F_DASTATO)));
 | |
|   orders.set_var("#ASTATO",  TVariant(get(F_ASTATO)));
 | |
|   orders.set_var("#CODCMS",  TVariant(get(F_CDCT)));
 | |
|   orders.set_var("#CODNUM",  TVariant(get(F_CODNUM)));
 | |
|   orders.set_var("#DAANNO",  TVariant(anno-2L));
 | |
|   orders.set_var("#ADANNO",  TVariant(anno));
 | |
| 
 | |
|   TMask& m = sh.sheet_mask();
 | |
|   TRelation& rel = *orders.cursor()->relation();
 | |
| 
 | |
| 	const int status_pos = sh.cid2index(SD_STATODOC);
 | |
|   for (bool ok = orders.move_first(); ok; ok = orders.move_next())
 | |
|   {
 | |
|     TToken_string& row = sh.row(-1);
 | |
|     FOR_EACH_MASK_FIELD(m, i, f)
 | |
|     {
 | |
|       const TFieldref* fr = f->field();
 | |
|       if (fr != NULL)
 | |
| 			{
 | |
| 	      const int j = sh.cid2index(f->dlg());
 | |
|         row.add(fr->read(rel), j);
 | |
| 			}
 | |
|     }
 | |
|     const int nrow = sh.items()-1;
 | |
|     switch (row.get_int(status_pos))
 | |
|     {
 | |
|     case  1: sh.set_back_and_fore_color(NORMAL_BACK_COLOR, NORMAL_COLOR, nrow); break;
 | |
|     case  2: sh.set_back_and_fore_color(REQUIRED_BACK_COLOR, NORMAL_COLOR, nrow); break;
 | |
|     default: sh.set_back_and_fore_color(DISABLED_BACK_COLOR, DISABLED_COLOR, nrow); break;
 | |
|     }
 | |
| 		sh.check_row(nrow);
 | |
|   }
 | |
|   sh.force_update();
 | |
| }
 | |
| 
 | |
| void TGenera_ordini_mask::next_page(int p)
 | |
| {
 | |
| 	TAutomask::next_page(p);
 | |
| 	
 | |
|   if (_filter_changed)
 | |
| 	{
 | |
| 		const TSheet_field& sf = sfield(F_ARTICLES);
 | |
| 		if (win() == sf.parent())
 | |
| 			update_sheet();
 | |
| 	}
 | |
|   if (_order_changed)
 | |
| 	{
 | |
| 		const TSheet_field& sf = sfield(F_DOCUMENTS);
 | |
| 		if (win() == sf.parent())
 | |
| 			update_documents();
 | |
| 	}
 | |
| 
 | |
| }
 | |
| 
 | |
| bool TGenera_ordini_mask::on_sheet_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   switch(e)
 | |
|   {
 | |
| 	case se_query_del:
 | |
| 	case se_query_add:
 | |
| 		return false;
 | |
| 
 | |
|   case fe_init:
 | |
|     if (o.dlg() == F_ARTICLES)
 | |
|       update_sheet();
 | |
|     else
 | |
|       update_documents();
 | |
|     break;
 | |
| 
 | |
|   //gestione automatica immissione qta per articolo (con terminalino)
 | |
|   case se_notify_modify:
 | |
|     if (o.dlg() == F_ARTICLES)
 | |
|     {
 | |
|       _campo_da_selezionare = F_CAZ_CODART;
 | |
|     }
 | |
|     break;
 | |
| 
 | |
| 	default:
 | |
| 		break;
 | |
|   }
 | |
|   return true;
 | |
| }
 | |
| 
 | |
| void TGenera_ordini_mask::reconstruction(const TDocumento& doc2delete)
 | |
| {
 | |
| 	const char* const defpar = "or";
 | |
| 	TConfig c(CONFIG_USER, defpar);
 | |
| 	const char statoini = c.get_char("OR14_STATOINI");
 | |
| 
 | |
|   const int rows = doc2delete.rows();
 | |
|   for (int i=1; i<=rows; i++) 
 | |
|   {
 | |
|     const TRiga_documento& r = doc2delete[i];
 | |
| 		const TRectype* original_doc = r.find_original_doc();
 | |
| 		if (original_doc != NULL)
 | |
| 		{
 | |
| 			TDocumento d(*original_doc);
 | |
| 			const long nriga = r.get_long(RDOC_DAIDRIGA);
 | |
| 			if (nriga != 0)
 | |
| 			{
 | |
| 				TRiga_documento& original_row = d[nriga];
 | |
| 				const real qta = r.quantita();
 | |
| 				const TString& name = original_row.field_qtaevasa();
 | |
| 				real qtaevasa = original_row.get_real(name) - qta;
 | |
| 				if (qtaevasa < ZERO)
 | |
| 					qtaevasa = ZERO;
 | |
| 				original_row.put(name, qtaevasa);
 | |
| 				if (qtaevasa < original_row.quantita())
 | |
| 					original_row.zero(RDOC_RIGAEVASA);
 | |
| 				else
 | |
| 					original_row.put(RDOC_RIGAEVASA, "X");
 | |
| 				if (statoini != ' ')
 | |
| 					d.stato(statoini);
 | |
| 				d.rewrite();
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| bool TGenera_ordini_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | |
| {
 | |
|   bool ok = true;
 | |
| 	switch (o.dlg())
 | |
|   {
 | |
| 	case F_GRMERC:
 | |
| 	case F_SGRMERC:
 | |
| 	case F_SOTTOSCORTA:
 | |
| 	case F_SCODART:
 | |
| 	case F_SDESART:
 | |
| 	case F_SDESAGG:
 | |
| 	case F_SCODFOR:
 | |
| 	case F_SRAGSOC:
 | |
| 		if (e == fe_modify)
 | |
| 			_filter_changed = true;
 | |
| 		break;
 | |
|   case F_CODNUM:
 | |
| 		if (e == fe_modify)
 | |
| 		{
 | |
| 			_order_changed = true;
 | |
| 			_filter_changed = true;
 | |
| 		}
 | |
| 		break;
 | |
| 	case F_TIPODOC:
 | |
| 		if (e == fe_init || e == fe_modify)
 | |
| 		{
 | |
| 			const TTipo_documento tipodoc(o.get());
 | |
| 			const bool is_ordine = tipodoc.is_ordine();
 | |
| 			enable(DLG_ELABORA, is_ordine);
 | |
| 		}
 | |
| 		break;
 | |
|   case F_ANNO:
 | |
| 		if (e == fe_init && o.empty())
 | |
|     {
 | |
|       const TDate oggi(TODAY);
 | |
|       TString4 anno; anno << oggi.year();
 | |
|       o.set(anno);
 | |
|     }
 | |
| 		if (e == fe_modify)
 | |
| 			_filter_changed = true;
 | |
|     // continue
 | |
|   case F_DASTATO:
 | |
|   case F_ASTATO:
 | |
|     if (e == fe_modify)
 | |
|       update_documents();
 | |
|     break;
 | |
| 
 | |
|   case F_CAZ_CODART:  //ricerca riga da codart in testa alla maschera
 | |
|     if (e == fe_modify)
 | |
|     {
 | |
|       int found = -1;
 | |
|       bool non_esiste = true;
 | |
| 
 | |
|       const TString& selected_codart = o.get();
 | |
|       //ricerca sui codici articolo in anagrafica possibili (sono quelli sullo sheet)
 | |
|       TSheet_field& sf_righe = sfield(F_ARTICLES);
 | |
|       FOR_EACH_SHEET_ROW(sf_righe, r, row)
 | |
|       {
 | |
|         const TString& riga_codart = row->get(0);
 | |
|         if (selected_codart == riga_codart)
 | |
|         {
 | |
|           found = r;
 | |
|           break;
 | |
|         }
 | |
|       }
 | |
|       //se non lo pesca in anagrafica tenta con i codici articolo fornitore (CODCORR_CODARTALT)
 | |
|       if (found < 0)
 | |
|       {
 | |
|         FOR_EACH_SHEET_ROW(sf_righe, r, row)
 | |
|         {
 | |
|           const TString& riga_codart = row->get(0);
 | |
|           TString query;
 | |
|           query << "USE CODCORR";
 | |
|           query << "\nSELECT CODARTALT=#CODARTALT";
 | |
|           query << "\nFROM CODART=#CODART";
 | |
|           query << "\nTO CODART=#CODART";
 | |
|           TISAM_recordset recset(query);
 | |
|           recset.set_var("#CODARTALT", selected_codart);
 | |
|           recset.set_var("#CODART", riga_codart);
 | |
|           const int items = recset.items();
 | |
|           //usando la chiave 1 -> items puo' essere 1 o 0 per ogni riga dello sheet
 | |
|           if (items == 1)
 | |
|           {
 | |
|             if (found < 0)
 | |
|               found = r;
 | |
|             else
 | |
|             {
 | |
|               error_box(FR("Il codice %s puo' riferirsi alle righe %d e %d!\nRisolvere l'ambiguita' in anagrafica articoli."), 
 | |
|                        (const char*)selected_codart, found + 1, r + 1);
 | |
|               found = -1;
 | |
|               non_esiste = false;
 | |
|               break;
 | |
|             }
 | |
|           } //if(items==1...
 | |
|         } //FOR_EACH_SHEET_ROW(sf_righe,...
 | |
|       } //if(found<0...
 | |
| 
 | |
|       //ha trovato l'articolo nello sheet e si posiziona sulla sua riga
 | |
|       if (found >= 0)
 | |
|       {
 | |
|         _riga_da_selezionare = found;
 | |
|       }
 | |
|       else  //se non l'ha trovato -> segnala che l'articolo selezionato non esiste nello sheet
 | |
|       {
 | |
|         if (non_esiste)
 | |
|           error_box(TR("L'articolo %s selezionato non esiste nella lista"), (const char*)selected_codart);
 | |
|       }
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|   case DLG_PRINT:
 | |
|     if (e == fe_button)
 | |
|     {
 | |
|       TConsumi_report cr;
 | |
|       cr.mask2report(*this);
 | |
|       TReport_book book;
 | |
|       book.add(cr);
 | |
|       book.print_or_preview();
 | |
|       ok = false; // Non uscire
 | |
|     }
 | |
|     break;
 | |
| 	case DLG_PRINTDOC:
 | |
|     if (e == fe_button)
 | |
|     {
 | |
|       TString query;
 | |
|       
 | |
| 			query << "USE 33 ";
 | |
| 			if (_doc_filter.full())
 | |
| 				query << "SELECT " << _doc_filter; // CODCMS=#CODCMS\n"
 | |
| 			query <<  "\n"
 | |
|             << "JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF\n"
 | |
|             << "FROM PROVV=D ANNO=#ANNO CODNUM=#CODNUM\n"
 | |
|             << "TO PROVV=D ANNO=#ANNO CODNUM=#CODNUM";
 | |
|       TISAM_recordset rset(query);
 | |
|       rset.set_var("#CODCMS", TVariant(get(F_CDCT)));
 | |
|       rset.set_var("#ANNO",   TVariant(get(F_ANNO)));
 | |
|       rset.set_var("#CODNUM", TVariant(get(F_CODNUM)));
 | |
| 
 | |
|       TCursor* c = rset.cursor();
 | |
| 			TCursor_sheet sht(c, " |CODNUM|NDOC|DATADOC|DATACONS|CODCF|20->RAGSOC", TR("Selezione Documenti"),
 | |
| 		                    HR("@1|Ordine@6|Numero\nDoc.@7|Data\nDoc.@10|Data\nConsegna@10|Fornitore|Ragione Sociale@50"),0,1);
 | |
| 			sht.uncheck(-1);
 | |
| 
 | |
| 			if (sht.run() && sht.one_checked())
 | |
| 			{
 | |
| 				const int items = c->items();
 | |
| 				for (*c = 0L; c->pos() < items; ++(*c)) if (sht.checked(c->pos()))
 | |
| 				  capp().print_doc(c->curr());
 | |
| 
 | |
|         update_sheet();
 | |
|         update_documents();
 | |
| 			}
 | |
|       ok = false; // Non uscire
 | |
|     }
 | |
| 		break;
 | |
| 	case DLG_DELREC:
 | |
|     if (e == fe_button)
 | |
|     {
 | |
|       TString query;
 | |
| 			TString select;
 | |
| 
 | |
|       query << "USE 33";
 | |
| 			if (_doc_filter.full())
 | |
| 				select << "(" << _doc_filter << ')'; // CODCMS=#CODCMS\n"
 | |
| 			if (_days_interval > 0)
 | |
| 			{
 | |
| 				TDate datalim(TODAY);
 | |
| 				datalim -= _days_interval;
 | |
| 				if (select.full())
 | |
|           select << "&&";
 | |
| 			  select  << "(STR(NUM(ANSI(DATADOC))>" << datalim.date2ansi() << "))";
 | |
| 			}
 | |
| 			if (select.full())
 | |
| 				query << " SELECT " << select;
 | |
| 			query <<  "\n"
 | |
|             << "JOIN 20 INTO TIPOCF==TIPOCF CODCF==CODCF\n"
 | |
|             << "FROM PROVV=D ANNO=#ANNO CODNUM=#CODNUM\n"
 | |
|             << "TO PROVV=D ANNO=#ANNO CODNUM=#CODNUM";
 | |
|       TISAM_recordset rset(query);
 | |
|       rset.set_var("#CODCMS", TVariant(get(F_CDCT)));
 | |
|       rset.set_var("#ANNO",   TVariant(get(F_ANNO)));
 | |
|       rset.set_var("#CODNUM", TVariant(get(F_CODNUM)));
 | |
| 
 | |
|       TCursor* c = rset.cursor();
 | |
| 			TCursor_sheet sht(c, " |CODNUM|NDOC|DATADOC|DATACONS|CODCF|20->RAGSOC", TR("Selezione Documenti"),
 | |
| 		                    HR("@1|Ordine@6|Numero\nDoc.@7|Data\nDoc.@10|Data\nConsegna@10|Fornitore|Ragione Sociale@50"),0,1);
 | |
| 			sht.uncheck(-1);
 | |
| 			if (sht.run() && sht.one_checked() && yesno_box("Si desidera cancellare %d documenti", sht.checked()))
 | |
| 			{
 | |
| 				const int items = c->items();
 | |
| 				c->freeze();
 | |
| 				for (*c = 0; c->pos() < items; ++(*c)) if (sht.checked(c->pos()))
 | |
| 				{
 | |
|           TDocumento doc(c->curr());
 | |
| 					reconstruction(doc); // funzione che ricostruisce la situazione precedente al documento
 | |
|           doc.remove();
 | |
| 				}
 | |
|         update_sheet();
 | |
|         update_documents();
 | |
| 			}
 | |
|       ok = false; // Non uscire
 | |
|     }
 | |
|     break;
 | |
| 	case DLG_OK:
 | |
| 		if (e == fe_button && jolly == 0)
 | |
| 		{
 | |
| 			capp().generate_orders();
 | |
|       update_documents();
 | |
| 			update_sheet();
 | |
| 			ok = false;
 | |
| 		}
 | |
| 		break;
 | |
| 	case DLG_ELABORA:
 | |
| 		if (e == fe_button && jolly == 0)
 | |
| 		{
 | |
| 			capp().generate_carics();
 | |
|       update_documents();
 | |
| 			update_sheet();
 | |
| 			ok = false;
 | |
| 		}
 | |
| 		break;
 | |
|   default:
 | |
|     if (o.is_kind_of(CLASS_SHEET_FIELD))
 | |
| 		  ok = on_sheet_event(o, e, jolly);
 | |
|     break;
 | |
|   }
 | |
|   return ok;
 | |
| }
 | |
| 
 | |
| void TGenera_ordini_mask::serialize(bool bSave)
 | |
| {
 | |
|   const char* const defpar = "or";
 | |
|   TConfig ini(CONFIG_DITTA, defpar);
 | |
|   for (int i = fields()-1; i >= 0; i--)
 | |
|   {
 | |
|     TMask_field& f = fld(i);
 | |
|     const TFieldref* fr = f.field();
 | |
|     if (fr != NULL)
 | |
|     {
 | |
|       if (bSave)
 | |
|         fr->write(ini, defpar, f.get());
 | |
|       else
 | |
|         f.set(fr->read(ini, defpar));
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void TGenera_ordini_mask::load_user_defs()
 | |
| {
 | |
|   const char* const defpar = "or";
 | |
|   TConfig ini(CONFIG_USER, defpar);
 | |
|   for (int i = fields()-1; i >= 0; i--)
 | |
|   {
 | |
|     TMask_field& f = fld(i);
 | |
|     const TFieldref* fr = f.field();
 | |
|     if (fr != NULL)
 | |
|     {
 | |
|       const char * val = fr->read(ini, defpar);
 | |
| 			if (*val)
 | |
| 			{
 | |
| 	      f.set(val);
 | |
| 				f.disable();
 | |
| 			}
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| void TGenera_ordini_mask::on_idle()
 | |
| {
 | |
|   TAutomask::on_idle();
 | |
|   if (_riga_da_selezionare >= 0)
 | |
|   {
 | |
|     TString msg;
 | |
|     msg << "Vado alla riga " << _riga_da_selezionare;
 | |
|     xvtil_statbar_set(msg);
 | |
|     //si posiziona sulla qta
 | |
|     TSheet_field& sf_righe = sfield(F_ARTICLES);
 | |
|     sf_righe.set_focus();
 | |
|     sf_righe.select(_riga_da_selezionare, true);
 | |
|     _riga_da_selezionare = -1;
 | |
|   }
 | |
| 
 | |
|   //si riposiziona sul campo selezionatore resettandolo in modo da perdere il precedente articolo
 | |
|   if (_campo_da_selezionare > 0)
 | |
|   {
 | |
|     TEdit_field& cc = efield(_campo_da_selezionare);
 | |
|     _campo_da_selezionare = -1;
 | |
|     cc.reset();
 | |
|     cc.set_focus();
 | |
|   }
 | |
| }
 | |
| 
 | |
| TGenera_ordini_mask::TGenera_ordini_mask() 
 | |
|                    : TAutomask("ps0430300a"), _filter_changed(false), _order_changed(false)
 | |
| {
 | |
|   serialize(false);
 | |
| 	load_user_defs();
 | |
| 	
 | |
|   TConfig c(CONFIG_DITTA, "or");
 | |
| 	_anamag_query = c.get("OR14_QUERY");
 | |
| 	if (_anamag_query.blank())
 | |
|   {
 | |
| 		_anamag_query =  "USE ANAMAG KEY 2\nJOIN UMART INTO CODART==CODART NRIGA==1";
 | |
|     _anamag_query << "\nJOIN CLIFO INTO TIPOCF==\"F\" CODCF==CODFORN";
 | |
|   }
 | |
| 	else
 | |
| 		_anamag_query = esc(_anamag_query);
 | |
| 
 | |
| 	_disable_num = esc(c.get("OR14_DISNUM"));
 | |
| 	_disable_expr = esc(c.get("OR14_DISABLE"));
 | |
| 	_dis.set(_disable_expr);
 | |
| 
 | |
| 	_doc_filter = c.get("OR14_FILTER");
 | |
|   if (_doc_filter.empty() && !field(F_CDCT).empty())
 | |
|     _doc_filter = "CODCMS=#CODCMS";                   // Utile al Cigno
 | |
| 
 | |
| 	_days_interval = c.get_int("OR14_DAYS");
 | |
| 	TSheet_field& sh = sfield(F_ARTICLES);
 | |
| 	TMask& sh_mask = sh.sheet_mask();
 | |
| 	TString prompt;
 | |
|   
 | |
| 	for (int i = 1; i <= 10; i++)
 | |
|   {                  
 | |
|     const int col = sh.cid2index(SA_USER1 + i -1);
 | |
|     TEditable_field & f = sh_mask.efield(SA_USER1 + i - 1);            
 | |
| 		
 | |
| 		if (c.get_bool("CHK_USER", "ve", i)	&& c.get_bool("USERDEF", "or", i))
 | |
|     {  
 | |
|       prompt = c.get("PROMPT_USER", "ve", i);
 | |
|       prompt.rpad(20);              
 | |
| 			f.set_prompt(prompt);
 | |
| 			sh.set_column_header(col, prompt);
 | |
|     }
 | |
| 		else
 | |
| 		{
 | |
| 			f.hide();
 | |
| 			sh.delete_column(col);
 | |
| 		}
 | |
|   }
 | |
| 
 | |
|   //resetta l'indicatore di riga da selezionare
 | |
|   _riga_da_selezionare = -1;
 | |
|   _campo_da_selezionare = -1;
 | |
| }
 | |
| 
 | |
| TGenera_ordini_mask::~TGenera_ordini_mask()
 | |
| {
 | |
| //  serialize(true);
 | |
| }
 | |
| 
 | |
| ///////////////////////////////////////////////////////////
 | |
| // TCreazione_ordini
 | |
| ///////////////////////////////////////////////////////////
 | |
| 
 | |
| bool TCreazione_ordini::create()
 | |
| {
 | |
|   open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_DESLIN, LF_CODCORR,
 | |
|              LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, LF_MOV, LF_STOMAG, 
 | |
|              LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
 | |
| 	
 | |
|   TConfig c(CONFIG_DITTA);
 | |
| 	for (int i = 0; i < 10; i++ )
 | |
| 		_userfld.add(c.get("USERFLD", NULL, i + 1), i);
 | |
| 
 | |
|   _mask = new TGenera_ordini_mask;
 | |
| 
 | |
|   return TSkeleton_application::create();
 | |
| }
 | |
| 
 | |
| bool TCreazione_ordini::destroy()
 | |
| {
 | |
|   delete _mask;
 | |
|   return TSkeleton_application::destroy();
 | |
| }
 | |
| 
 | |
| void TCreazione_ordini::print()
 | |
| {
 | |
|   _mask->field(DLG_PRINT).on_hit();
 | |
| }
 | |
| 
 | |
| 
 | |
| void TCreazione_ordini::print_doc(const TRectype & doc)
 | |
| {
 | |
|   const TTipo_documento tipo(doc.get(DOC_TIPODOC));
 | |
|   
 | |
| 	TFilename rep;
 | |
|   tipo.main_print_profile(rep, 0);
 | |
| 
 | |
|   TString cmdline;
 | |
|   if (rep.ends_with("rep", true))  // Esiste il nuovo report :-)
 | |
| 		cmdline = "ve1 -2";
 | |
|   else                             // Esiste il vecchio form :-(
 | |
| 		cmdline = "ve1 -0";
 | |
| 
 | |
|   cmdline << ' ' << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_ANNO) << ' ';
 | |
|   cmdline << doc.get(DOC_PROVV) << ' ' << doc.get(DOC_NDOC) << ' ' << doc.get(DOC_NDOC);
 | |
|   cmdline << " D";
 | |
| 
 | |
|   const int ncopie = tipo.ncopie();
 | |
|   if (ncopie > 0)
 | |
|     cmdline << ' ' << ncopie;
 | |
| 
 | |
|   TExternal_app interattivo( cmdline );
 | |
|   
 | |
| 	interattivo.run();
 | |
| }
 | |
| 
 | |
| void TCreazione_ordini::aggiorna_stato_doc_orig(const TRectype& rdoc)
 | |
| {
 | |
| 	const char provv = rdoc.get_char(RDOC_PROVV);
 | |
| 	const int anno = rdoc.get_int(RDOC_ANNO);
 | |
| 	const TString8 codnum = rdoc.get(RDOC_CODNUM);
 | |
| 	const long ndoc = rdoc.get_long(RDOC_NDOC);
 | |
| 	TDocumento doc_orig(provv, anno, codnum, ndoc);
 | |
| 	if (doc_orig.is_evaso())
 | |
| 	{
 | |
| 	  const char* const defpar = "or";
 | |
| 		TConfig c(CONFIG_USER, defpar);
 | |
| 		const char statoevaso = c.get_char("OR14_STATOEVASO");
 | |
| 		if (statoevaso != ' ')
 | |
| 		{
 | |
| 			doc_orig.stato(statoevaso);
 | |
| 			doc_orig.rewrite();
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| //genera la riga del documento di carico (una sola per chiamata)
 | |
| void TCreazione_ordini::generate_caric_row(const TSheet_field& sf, TToken_string* row, 
 | |
|                                            const real qta, TDocumento* d, TRiga_documento& rdoc, TLocalisamfile& righedoc)
 | |
| {
 | |
| 	const TDate dataord = row->get(sf.cid2index(SD_DATADOC));
 | |
| 	const long ndoc = row->get_long(sf.cid2index(SD_NUMDOC));
 | |
| 	const int nriga = row->get_int(sf.cid2index(SD_NUMRIGA));
 | |
| 	TRectype& rigcar = righedoc.curr();
 | |
| 	rigcar.put(RDOC_PROVV, 'D');
 | |
| 	rigcar.put(RDOC_ANNO, dataord.year());
 | |
| 	rigcar.put(RDOC_CODNUM, _mask->get(F_CODNUM));
 | |
| 	rigcar.put(RDOC_NDOC, ndoc);
 | |
| 	rigcar.put(RDOC_NRIGA, nriga);
 | |
| 	int err = righedoc.read(_isequal, _lock);
 | |
| 	if (err == NOERR)
 | |
| 	{
 | |
| 		d->copy_data(rdoc, rigcar);
 | |
| 		rdoc.put(rdoc.field_qta(), qta);
 | |
| 		rigcar.add(rdoc.field_qtaevasa(), qta);
 | |
| 		if (rigcar.get_real(rdoc.field_qtaevasa()) >= rigcar.get_real(rdoc.field_qta()))
 | |
| 			rigcar.put(RDOC_RIGAEVASA, true);
 | |
| 		rdoc.put(RDOC_DACODNUM, rigcar.get(RDOC_CODNUM));
 | |
| 		rdoc.put(RDOC_DAANNO, rigcar.get(RDOC_ANNO));
 | |
| 		rdoc.put(RDOC_DAPROVV, rigcar.get(RDOC_PROVV));
 | |
| 		rdoc.put(RDOC_DANDOC, rigcar.get(RDOC_NDOC));
 | |
| 		rdoc.put(RDOC_DAIDRIGA, rigcar.get(RDOC_NRIGA));
 | |
| 		err = righedoc.rewrite();
 | |
| 		if (err == NOERR)
 | |
| 			aggiorna_stato_doc_orig(rigcar);
 | |
| 
 | |
| 	}
 | |
| 	if (err != NOERR)
 | |
| 		error_box(FR("Impossibile aggiornare la riga %d del doc. %ld"), nriga, ndoc);
 | |
| }
 | |
| 
 | |
| 
 | |
| //genera la riga del documento ordine (una sola per chiamata)
 | |
| void TCreazione_ordini::generate_order_row(const TSheet_field& sf, TToken_string* row, const real qta, 
 | |
|                                            TDocumento* d, TRiga_documento& rdoc, const TRectype& forn, const TRectype& fornven)
 | |
| {
 | |
|   const TString codart = row->get(sf.cid2index(SA_CODART));
 | |
|   
 | |
|   TString8 codmag = _mask->get(F_MAG);
 | |
|   codmag.right_just(3);
 | |
|   codmag << _mask->get(F_DEP);
 | |
| 
 | |
|   TString8 codmagc = _mask->get(F_MAGC);
 | |
|   codmagc.right_just(3);
 | |
|   codmagc << _mask->get(F_DEPC);
 | |
| 
 | |
|   const bool ultimo_prezzo = _mask->get(F_PREZZO) == "U";
 | |
| 
 | |
|   rdoc.put(RDOC_CODMAG, codmag);
 | |
|   rdoc.put(RDOC_CODMAGC, codmagc);
 | |
|   rdoc.put(RDOC_CODART, codart);
 | |
|   rdoc.put(RDOC_CODARTMAG, codart);
 | |
|   rdoc.put(RDOC_CHECKED, "X");
 | |
|   rdoc.put(RDOC_DESCR, row->get(sf.cid2index(SA_DESCR)));
 | |
| 
 | |
|   const TString descr_agg = row->get(sf.cid2index(SA_DESCRAGG));
 | |
|   if (descr_agg.full())
 | |
|   {
 | |
| 	  rdoc.put(RDOC_DESCLUNGA, "X");
 | |
| 	  rdoc.put(RDOC_DESCEST, descr_agg);
 | |
|   }
 | |
| 
 | |
|   rdoc.put(RDOC_UMQTA, row->get(sf.cid2index(SA_UM)));
 | |
|   rdoc.put(RDOC_QTA, qta);
 | |
| 
 | |
|   const TDate datacons(row->get(sf.cid2index(SA_DATACONS)));
 | |
|   rdoc.put(RDOC_DATACONS, datacons);
 | |
|   
 | |
|   const TRectype& articolo = cache().get(LF_ANAMAG, codart);
 | |
|   TPrice prezzo;
 | |
|   if (ultimo_prezzo)
 | |
| 	  prezzo = articolo.get_real(ANAMAG_ULTCOS1);
 | |
|   else
 | |
| 	  prezzo = articolo.get_real(ANAMAG_COSTSTD);
 | |
| 
 | |
| 	const TString4 codval = forn.get(CLI_CODVAL);  
 | |
|   prezzo.change_value(codval);
 | |
|   rdoc.put(RDOC_PREZZO, prezzo.get_num());
 | |
| 
 | |
|   const TString4 codiva = fornven.get(CFV_ASSFIS);
 | |
|   if (codiva.full())
 | |
| 	  rdoc.put(RDOC_CODIVA, codiva);
 | |
|   else
 | |
| 	  rdoc.put(RDOC_CODIVA, articolo.get(ANAMAG_CODIVA));
 | |
| 
 | |
|   const TString commessa = row->get(sf.cid2index(SA_CDC));
 | |
|   const TString fase = row->get(sf.cid2index(SA_FSC));
 | |
|   rdoc.put(RDOC_CODCMS, commessa);
 | |
|   rdoc.put(RDOC_FASCMS, fase);
 | |
|   
 | |
|   for (int i = 0; i < 10 ; i++)
 | |
| 	  if (_userfld.row(i).full())
 | |
| 		  rdoc.put(_userfld.row(i), _mask->get(SA_USER1 + i));
 | |
| 
 | |
|   rdoc.put(RDOC_CODAGG1, row->get(sf.cid2index(SA_CODAGG1)));
 | |
|   rdoc.put(RDOC_CODAGG2, row->get(sf.cid2index(SA_CODAGG2)));
 | |
| }
 | |
| 
 | |
| 
 | |
| //genera la testata del documento di 'C'arico o dell''O'rdine e chiama i metodi per creare le righe..
 | |
| //..di entrambi
 | |
| void TCreazione_ordini::generate_docs_head(const char type, const TSheet_field& sf, 
 | |
|                                            long& minforn, long& maxforn, TAssoc_array& documents)
 | |
| {
 | |
|   TString msg;
 | |
|   TString4 codnum, tipodoc;
 | |
|   TDate datadoc;
 | |
|   TLocalisamfile righedoc(LF_RIGHEDOC);
 | |
| 
 | |
|   switch (type)
 | |
|   {
 | |
|   case 'C':
 | |
|     {
 | |
|       datadoc = _mask->get_date(F_DATADOCCAR);
 | |
| 
 | |
| 	    const char* const defpar = "or";
 | |
| 		  TConfig c(CONFIG_USER, defpar);
 | |
| 		  codnum = c.get("OR14_NUMCAR");
 | |
| 		  tipodoc = c.get("OR14_TIPCAR");
 | |
| 
 | |
|       msg << "Generazione documenti di carico";
 | |
|     }
 | |
|     break;
 | |
|   case 'O':
 | |
|     {
 | |
|       datadoc = _mask->get_date(F_DATADOC);
 | |
| 
 | |
| 	    codnum = _mask->get(F_CODNUM);
 | |
| 	    tipodoc = _mask->get(F_TIPODOC);
 | |
| 
 | |
|       msg << "Generazione ordini";
 | |
|     }
 | |
|     break;
 | |
| 
 | |
|   default:
 | |
|     break;
 | |
|   }
 | |
| 
 | |
|   //parte comune ai casi 'C' ed 'O'
 | |
|   const TTipo_documento tipo(tipodoc);
 | |
|   const TString& commessa_testata = _mask->get(F_CDCT);
 | |
| 	const TString& fase_testata     = _mask->get(F_FSCT);
 | |
| 
 | |
|   TProgind pi(sf.items(), msg, true, true);
 | |
| 
 | |
|   //giro su tutte le righe dello sheet
 | |
|   FOR_EACH_SHEET_ROW(sf, n, row)
 | |
|   {
 | |
|     if (!pi.setstatus(n))
 | |
|       break;
 | |
| 	  if (row->get_char(sf.cid2index(SD_DAEVADERE) == 'X'))
 | |
| 		{
 | |
|       real qta;
 | |
|       TString8 codforn;
 | |
|       TDate datacons; 
 | |
| 
 | |
|       if (type == 'C')
 | |
|       {
 | |
| 			  qta = row->get(sf.cid2index(SD_QTADAEVADERE));
 | |
|         codforn = row->get(sf.cid2index(SD_FORNITORE));
 | |
|         datacons = row->get(sf.cid2index(SD_DATACONS));
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|         qta = row->get(sf.cid2index(SA_QTA));
 | |
|         codforn = row->get(sf.cid2index(SA_FORNITORE));
 | |
|         datacons = row->get(sf.cid2index(SA_DATACONS));
 | |
|       }
 | |
| 
 | |
| 			if (!qta.is_zero())
 | |
| 			{
 | |
|         //dati relativi al fornitore..
 | |
| 			  const long cod = atol(codforn);
 | |
| 			  TString8 key; key.format("F|%ld", cod);
 | |
| 			  const TRectype& forn = cache().get(LF_CLIFO, key);
 | |
|         //..e cfven collegato
 | |
| 			  const TRectype& forven = cache().get(LF_CFVEN, key);
 | |
| 
 | |
|         TDocumento* d = (TDocumento*)documents.objptr(codforn);
 | |
| 				if (d == NULL)
 | |
| 				{
 | |
|           //il documento va creato
 | |
| 					d = new TDocumento('D', datadoc.year(), codnum, 0L);
 | |
| 
 | |
| 					d->put(DOC_TIPODOC, tipodoc);
 | |
| 					d->put(DOC_TIPOCF, "F");
 | |
| 					d->put(DOC_CODCF, codforn);
 | |
| 					d->put(DOC_DATADOC, datadoc);
 | |
| 					d->put(DOC_DATACONS, datacons);
 | |
| 					d->put(DOC_CODVAL, forn.get(CLI_CODVAL));
 | |
| 					d->put(DOC_CODLIN, forn.get(CLI_CODLIN));
 | |
| 					d->put(DOC_CODPAG, forn.get(CLI_CODPAG));
 | |
| 					d->put(DOC_CODABIA, forn.get(CLI_CODABI));
 | |
| 					d->put(DOC_CODCABA, forn.get(CLI_CODCAB));
 | |
| 					d->put(DOC_IBAN, forn.get(CLI_IBAN));
 | |
| 					d->put(DOC_CODABIP, forven.get(CFV_CODABIPR));
 | |
| 					d->put(DOC_CODCABP, forven.get(CFV_CODCABPR));
 | |
| 					d->put(DOC_RAGGR, forven.get(CFV_RAGGDOC));
 | |
| 					d->put(DOC_RAGGREFF, forven.get(CFV_RAGGEFF));
 | |
| 					d->put(DOC_CODINDSP, forven.get(CFV_CODINDSP));
 | |
| 					d->put(DOC_CODAG, forven.get(CFV_CODAG));
 | |
| 					d->put(DOC_ZONA, forven.get(CFV_CODZONA));
 | |
| 					d->put(DOC_CODSPMEZZO, forven.get(CFV_CODSPMEZZO));
 | |
| 					d->put(DOC_CODPORTO, forven.get(CFV_CODPORTO));
 | |
| 					d->put(DOC_CODNOTESP1, forven.get(CFV_CODNOTESP1));
 | |
| 					d->put(DOC_CODNOTESP2, forven.get(CFV_CODNOTESP2));
 | |
| 					d->put(DOC_CODNOTE, forven.get(CFV_CODNOTE));
 | |
| 					d->put(DOC_CODVETT1, forven.get(CFV_CODVETT1));
 | |
| 					d->put(DOC_CODVETT2, forven.get(CFV_CODVETT2));
 | |
| 					d->put(DOC_CODVETT3, forven.get(CFV_CODVETT3));
 | |
| 					d->put(DOC_PERCSPINC, forven.get(CFV_PERCSPINC));  
 | |
| 					d->put(DOC_ADDBOLLI, forven.get(CFV_ADDBOLLI));
 | |
| 					d->put(DOC_CATVEN, forven.get(CFV_CATVEN));
 | |
| 					d->put(DOC_CODLIST, forven.get(CFV_CODLIST));
 | |
| 					d->put(DOC_CODCMS, commessa_testata);
 | |
| 					if (type == 'O')
 | |
| 					  d->put(DOC_NOTE, _mask->get(F_NOTE));
 | |
| 
 | |
| 					const TString& causmag = tipo.caus_mov();
 | |
| 					d->put(DOC_CAUSMAG, causmag);
 | |
| 					
 | |
| 					documents.add(codforn, d);
 | |
| 					if (cod < minforn)
 | |
| 						minforn = cod;
 | |
| 					if (cod > maxforn)
 | |
| 						maxforn = cod;
 | |
| 				} //if (d == NULL)...
 | |
| 
 | |
| 
 | |
|         //generazione righe del documento
 | |
|         TRiga_documento& rdoc = d->new_row("01");
 | |
| 
 | |
|         if (type == 'C')
 | |
|           generate_caric_row(sf, row, qta, d, rdoc, righedoc);
 | |
|         else
 | |
|           generate_order_row(sf, row, qta, d, rdoc, forn, forven);
 | |
| 
 | |
| 
 | |
|       } //if (!qta.is_zero())...
 | |
|     } //if (row->get_char...
 | |
|   } //FOR_EACH_SHEET_ROW(sf, n, row)...
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| //salva i documenti generati
 | |
| void TCreazione_ordini::write_docs(const char tipo, const long& minforn, const long& maxforn, TAssoc_array& documents)
 | |
| {
 | |
|   TString msg;
 | |
|   switch (tipo)
 | |
|   {
 | |
|   case 'C': msg << "Registrazione documenti di carico"; break;
 | |
|   case 'O': msg << "Registrazione ordini"; break;
 | |
|   default:  break;
 | |
|   }
 | |
| 
 | |
|   TProgind pi(documents.items(), msg, true, true);
 | |
|   TString cmdline;
 | |
|   int cnt = 0;
 | |
|   TString8 key;
 | |
|   long mindoc = 0, maxdoc = 0;
 | |
|   for (long cod = minforn; cod <= maxforn; cod++)
 | |
|   {
 | |
| 	  key.format("%ld", cod);
 | |
| 	  TDocumento* d = (TDocumento*)documents.objptr(key);
 | |
| 	  if (d != NULL)
 | |
| 	  {
 | |
|       if (!pi.addstatus(1))
 | |
|         break;
 | |
| 		  if (d->write() == NOERR)
 | |
|       {
 | |
| 				if (cmdline.blank())
 | |
| 				{
 | |
| 					const TTipo_documento& tipo = d->tipo();
 | |
| 					TFilename rep;
 | |
|           tipo.main_print_profile(rep, 0);
 | |
| 
 | |
| 				  if (rep.ends_with("rep", true))  // Esiste il nuovo report :-)
 | |
| 						cmdline = "ve1 -2";
 | |
| 				  else                             // Esiste il vecchio form :-(
 | |
| 						cmdline = "ve1 -0";
 | |
| 				} //if (cmdline.blank())...
 | |
| 		    cnt++;
 | |
|         const long ndoc = d->get_long(DOC_NDOC);
 | |
|         if (mindoc <= 0 || ndoc < mindoc)
 | |
|           mindoc = ndoc;
 | |
|         if (ndoc > maxdoc)
 | |
|           maxdoc = ndoc;
 | |
|       } //if (d->write() == NOERR)...
 | |
| 	  } //if (d != NULL)...
 | |
|   } //for (long cod = minforn; cod <= maxforn; cod++)...
 | |
|   if (yesno_box(TR("Sono stati generati %d documenti:\nSi desidera stamparli ora?"), cnt))
 | |
|   {
 | |
| 	  const TString& codnum = _mask->get(F_CODNUM);
 | |
|     const TDate datadoc(TODAY);
 | |
|     const int anno = datadoc.year();
 | |
|     cmdline << " " << codnum << ' ' << anno << " D " << mindoc << ' ' << maxdoc;
 | |
|     TExternal_app prg(cmdline);
 | |
|     prg.run(true, true, false);
 | |
|   } //if (yesno_box(TR("Sono...
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| void TCreazione_ordini::generate_carics()
 | |
| {
 | |
| 	TSheet_field& sf = _mask->sfield(F_DOCUMENTS);
 | |
| 
 | |
|   long minforn = 999999L;
 | |
| 	long maxforn = 0L;
 | |
|   TAssoc_array carics;
 | |
| 
 | |
|   if (sf.items() > 0)
 | |
|     generate_docs_head('C', sf, minforn, maxforn, carics);
 | |
| 	
 | |
|   if (carics.items() > 0)
 | |
|     write_docs('C', minforn, maxforn, carics);
 | |
| 
 | |
| }
 | |
| 
 | |
| 
 | |
| //genera gli ordini a partire dalle righe articolo sullo sheet F_ARTICLES
 | |
| void TCreazione_ordini::generate_orders()
 | |
| {
 | |
| 	TSheet_field& sf = _mask->sfield(F_ARTICLES);
 | |
| 
 | |
|   long minforn = 999999L;
 | |
| 	long maxforn = 0L;
 | |
|   TAssoc_array orders;
 | |
| 
 | |
|   if (sf.items() > 0)
 | |
|     generate_docs_head('O', sf, minforn, maxforn, orders);
 | |
| 	
 | |
|   if (orders.items() > 0)
 | |
|     write_docs('O', minforn, maxforn, orders);
 | |
| 
 | |
| }
 | |
| 
 | |
| void TCreazione_ordini::main_loop()
 | |
| {
 | |
| 
 | |
| 	KEY tasto = K_ENTER;
 | |
| 	while (tasto == K_ENTER)
 | |
| 		tasto = _mask->run();
 | |
| }
 | |
| 
 | |
| int ps0430300(int argc, char* argv[])
 | |
| {
 | |
|   TCreazione_ordini a;
 | |
|   a.run(argc,argv,TR("Generazione Ordini a fornitore"));
 | |
|   return 0;
 | |
| }
 | |
| 
 |