Files correlati : ve0.exe Ricompilazione Demo : [ ] Commento : Preservato il prezzo nella importazione da file ini (rif. MetaCalabria) git-svn-id: svn://10.65.10.50/branches/R_10_00@21980 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1114 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1114 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <colmask.h>
 | 
						||
#include <execp.h>
 | 
						||
#include <modaut.h>
 | 
						||
#include <recset.h>
 | 
						||
#include <tabutil.h>
 | 
						||
#include <utility.h>
 | 
						||
#include <urldefid.h>
 | 
						||
 | 
						||
#include "ve0100.h"
 | 
						||
#include "veini.h"
 | 
						||
 | 
						||
#include "vepriv.h"
 | 
						||
#include "veuml1.h"
 | 
						||
#include "verig.h"
 | 
						||
#include "velib04.h"
 | 
						||
 | 
						||
#include "sconti.h"
 | 
						||
#include "../mg/anamag.h"
 | 
						||
#include "../mg/mglib.h"
 | 
						||
 | 
						||
TCursor& TMotore_application::get_filtered_cursor() const
 | 
						||
{
 | 
						||
  const TEdit_field& f = _msk->efield(F_NDOC);
 | 
						||
  return *f.browse()->cursor();
 | 
						||
}
 | 
						||
 | 
						||
bool TMotore_application::save_and_new() const
 | 
						||
{
 | 
						||
  bool new_doc = false;
 | 
						||
 | 
						||
  TDocumento_mask & m = edit_mask();
 | 
						||
	if (m.insert_mode())
 | 
						||
	{
 | 
						||
		TDocumento& doc = m.doc();
 | 
						||
		new_doc = doc.codice_numerazione().save_and_new();		
 | 
						||
	}
 | 
						||
  
 | 
						||
  return new_doc;
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::init_query_mode( TMask& m )
 | 
						||
{
 | 
						||
  disable_menu_item(M_FILE_PRINT);
 | 
						||
  disable_menu_item(M_FILE_PREVIEW);
 | 
						||
  disable_menu_item(MENU_ITEM_ID(1));
 | 
						||
 | 
						||
  TEdit_field& cn = _msk->efield(F_CODNUM);
 | 
						||
  
 | 
						||
	if (!lnflag() && cn.empty() && _codnum.full())
 | 
						||
  {
 | 
						||
    cn.set(_codnum);
 | 
						||
    if (_msk->field(F_TIPODOC).empty() && _tipodoc.full())
 | 
						||
    {
 | 
						||
      cn.set_focusdirty(TRUE);
 | 
						||
      cn.on_key(K_TAB);
 | 
						||
      cn.set_dirty(FALSE);
 | 
						||
      _msk->set(F_TIPODOC, _tipodoc, TRUE);
 | 
						||
    }
 | 
						||
  }
 | 
						||
  TEdit_field& n = m.efield(F_NDOC);
 | 
						||
 | 
						||
	if (!n.empty())
 | 
						||
	{
 | 
						||
		if (find(0))
 | 
						||
			modify_mode();
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::init_insert_mode( TMask& m )
 | 
						||
{
 | 
						||
  TDocumento_mask& dm = (TDocumento_mask&)m;
 | 
						||
  TString4 codnum(m.get(F_CODNUM));
 | 
						||
	
 | 
						||
  enable_menu_item(MENU_ITEM_ID(1));
 | 
						||
	dm.reset_father_rows();
 | 
						||
	if (codnum.empty())
 | 
						||
	{
 | 
						||
		TMask * query_mask = get_mask(MODE_QUERY);
 | 
						||
 | 
						||
	  codnum = query_mask->get(F_CODNUM);
 | 
						||
	  m.set(F_CODNUM, codnum);
 | 
						||
	  m.set(F_TIPODOC, query_mask->get(F_TIPODOC));
 | 
						||
	  m.set(F_ANNO, query_mask->get_int(F_ANNO));
 | 
						||
	  m.set(F_PROVV, query_mask->get(F_PROVV));
 | 
						||
	}
 | 
						||
 | 
						||
	const int anno = m.get_int(F_ANNO);
 | 
						||
  const char provv = m.get(F_PROVV)[0];
 | 
						||
  const long numdoc = m.get_long(F_NDOC);
 | 
						||
 | 
						||
  TDocumento& curdo = dm.doc();
 | 
						||
 | 
						||
  curdo.read(provv, anno, codnum, numdoc);
 | 
						||
  curdo.set_tipo(m.get(F_TIPODOC));
 | 
						||
 | 
						||
  const TTipo_documento& tp = curdo.tipo();
 | 
						||
 | 
						||
  const char stato = tp.stato_finale_inserimento();
 | 
						||
  curdo.stato(stato);
 | 
						||
 | 
						||
  _codnum = codnum;
 | 
						||
  _tipodoc = m.get(F_TIPODOC);
 | 
						||
 | 
						||
  m.field(F_CODNUM).set_focusdirty(TRUE);
 | 
						||
  m.field(F_CODNUM).on_key(K_TAB);
 | 
						||
  m.field(F_TIPODOC).set_focusdirty(TRUE);
 | 
						||
  m.field(F_TIPODOC).on_key(K_TAB);
 | 
						||
 | 
						||
	m.set(F_ANNORIF, anno);
 | 
						||
	m.set(F_CODNUMRIF, codnum);
 | 
						||
 | 
						||
  // Giro per supplire alla mancanza di una TMask::set(short id, char c);
 | 
						||
  char str_stato[2] = { stato, '\0' }; 
 | 
						||
  m.set(F_STATO, str_stato);
 | 
						||
  
 | 
						||
  TDate data_doc(TODAY);
 | 
						||
  const bool magic_datadoc = m.field(F_DATADOC).automagic();
 | 
						||
	if (!magic_datadoc)
 | 
						||
	{
 | 
						||
    long ndoc = 0; // unused
 | 
						||
    last_doc(provv, anno, codnum, ndoc, data_doc);
 | 
						||
	}
 | 
						||
  m.set(F_DATADOC, data_doc, 0x1);
 | 
						||
  
 | 
						||
  int pos = m.id2pos( F_DATACAMBIO1);
 | 
						||
  if (pos >= 0 && m.fld(pos).active() && !m.get(F_CODVAL).empty())
 | 
						||
  {
 | 
						||
    m.fld(pos).set(data_doc);
 | 
						||
    m.fld(pos).dirty();
 | 
						||
  }
 | 
						||
 | 
						||
  pos = m.id2pos(F_CAUSMAG);         
 | 
						||
  if (pos >= 0)
 | 
						||
  {
 | 
						||
    m.fld(pos).set(tp.caus_mov());
 | 
						||
    m.fld(pos).dirty();
 | 
						||
  }
 | 
						||
 | 
						||
  tp.set_defaults(m);
 | 
						||
  
 | 
						||
  if (!dm.field(F_CODCF).empty()) // Carica i dati dell'eventuale cliente
 | 
						||
  {
 | 
						||
    curdo.put(DOC_TIPOCF, dm.get(F_TIPOCF));
 | 
						||
    curdo.put(DOC_CODCF, dm.get(F_CODCF));
 | 
						||
    dm.cli2mask(true);
 | 
						||
  }
 | 
						||
 | 
						||
  if (provv == 'P')
 | 
						||
		m.enable(DLG_CONFERMA);
 | 
						||
	else
 | 
						||
		m.disable(DLG_CONFERMA);
 | 
						||
	m.disable(DLG_PRINT);
 | 
						||
  m.disable(DLG_PREVIEW);
 | 
						||
  m.disable(DLG_EMAIL);
 | 
						||
  m.disable(DLG_ELABORA);
 | 
						||
 | 
						||
  TSheet_field& ss = dm.sfield(F_SHEET);
 | 
						||
 
 | 
						||
	if (curdo.tipo().auto_add())
 | 
						||
	{
 | 
						||
		for (int i = 0; i < 10; i++)
 | 
						||
      ss.insert(-1, false, true);
 | 
						||
	}
 | 
						||
	else
 | 
						||
		ss.destroy();
 | 
						||
 | 
						||
  dm.mask2doc();
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::init_modify_mode( TMask& m )
 | 
						||
{             
 | 
						||
  TEdit_field& n = query_mask().efield(F_NDOC);
 | 
						||
 | 
						||
	n.set("");
 | 
						||
	n.update_flags("R");
 | 
						||
	const bool enable_print = edit_mask().doc().tipo().printable();
 | 
						||
	const char provv = m.get(F_PROVV)[0];
 | 
						||
  enable_menu_item(MENU_ITEM_ID(1));
 | 
						||
  if (provv == 'P')
 | 
						||
	{
 | 
						||
		m.enable(DLG_CONFERMA);
 | 
						||
		m.disable(DLG_PRINT);
 | 
						||
	  m.disable(DLG_EMAIL);
 | 
						||
    m.disable(DLG_PREVIEW);
 | 
						||
    enable_menu_item(M_FILE_PRINT, false);
 | 
						||
    enable_menu_item(M_FILE_PREVIEW, false);
 | 
						||
	}
 | 
						||
	else
 | 
						||
	{
 | 
						||
		m.disable(DLG_CONFERMA);
 | 
						||
	  m.enable(DLG_PRINT, enable_print);
 | 
						||
	  m.enable(DLG_EMAIL, enable_print);
 | 
						||
    m.enable(DLG_PREVIEW, enable_print);
 | 
						||
    enable_menu_item(M_FILE_PRINT, enable_print);
 | 
						||
    enable_menu_item(M_FILE_PREVIEW, enable_print);
 | 
						||
	}
 | 
						||
  m.enable(DLG_ELABORA); 
 | 
						||
  m.disable(F_STATO);
 | 
						||
  
 | 
						||
  if (m.id2pos(F_CURGIAC)>0 && m.efield(F_CURGIAC).shown())
 | 
						||
  {
 | 
						||
    cached_article_balances(NULL); // Azzera cache delle giacenze
 | 
						||
    edit_mask().update_giacenza(); // Aggiorna giacenza riga corrente
 | 
						||
  }
 | 
						||
 | 
						||
  TString80 key;
 | 
						||
  key << m.get(F_CODNUM);
 | 
						||
  key << m.get(F_ANNO);
 | 
						||
  key << provv;
 | 
						||
  key << m.get(F_NDOC);
 | 
						||
 | 
						||
  // Non dare messaggi inutili durante la cancellazione automatica
 | 
						||
  if (autodeleting() != 0x3) 
 | 
						||
  {     
 | 
						||
    const bool transaction = is_transaction();
 | 
						||
    const bool no_mod = !transaction && !doc().modificabile();
 | 
						||
    const bool no_del = !doc().cancellabile();
 | 
						||
    if (no_del || no_mod)
 | 
						||
    {
 | 
						||
      if (key != __last_key)
 | 
						||
      { 
 | 
						||
        TString msg;
 | 
						||
        msg.format(FR("Documento non %s%s%s."), (no_mod ? TR("modificabile"):""), 
 | 
						||
                   (no_mod && no_del ? TR(" ne' "):""), (no_del ? TR("cancellabile"):""));
 | 
						||
        xvtil_statbar_set(msg);
 | 
						||
      }
 | 
						||
    }
 | 
						||
    if (no_mod)
 | 
						||
      m.disable(DLG_SAVEREC);
 | 
						||
    if (no_del)
 | 
						||
      m.disable(DLG_DELREC);
 | 
						||
 | 
						||
    if (m.id2pos(F_IBAN_STATO) > 0)
 | 
						||
      m.efield(F_IBAN_STATO).validate(K_TAB); // Decodifica IBAN
 | 
						||
  }   
 | 
						||
  __last_key = key;
 | 
						||
}
 | 
						||
 | 
						||
int TMotore_application::user_function(int index)
 | 
						||
{
 | 
						||
  switch(index)
 | 
						||
  {
 | 
						||
    case 1:
 | 
						||
      break;
 | 
						||
    default:
 | 
						||
      yesnofatal_box("Chiamata ad una procedura utente non definita: %d", index);
 | 
						||
      return NOERR;
 | 
						||
      break;
 | 
						||
  }
 | 
						||
  return NOERR;
 | 
						||
}
 | 
						||
 | 
						||
bool TMotore_application::changing_mask( int mode )
 | 
						||
{
 | 
						||
  static int lastmode = NO_MODE;
 | 
						||
	static TString4 last_tipodoc;
 | 
						||
	const TDocumento & doc = (const TDocumento &) get_relation()->curr();
 | 
						||
	const TString& tipodoc = mode == MODE_QUERY ? EMPTY_STRING : doc.tipo().codice();
 | 
						||
 | 
						||
  const bool change = ( mode != lastmode) || (last_tipodoc != tipodoc);
 | 
						||
  lastmode = mode;
 | 
						||
	last_tipodoc = tipodoc;
 | 
						||
  return change;
 | 
						||
}
 | 
						||
 | 
						||
TMask* TMotore_application::get_mask( int mode )
 | 
						||
{
 | 
						||
  if (mode != MODE_INS && mode != MODE_MOD)
 | 
						||
    return _msk;
 | 
						||
 | 
						||
  TString4 tipodoc = _msk->get(F_TIPODOC); // Prendo il tipo documento dalla maschera di query;
 | 
						||
  if (mode == MODE_MOD)
 | 
						||
    tipodoc = get_relation()->curr().get(DOC_TIPODOC); // Lo prendo dalla relazione (Gelai)
 | 
						||
 | 
						||
  _docmsk = (TDocumento_mask*)_doc_masks.objptr(tipodoc);
 | 
						||
  if (_docmsk == NULL)
 | 
						||
  {
 | 
						||
    _docmsk = new TDocumento_mask(tipodoc); 
 | 
						||
    _doc_masks.add(tipodoc, _docmsk);
 | 
						||
  }
 | 
						||
 | 
						||
  return _docmsk;
 | 
						||
}
 | 
						||
 | 
						||
// Cerca numero e data dell'ultimo documento di una numerazione di un anno
 | 
						||
bool TMotore_application::last_doc(char provv, int anno, const char* codnum,
 | 
						||
                                   long& ndoc, TDate& ddoc) const
 | 
						||
{
 | 
						||
  TRelation rel(LF_DOC);
 | 
						||
  TRectype& curr = rel.curr();
 | 
						||
  curr.put(DOC_PROVV, provv);
 | 
						||
  curr.put(DOC_ANNO, anno);
 | 
						||
	TString cod(codnum); cod.left_just(4, '~');
 | 
						||
  curr.put(DOC_CODNUM, cod);
 | 
						||
  TCursor cur(&rel, "", 1, &curr, &curr);
 | 
						||
  
 | 
						||
  TRecnotype docs = cur.items();
 | 
						||
  bool found = docs > 0;
 | 
						||
 | 
						||
	if (found)
 | 
						||
  {
 | 
						||
    cur = docs-1;
 | 
						||
    ndoc = curr.get_long(DOC_NDOC);
 | 
						||
  	ddoc = curr.get_date(DOC_DATADOC);
 | 
						||
  }
 | 
						||
  else
 | 
						||
  {
 | 
						||
    ndoc = 0;
 | 
						||
    const TDate oggi(TODAY);
 | 
						||
    if (anno < oggi.year())
 | 
						||
      ddoc = TDate(31, 12, anno);
 | 
						||
    else 
 | 
						||
      ddoc = oggi;
 | 
						||
  }
 | 
						||
  return found;
 | 
						||
}
 | 
						||
 | 
						||
const char* TMotore_application::get_next_key( )
 | 
						||
{
 | 
						||
  const TMask& m = curr_mask( );
 | 
						||
  const TCodice_numerazione& cod_num = cached_numerazione(m.get(F_CODNUM));
 | 
						||
  
 | 
						||
  // Se per questa numerazione e' abilitata le numerazione automatica
 | 
						||
  if (cod_num.auto_num())
 | 
						||
  {
 | 
						||
    TDate ddoc; // unused
 | 
						||
    long ndoc = 1;
 | 
						||
    if (last_doc(m.get(F_PROVV)[0], m.get_int(F_ANNO), cod_num.codice(), ndoc, ddoc))
 | 
						||
      ndoc++;
 | 
						||
    else
 | 
						||
      ndoc = 1;
 | 
						||
    return format("%d|%ld", F_NDOC, ndoc);
 | 
						||
  }
 | 
						||
 | 
						||
  return "";
 | 
						||
}
 | 
						||
 | 
						||
int TMotore_application::read( TMask& m )
 | 
						||
{
 | 
						||
	TDocumento_mask& mask = (TDocumento_mask&) m;
 | 
						||
  TRelation_application::read(m);
 | 
						||
 | 
						||
	mask.reset_father_rows();
 | 
						||
 | 
						||
 | 
						||
  doc() = (TDocumento &)_rel->curr();
 | 
						||
	mask.update_father_rows(false);
 | 
						||
 | 
						||
  _codnum = m.get(F_CODNUM);
 | 
						||
  _tipodoc = m.get(F_TIPODOC);
 | 
						||
 | 
						||
  mask.doc2mask();
 | 
						||
 | 
						||
  return NOERR;
 | 
						||
}
 | 
						||
 | 
						||
bool TMotore_application::menu(MENU_TAG mt)
 | 
						||
{             
 | 
						||
  bool ok = true;
 | 
						||
  if (mt == MENU_ITEM_ID(1))
 | 
						||
  {
 | 
						||
    if (_docmsk != NULL)
 | 
						||
			_docmsk->sel_color();
 | 
						||
  }
 | 
						||
  else
 | 
						||
    ok = TRelation_application::menu(mt);
 | 
						||
  return ok;  
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::do_elab( TDocumento& doc )  // C 90
 | 
						||
{
 | 
						||
	const TString16 codelab = doc.tipo().elaborazione();
 | 
						||
 | 
						||
	if (codelab.full())
 | 
						||
	{
 | 
						||
	  TRectype eld = cache().get("%ELD", codelab);
 | 
						||
		if (!eld.empty())
 | 
						||
		{
 | 
						||
			TElaborazione * el = NULL;	
 | 
						||
			switch (eld.get_int("I0"))
 | 
						||
			{
 | 
						||
				case _esterna :
 | 
						||
					el = new TElaborazione_esterna(eld);
 | 
						||
					break;
 | 
						||
				case _consegna_ordini:
 | 
						||
					el = new TConsegna_ordini(eld);
 | 
						||
					break;	
 | 
						||
				case _fatturazione_bolle :
 | 
						||
					el = new TFatturazione_bolle(eld);
 | 
						||
					break;
 | 
						||
				case _contabilizzazione :
 | 
						||
					el = new TContabilizzazione(eld);
 | 
						||
					break;
 | 
						||
				case _copia_documento :
 | 
						||
					el = new TCopia_documento(eld);
 | 
						||
					break;
 | 
						||
				case _generazione_effetti :
 | 
						||
					el = new TGenerazione_effetti(eld);
 | 
						||
					break;
 | 
						||
				case _consuntivazione_produzione :
 | 
						||
					el = new TConsuntivazione_produzione(eld);
 | 
						||
					break;
 | 
						||
				case _contabilizzazione_analitica :
 | 
						||
					el = new TContabilizzazione_analitica(eld);
 | 
						||
					break;
 | 
						||
				default :
 | 
						||
					break;				 
 | 
						||
			}
 | 
						||
			TToken_string tipi;
 | 
						||
			TToken_string stati;
 | 
						||
			
 | 
						||
			el->tipi_stati_iniziali(tipi, stati);
 | 
						||
			if (stati.find(doc.stato()) >= 0)
 | 
						||
			{
 | 
						||
				TDocumento newdoc(doc.get_char(DOC_PROVV), doc.get_int(DOC_ANNO), el->codice_numerazione_finale(), 0L);
 | 
						||
 | 
						||
				TDocumento::copy_data(newdoc.head(), doc.head());
 | 
						||
				newdoc.put(DOC_TIPODOC, el->tipo_finale());
 | 
						||
				newdoc.put(DOC_STATO, el->stato_finale());
 | 
						||
				if (newdoc.tipo().mov_mag())
 | 
						||
					newdoc.put(DOC_CAUSMAG, newdoc.tipo().caus_mov());
 | 
						||
				else
 | 
						||
					newdoc.zero(DOC_CAUSMAG);
 | 
						||
 | 
						||
				TLista_documenti in;	in.add(doc);
 | 
						||
				TLista_documenti out; out.add(newdoc);
 | 
						||
				if (el->elabora(in, out, TDate(TODAY), true))
 | 
						||
				{
 | 
						||
					if (out[0] != newdoc)
 | 
						||
						out.rewrite();
 | 
						||
					if (doc != in[0])
 | 
						||
						doc = in[0];
 | 
						||
				}
 | 
						||
			}
 | 
						||
		}
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
int TMotore_application::write( const TMask& m )  // C 90
 | 
						||
{          
 | 
						||
	TDocumento_mask& mask = (TDocumento_mask&) m;
 | 
						||
  TDocumento& d = (TDocumento&)_rel->curr();
 | 
						||
  d = mask.doc(); // Trasferisce il documento da maschera a record
 | 
						||
 | 
						||
  // Se ho attivato la creazione automatica delle righe allora cancello quelle vuote finali
 | 
						||
  if (d.tipo().auto_add())
 | 
						||
  {
 | 
						||
    for (int r = d.rows(); r > 0; r--) 
 | 
						||
    {
 | 
						||
      const TRiga_documento& dr = d[r];
 | 
						||
      if (dr.get(RDOC_CODART).empty() && dr.get(RDOC_DESCR).empty())
 | 
						||
        d.destroy_row(r);
 | 
						||
      else
 | 
						||
        break;
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
	const int err = TRelation_application::write(m);
 | 
						||
	
 | 
						||
	if (err == NOERR)
 | 
						||
	{
 | 
						||
		do_elab(d);
 | 
						||
		mask.update_father_rows();
 | 
						||
		mask.save_father_rows();
 | 
						||
 | 
						||
    // Stampa immediatamente dopo aver salvato se possibile
 | 
						||
    if (d.codice_numerazione().save_and_new() && d.tipo().printable()) 
 | 
						||
    {
 | 
						||
      const TString& sis = d.tipo().stati_iniziali_stampa();
 | 
						||
      if (sis.find(d.stato()) >= 0)
 | 
						||
		    save_and_print(false, winprinter);
 | 
						||
    }
 | 
						||
	}
 | 
						||
 | 
						||
  return err;
 | 
						||
}
 | 
						||
 | 
						||
int TMotore_application::rewrite( const TMask& m ) // C 90
 | 
						||
{
 | 
						||
  TDocumento& d = (TDocumento &) _rel->curr();
 | 
						||
	TDocumento_mask& mask = (TDocumento_mask&) m;
 | 
						||
 | 
						||
  if (d.bloccato())
 | 
						||
    return NOERR;
 | 
						||
  d = ((TDocumento_mask&)m).doc(); // Trasferisce il documento da maschera a record
 | 
						||
  const int err = TRelation_application::rewrite(m);
 | 
						||
	if (err == NOERR)
 | 
						||
	{
 | 
						||
		do_elab(d);
 | 
						||
		mask.update_father_rows();
 | 
						||
		mask.save_father_rows();
 | 
						||
	}
 | 
						||
	return err;
 | 
						||
}
 | 
						||
 | 
						||
bool TMotore_application::remove() // C 90
 | 
						||
{
 | 
						||
  TDocumento& d = (TDocumento &) _rel->curr();
 | 
						||
 | 
						||
	d.put(DOC_NOTE, "DELETING");
 | 
						||
	do_elab(d);
 | 
						||
  const bool ok = TRelation_application::remove();
 | 
						||
	if (ok)
 | 
						||
		edit_mask().save_father_rows();
 | 
						||
	return ok;
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::on_firm_change()
 | 
						||
{
 | 
						||
  if (_config_ditta != NULL)
 | 
						||
    delete _config_ditta;
 | 
						||
  _config_ditta = new TConfig(CONFIG_DITTA);
 | 
						||
  _doc_masks.destroy();
 | 
						||
	load_auto_reopen_data();
 | 
						||
  TRelation_application::on_firm_change();
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::load_auto_reopen_data()
 | 
						||
{
 | 
						||
	TAssoc_array & auto_reopen_nums = TDocumento_mask::auto_reopen_nums();
 | 
						||
	TAssoc_array & tipidoc_rels = TDocumento_mask::tipidoc_rels();
 | 
						||
	TTable num("%NUM");
 | 
						||
	TTable eld("%ELD");
 | 
						||
 | 
						||
	auto_reopen_nums.destroy();
 | 
						||
	tipidoc_rels.destroy();
 | 
						||
	for (int err = num.first(); err == NOERR; err = num.next())
 | 
						||
	{
 | 
						||
		if (num.get_bool("B7"))
 | 
						||
		{
 | 
						||
			const TString4 codnum = num.get("CODTAB");
 | 
						||
			TCodice_numerazione numeraz(codnum);
 | 
						||
			const int ntipidoc = numeraz.ntipi_doc();
 | 
						||
			TString_array tipi;
 | 
						||
 | 
						||
			for (int k = 0 ; k < ntipidoc; k++)
 | 
						||
				tipi.add(numeraz.tipo_doc(k));
 | 
						||
			auto_reopen_nums.add(codnum, codnum);
 | 
						||
			for (int err1 = eld.first(); err1 == NOERR; err1 = eld.next())
 | 
						||
			{
 | 
						||
				TCopia_documento e(eld.get("CODTAB"));
 | 
						||
				const TTipo_elaborazione tipo = e.tipo();
 | 
						||
 | 
						||
				if (tipo == _consegna_ordini ||
 | 
						||
            tipo == _consuntivazione_produzione)
 | 
						||
				{
 | 
						||
					const TString4 dest_tipo_doc = e.tipo_finale();
 | 
						||
					const char stato_finale = e.stato_finale_doc_iniziale()[0];
 | 
						||
  			
 | 
						||
 | 
						||
					for (int i = 0; i < 10; i++)
 | 
						||
					{
 | 
						||
						TToken_string key(e.tipo_iniziale(i));
 | 
						||
						if (key.blank())
 | 
						||
							break;
 | 
						||
						if (tipi.find(key) >= 0)
 | 
						||
						{
 | 
						||
							key.add(dest_tipo_doc);
 | 
						||
							tipidoc_rels.add(key, new TStati(e.stato_iniziale(i), stato_finale));
 | 
						||
						}
 | 
						||
					}
 | 
						||
				}
 | 
						||
			}
 | 
						||
		}
 | 
						||
	}
 | 
						||
}
 | 
						||
 | 
						||
bool num_filter(const TRelation* r)
 | 
						||
{
 | 
						||
	const TCodice_numerazione & cod_num = cached_numerazione(r->curr().get("CODTAB"));
 | 
						||
 | 
						||
	const int last = cod_num.ntipi_doc();
 | 
						||
	for (int i = 0; i < last; i++ )
 | 
						||
		if (tipodoc_ok(cod_num.tipo_doc(i)))
 | 
						||
			return true;
 | 
						||
	return false;
 | 
						||
}
 | 
						||
 | 
						||
bool TMotore_application::user_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);
 | 
						||
  
 | 
						||
  TISAM_recordset num("USE %NUM");
 | 
						||
 | 
						||
	for (bool ok = num.move_first(); ok; ok = num.move_next())
 | 
						||
		const TCodice_numerazione & n = cached_numerazione(num.get("CODTAB").as_string());
 | 
						||
 | 
						||
  TISAM_recordset tip("USE %TIP");
 | 
						||
 | 
						||
	for (bool ok = tip.move_first(); ok; ok = tip.move_next())
 | 
						||
		const TTipo_documento & n = cached_tipodoc(tip.get("CODTAB").as_string());
 | 
						||
 | 
						||
	_config_ditta = new TConfig(CONFIG_DITTA);
 | 
						||
                                                          
 | 
						||
  // Metto in relazione testata e righe
 | 
						||
  _rel = new TRelation( LF_DOC );
 | 
						||
  _rel->lfile().set_curr(new TDocumento);
 | 
						||
 | 
						||
  _msk = new TMask(query_mask_name());
 | 
						||
  set_search_field(F_NDOC);
 | 
						||
 | 
						||
  _msk->set_handler( F_ANNO, TDocumento_mask::anno_handler );
 | 
						||
  _msk->set_handler( F_CODNUM, TDocumento_mask::num_handler );
 | 
						||
  _msk->set_handler( F_NUMDOCRIF, TDocumento_mask::numdocrif_search_handler );
 | 
						||
  _msk->set_handler( F_RAGSOCSEARCH, TDocumento_mask::ragsoc_search_handler );
 | 
						||
 | 
						||
	const int args = argc() ;
 | 
						||
 | 
						||
	TEdit_field & e = _msk->efield(F_CODNUM);
 | 
						||
	TBrowse * b = e.browse();
 | 
						||
	TEdit_field & edes = _msk->efield(F_DESNUM);
 | 
						||
	TBrowse * bdes = edes.browse();	
 | 
						||
	TCursor * cur = b->cursor();
 | 
						||
	TCursor * descur = bdes->cursor();
 | 
						||
	
 | 
						||
	cur->set_filterfunction(num_filter);
 | 
						||
	descur->set_filterfunction(num_filter);
 | 
						||
 | 
						||
	for (int i = 2; i < args; i++)
 | 
						||
	{
 | 
						||
		const TFixed_string arg(argv(i));
 | 
						||
 | 
						||
		if (arg.starts_with("-def"))
 | 
						||
		{
 | 
						||
			TToken_string str(arg.mid(4), ',');
 | 
						||
      //attenzione: non ridefinire le TString16 in TString4 perch<63> il nome di variabile codnum non c'entra un benemerito..
 | 
						||
      //..cazzo con codnum, ma pu<70> essere una variabile qualunque (compliemti all'astuzia nella scelta del nome)
 | 
						||
			const TString16 codnum(str.get());
 | 
						||
			const TString16 tipodoc(str.get());
 | 
						||
			const TString16 paragraph(str.get());
 | 
						||
 | 
						||
			if (paragraph.blank())
 | 
						||
			{
 | 
						||
				_codnum = codnum;
 | 
						||
				_tipodoc = tipodoc;
 | 
						||
			}
 | 
						||
			else
 | 
						||
			{
 | 
						||
				TConfig c(CONFIG_DITTA, paragraph);
 | 
						||
				_codnum = c.get(codnum);
 | 
						||
				_tipodoc = c.get(tipodoc);
 | 
						||
			}
 | 
						||
		}
 | 
						||
		else
 | 
						||
			if (arg.starts_with("-filt"))
 | 
						||
			{
 | 
						||
				if (b != NULL || bdes != NULL)
 | 
						||
				{
 | 
						||
					TString filter = b->get_filter();
 | 
						||
					if (filter.full())
 | 
						||
					{
 | 
						||
						filter.insert("(");
 | 
						||
						filter << ")&&(" << arg.mid(5) << ")";
 | 
						||
						if (b != NULL)
 | 
						||
							b->set_filter(filter);
 | 
						||
						if (bdes != NULL)
 | 
						||
							bdes->set_filter(filter);
 | 
						||
					}
 | 
						||
					else
 | 
						||
					{
 | 
						||
						const TString newfilter(arg.mid(5));
 | 
						||
						if (b != NULL)
 | 
						||
							b->set_filter(newfilter);
 | 
						||
						if (bdes != NULL)
 | 
						||
							bdes->set_filter(newfilter);
 | 
						||
					}
 | 
						||
				}
 | 
						||
			}
 | 
						||
	}
 | 
						||
 
 | 
						||
	TConfig utente(CONFIG_GUI, app().name().left(2));
 | 
						||
	if (_codnum.blank())
 | 
						||
		_codnum = utente.get("CODNUM");
 | 
						||
	if (_tipodoc.blank())
 | 
						||
		_tipodoc = utente.get("TIPODOC");
 | 
						||
	_docmsk = NULL;
 | 
						||
 | 
						||
	load_auto_reopen_data();
 | 
						||
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
bool TMotore_application::user_destroy( )
 | 
						||
{
 | 
						||
  // Registro l'ultimo tipo documento e l'ultima numerazione
 | 
						||
  TConfig utente( CONFIG_GUI,  app().name().left(2) );
 | 
						||
  utente.set( "CODNUM", _codnum );
 | 
						||
  utente.set( "TIPODOC", _tipodoc );
 | 
						||
 | 
						||
  if (_config_ditta != NULL)
 | 
						||
    delete _config_ditta;
 | 
						||
  // Distruggo la maschera di modifica
 | 
						||
  if ( _msk != NULL )
 | 
						||
    delete _msk;
 | 
						||
 | 
						||
  // Distruggo la relazione
 | 
						||
  delete _rel;
 | 
						||
//  delete _condv;
 | 
						||
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
int TMotore_application::stato_corrente( )
 | 
						||
{
 | 
						||
  return edit_mask().get_int(F_STATO);
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini)
 | 
						||
{
 | 
						||
  // scrive le righe degli sheet associati
 | 
						||
  TString16 defpar;
 | 
						||
  TString str(80);
 | 
						||
  TDocumento_mask &m = (TDocumento_mask &)sheet.mask();
 | 
						||
  int r;
 | 
						||
  
 | 
						||
  for (r = 1; r <= sheet.items(); r++)
 | 
						||
  {
 | 
						||
    defpar.format("%d,%d",LF_RIGHEDOC,r);
 | 
						||
    const TMask * sm = m.riga_mask(r-1);
 | 
						||
    const TToken_string rigar = sheet.row(r-1);
 | 
						||
    for (int sf = 0; sf < sm->fields(); sf++)
 | 
						||
    {
 | 
						||
      TMask_field& campo = sm->fld(sf);
 | 
						||
      if (campo.shown() && campo.field())
 | 
						||
      {
 | 
						||
        // str = sheet.row(r-1).get(sheet.cid2index(campo.dlg()));
 | 
						||
        const short id = campo.dlg();
 | 
						||
        rigar.get(sheet.cid2index(id), str);
 | 
						||
        if (str.empty()) 
 | 
						||
          str = " ";
 | 
						||
        const word field_class = campo.class_id();
 | 
						||
        if (field_class == CLASS_MEMO_FIELD || 
 | 
						||
            field_class == CLASS_ZOOM_FIELD)
 | 
						||
        {             
 | 
						||
          int p;
 | 
						||
          while ((p = str.find('\n', 0)) >= 0)
 | 
						||
          {
 | 
						||
            str.overwrite("\\", p);
 | 
						||
            str.insert("n", p+1);
 | 
						||
          }  
 | 
						||
        }  
 | 
						||
				if (campo.field()->name() == RDOC_PREZZO)
 | 
						||
				{
 | 
						||
					TCodiceIVA c(sm->get(FR_CODIVA));
 | 
						||
					TFieldref l;
 | 
						||
					real prezzo(str);
 | 
						||
					real prezzol;
 | 
						||
 | 
						||
					l = RDOC_PREZZOL;
 | 
						||
					if (m.doc().tipo().calcolo_lordo())
 | 
						||
					{
 | 
						||
						prezzol = prezzo;
 | 
						||
						c.scorpora(prezzo);
 | 
						||
					}
 | 
						||
					else
 | 
						||
						prezzol = c.lordo(prezzo);
 | 
						||
					l.write(ini, defpar, prezzol.string());
 | 
						||
					str = prezzo.string();
 | 
						||
				}
 | 
						||
				campo.field()->write(ini, defpar, str);
 | 
						||
      } 
 | 
						||
			const TRiga_documento &rdoc = m.doc()[r];
 | 
						||
			TFieldref f;
 | 
						||
 | 
						||
			f = RDOC_DACODNUM;
 | 
						||
			f.write(ini, defpar, rdoc.get(RDOC_DACODNUM));
 | 
						||
			f = RDOC_DAANNO;
 | 
						||
			f.write(ini, defpar, rdoc.get(RDOC_DAANNO));
 | 
						||
			f = RDOC_DAPROVV;
 | 
						||
			f.write(ini, defpar, rdoc.get(RDOC_DAPROVV));
 | 
						||
			f = RDOC_DANDOC;
 | 
						||
			f.write(ini, defpar, rdoc.get(RDOC_DANDOC));
 | 
						||
			f = RDOC_DAIDRIGA;
 | 
						||
			f.write(ini, defpar, rdoc.get(RDOC_DAIDRIGA));
 | 
						||
    } 
 | 
						||
  } 
 | 
						||
  for ( ; ; r++)
 | 
						||
  {
 | 
						||
    defpar.format("%d,%d",LF_RIGHEDOC,r);
 | 
						||
    if (ini.set_paragraph(defpar))
 | 
						||
      ini.remove_all();
 | 
						||
    else
 | 
						||
      break;  
 | 
						||
  }
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query)
 | 
						||
{
 | 
						||
  TRelation_application::ini2mask(ini, msk, query); // Default processing
 | 
						||
 | 
						||
  if (query)
 | 
						||
  {     
 | 
						||
    // Dobbiamo riempire il tipo documento per determinare il profilo corretto!     
 | 
						||
    TMask_field& campo = msk.field(F_TIPODOC);
 | 
						||
    TString16 str = campo.field()->read(ini, format("%d", LF_DOC));
 | 
						||
    if (str.empty())
 | 
						||
    {
 | 
						||
      TToken_string key;
 | 
						||
      key.add(msk.get(F_PROVV));
 | 
						||
      key.add(msk.get(F_ANNO));
 | 
						||
      key.add(msk.get(F_CODNUM));
 | 
						||
      key.add(msk.get(F_NDOC));
 | 
						||
      str = cache().get(LF_DOC, key, DOC_TIPODOC);
 | 
						||
    }
 | 
						||
    campo.set(str);
 | 
						||
      
 | 
						||
  }
 | 
						||
  else
 | 
						||
  {
 | 
						||
		TDocumento & d = doc();
 | 
						||
 | 
						||
		d.put(DOC_TIPOCF, msk.get(F_TIPOCF));
 | 
						||
		d.put(DOC_CODCF, msk.get(F_CODCF));
 | 
						||
 | 
						||
		const TCli_for & c = d.clifor(); 
 | 
						||
	  const TRectype & ven_rec = c.vendite();
 | 
						||
 | 
						||
		ini.set_paragraph("33");
 | 
						||
 | 
						||
    if (!ini.exist(DOC_CODVAL))
 | 
						||
		{
 | 
						||
		  const TString4 codval = c.get(CLI_CODVAL);  // Attenzione: Non usare TString& qui!
 | 
						||
      msk.set(F_CODVAL, codval, true);
 | 
						||
      msk.set(F_CODVAL1, codval, true);
 | 
						||
			if (codval.blank())
 | 
						||
				msk.reset(F_CAMBIO);  
 | 
						||
		}
 | 
						||
    if (!ini.exist(DOC_CODLIN))
 | 
						||
      msk.set(F_CODLIN, c.get(CLI_CODLIN), true);
 | 
						||
    if (!ini.exist(DOC_CODPAG))
 | 
						||
			msk.set(F_CODPAG, c.get(CLI_CODPAG), true);
 | 
						||
    if (!ini.exist(DOC_CODABIA))
 | 
						||
	    msk.set(F_CODABIA, c.get(CLI_CODABI), true);
 | 
						||
    if (!ini.exist(DOC_CODCABA))
 | 
						||
		  msk.set(F_CODCABA, c.get(CLI_CODCAB), true);
 | 
						||
    if (!ini.exist(DOC_IBAN))
 | 
						||
    {
 | 
						||
      const TString & iban = c.get(CLI_IBAN);
 | 
						||
 | 
						||
      msk.set(F_IBAN, iban, true);
 | 
						||
      if (iban.not_empty())
 | 
						||
      {
 | 
						||
        msk.set(F_IBAN_STATO, iban.left(2));
 | 
						||
        msk.set(F_IBAN_CHECK, iban.mid(2,2));
 | 
						||
        msk.set(F_BBAN      , iban.mid(4));
 | 
						||
        msk.set(F_BBAN_CIN  , iban.mid(4,1));
 | 
						||
        msk.set(F_BBAN_ABI  , iban.mid(5,5));
 | 
						||
        msk.set(F_BBAN_CAB  , iban.mid(10,5));
 | 
						||
        msk.set(F_BBAN_CONTO, iban.mid(15,12));
 | 
						||
      }
 | 
						||
    }
 | 
						||
    // Setta i campi che appartengono al file LF_CFVEN
 | 
						||
    if (!ini.exist(DOC_CODABIP))
 | 
						||
			msk.set(F_CODABIP, ven_rec.get(CFV_CODABIPR), true);
 | 
						||
    if (!ini.exist(DOC_CODCABP))
 | 
						||
	    msk.set(F_CODCABP, ven_rec.get(CFV_CODCABPR), true);
 | 
						||
    if (!ini.exist(DOC_RAGGR))
 | 
						||
	    msk.set(F_RAGGR, ven_rec.get(CFV_RAGGDOC));
 | 
						||
    if (!ini.exist(DOC_RAGGREFF))
 | 
						||
	    msk.set(F_RAGGREFF, ven_rec.get(CFV_RAGGEFF));
 | 
						||
    if (!ini.exist(DOC_CODINDSP))
 | 
						||
	    msk.set(F_CODINDSP, ven_rec.get(CFV_CODINDSP), true);
 | 
						||
    if (!ini.exist(DOC_CODAG))
 | 
						||
			msk.set(F_CODAG, ven_rec.get(CFV_CODAG));
 | 
						||
    if (!ini.exist(DOC_CODAGVIS))
 | 
						||
			msk.set(F_CODAGVIS, ven_rec.get(CFV_CODAG1));
 | 
						||
    if (!ini.exist(DOC_CODSPMEZZO))
 | 
						||
			msk.set(F_CODSPMEZZO, ven_rec.get(CFV_CODSPMEZZO), true);
 | 
						||
    if (!ini.exist(DOC_CODPORTO))
 | 
						||
	    msk.set(F_CODPORTO, ven_rec.get(CFV_CODPORTO), true);
 | 
						||
    if (!ini.exist(DOC_CODNOTESP1))
 | 
						||
			msk.set(F_CODNOTESP1, ven_rec.get(CFV_CODNOTESP1), true);
 | 
						||
    if (!ini.exist(DOC_CODNOTESP2))
 | 
						||
			msk.set(F_CODNOTESP2, ven_rec.get(CFV_CODNOTESP2), true);
 | 
						||
    if (!ini.exist(DOC_CODNOTE))
 | 
						||
			msk.set(F_CODNOTE, ven_rec.get(CFV_CODNOTE), true);
 | 
						||
    if (!ini.exist(DOC_CODVETT1))
 | 
						||
			msk.set(F_CODVETT1, ven_rec.get(CFV_CODVETT1), true);
 | 
						||
    if (!ini.exist(DOC_CODVETT2))
 | 
						||
			msk.set(F_CODVETT2, ven_rec.get(CFV_CODVETT2), true);
 | 
						||
    if (!ini.exist(DOC_CODVETT3))
 | 
						||
			msk.set(F_CODVETT3, ven_rec.get(CFV_CODVETT3), true);
 | 
						||
    if (!ini.exist(DOC_PERCSPINC))
 | 
						||
			msk.set(F_SPESEINC, ven_rec.get(CFV_PERCSPINC));  
 | 
						||
    if (!ini.exist(DOC_ADDBOLLI))
 | 
						||
			msk.set(F_ADDBOLLI, ven_rec.get(CFV_ADDBOLLI));
 | 
						||
    if (!ini.exist(DOC_CATVEN))
 | 
						||
			msk.set(F_CATVEN, ven_rec.get(CFV_CATVEN), false);
 | 
						||
    if (!ini.exist(DOC_ZONA))
 | 
						||
			msk.set(F_CODZON, ven_rec.get(CFV_CODZONA), true);
 | 
						||
    if (!ini.exist(DOC_CODLIST))
 | 
						||
			msk.set(F_CODLIST, ven_rec.get(CFV_CODLIST), true);              
 | 
						||
  
 | 
						||
    TSheet_field& f = msk.sfield(F_SHEET);
 | 
						||
    
 | 
						||
    TTipo_riga_documento tr;
 | 
						||
 | 
						||
    // Scorre tutti i paragrafi delle righe documento
 | 
						||
    const TMaskmode oldmode= (TMaskmode)msk.mode();  
 | 
						||
 | 
						||
    msk.set_mode(MODE_MOD);  
 | 
						||
    for (int i = 1; ini.set_paragraph(format("%d,%d", LF_RIGHEDOC, i)); i++)
 | 
						||
    {                    
 | 
						||
      if (i == 1) // Se trovo almeno una riga allora cancello tutto, poi aggiungo le righe
 | 
						||
      {
 | 
						||
        f.destroy();
 | 
						||
        doc().destroy_rows(); 
 | 
						||
      }
 | 
						||
    
 | 
						||
      // Considera solo i tipi riga validi
 | 
						||
      const TString16 tipo(ini.get(RDOC_TIPORIGA));
 | 
						||
      if (tr.read(tipo) == NOERR)
 | 
						||
      {
 | 
						||
        // Crea una nuova riga documento
 | 
						||
        TRiga_documento& rec = doc().new_row(tipo);
 | 
						||
        // Riempie i campi della nuova riga
 | 
						||
        TAssoc_array& var = ini.list_variables();
 | 
						||
        FOR_EACH_ASSOC_STRING(var, obj, key, val)
 | 
						||
        {
 | 
						||
          if (*val == '"' || *val == '\'')
 | 
						||
          {
 | 
						||
            const int len = strlen(val);
 | 
						||
            *(char*)(val+len-1) = '\0';
 | 
						||
            val++;
 | 
						||
          }
 | 
						||
          
 | 
						||
          if (xvt_str_compare_ignoring_case(key, RDOC_DESCR) == 0)   // Trattamento speciale per la descrizione qui verificare
 | 
						||
          {
 | 
						||
            TString s = esc(val); s.rtrim();
 | 
						||
            int split_pos = s.find('\n');
 | 
						||
            const int descr_len = rec.length(RDOC_DESCR);
 | 
						||
            if (split_pos < 0 && s.len() > descr_len)
 | 
						||
              split_pos = descr_len;
 | 
						||
            if (split_pos > descr_len)
 | 
						||
              split_pos = descr_len;
 | 
						||
            if (split_pos > 0)
 | 
						||
            {
 | 
						||
              rec.put(RDOC_DESCR, s.left(split_pos));
 | 
						||
              rec.put(RDOC_DESCLUNGA, "X");
 | 
						||
              rec.put(RDOC_DESCEST, s.mid(split_pos));
 | 
						||
            }
 | 
						||
            else
 | 
						||
            {
 | 
						||
              rec.put(RDOC_DESCR, s);
 | 
						||
              rec.zero(RDOC_DESCLUNGA);
 | 
						||
              rec.zero(RDOC_DESCEST);
 | 
						||
            }
 | 
						||
    
 | 
						||
          }
 | 
						||
          else
 | 
						||
            if (xvt_str_compare_ignoring_case(key, RDOC_NRIGA) != 0)   // Ignora il numero riga ..
 | 
						||
              if (xvt_str_compare_ignoring_case(key, RDOC_TIPORIGA) != 0)   // ... ed il tipo riga
 | 
						||
                rec.put(key, val);        
 | 
						||
        }
 | 
						||
 | 
						||
        // solo la insert chiama la post_insert necessaria alla disabilitazione verifichiamo
 | 
						||
        // l'autoload ??
 | 
						||
        f.insert(-1, FALSE);
 | 
						||
        // Aggiunge la riga allo sheet
 | 
						||
        
 | 
						||
        const bool checked = rec.get_bool(RDOC_CHECKED);
 | 
						||
 | 
						||
        if (checked) 
 | 
						||
        {
 | 
						||
          const TString& codart = rec.get(RDOC_CODARTMAG);
 | 
						||
 | 
						||
          if (codart.full())
 | 
						||
          {
 | 
						||
            const TRectype& art = cache().get(LF_ANAMAG, codart);
 | 
						||
            if (art.empty())
 | 
						||
            {
 | 
						||
              error_box(FR("Articolo non valido sulla riga %d: %s"), i, (const char*)codart);
 | 
						||
              rec.zero(RDOC_CODARTMAG);
 | 
						||
            }
 | 
						||
          }
 | 
						||
        }
 | 
						||
				else
 | 
						||
				{
 | 
						||
					if (!ini.exist(RDOC_DESCR))
 | 
						||
					{
 | 
						||
						const TString& codart = rec.get(RDOC_CODARTMAG);
 | 
						||
						if (codart.full())
 | 
						||
						{
 | 
						||
							const TRectype& art = cache().get(LF_ANAMAG, codart);
 | 
						||
 | 
						||
              rec.put(RDOC_DESCR, art.get(ANAMAG_DESCR));
 | 
						||
							rec.put(RDOC_CODIVA, art.get(ANAMAG_CODIVA));
 | 
						||
						}
 | 
						||
						rec.put(RDOC_CHECKED, "X");
 | 
						||
					}
 | 
						||
				}
 | 
						||
 | 
						||
		    if (!ini.exist(RDOC_CODIVA) && !(rec.is_descrizione() || rec.is_sconto() || rec.is_sconto_perc()))
 | 
						||
				{
 | 
						||
					const TString4 codiva = ((TDocumento_mask &) msk).doc().codesiva();
 | 
						||
 | 
						||
					if (codiva.full())
 | 
						||
						rec.put(RDOC_CODIVA, codiva);
 | 
						||
				}
 | 
						||
        rec.autoload(f);
 | 
						||
        f.check_row(f.items() - 1, 0x2);
 | 
						||
 | 
						||
        if (!checked)     //se non e' checked, il record viene autosalvato (in modo che sia salvato completamente)
 | 
						||
				{
 | 
						||
					const TString & prezzo = ini.get(RDOC_PREZZO);
 | 
						||
					if (prezzo.full())
 | 
						||
						f.row(f.items() - 1).add(prezzo, f.cid2index(FR_PREZZO));
 | 
						||
					rec.autosave(f);
 | 
						||
				}
 | 
						||
      }
 | 
						||
    }
 | 
						||
    msk.set_mode(oldmode);  
 | 
						||
  }
 | 
						||
}
 | 
						||
 | 
						||
bool TMotore_application::save_and_print(bool savedoc, TPrtype mode)
 | 
						||
{
 | 
						||
  if (savedoc)
 | 
						||
	{
 | 
						||
    if (save(false))
 | 
						||
  		edit_mask().update_father_rows(false);
 | 
						||
    else
 | 
						||
      return false;
 | 
						||
  }
 | 
						||
 | 
						||
  TDocumento& doc = (TDocumento&)get_relation()->curr();
 | 
						||
 
 | 
						||
  const TTipo_documento& tipo = doc.tipo();
 | 
						||
  TFilename rep; 
 | 
						||
 | 
						||
  int filter = has_module(RSAUT) ? 2 : 1;
 | 
						||
  while (filter > 0 && !tipo.main_print_profile(rep, filter))
 | 
						||
    filter--;
 | 
						||
 | 
						||
  if (filter > 0)
 | 
						||
  {
 | 
						||
    const bool da_stampare = doc.stampabile();
 | 
						||
 | 
						||
    TString commandline;
 | 
						||
    commandline = "ve1 -";
 | 
						||
    if (filter == 2)     
 | 
						||
      commandline << 2;      // Esiste il nuovo report :-)
 | 
						||
    else                           
 | 
						||
      commandline << 0;      // Esiste il vecchio form :-(
 | 
						||
  
 | 
						||
    commandline << ' ' << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_ANNO) 
 | 
						||
                << ' ' << doc.get(DOC_PROVV) << ' ' << doc.get(DOC_NDOC) << ' ';
 | 
						||
    switch (mode)
 | 
						||
    {
 | 
						||
    case exportprinter: commandline << " E"; break;
 | 
						||
    case fileprinter  : commandline << " P"; break;
 | 
						||
    case screenvis    : commandline << " A"; break;
 | 
						||
    default           : commandline << " S"; break;
 | 
						||
    }
 | 
						||
    commandline << ' ' << (da_stampare ? 'D' : 'P');
 | 
						||
 | 
						||
    const int ncopie = tipo.ncopie();
 | 
						||
    if (ncopie > 0)
 | 
						||
      commandline << ' ' << ncopie;
 | 
						||
 | 
						||
    TExternal_app interattivo( commandline );
 | 
						||
    if (interattivo.run() == NOERR)
 | 
						||
    {
 | 
						||
      if (da_stampare) // Aggiorna stato documento se necessario
 | 
						||
      {	
 | 
						||
        TDocumento_mask& m = edit_mask();
 | 
						||
        TDocumento& maindoc = m.doc();
 | 
						||
        maindoc.read(); // Aggiorna STATO e MOVMAG generati da ve1
 | 
						||
 | 
						||
        // Lo stato del documento vive di vita propria
 | 
						||
        const char sfs = maindoc.tipo().stato_finale_stampa();
 | 
						||
        maindoc.stato(sfs);
 | 
						||
        const char str_sfs[2] = { sfs, '\0' };
 | 
						||
        m.set(F_STATO, str_sfs, true);
 | 
						||
        init_modify_mode(m);
 | 
						||
      }
 | 
						||
    }
 | 
						||
  }
 | 
						||
	else
 | 
						||
	{
 | 
						||
		rep.ext("");
 | 
						||
		return error_box("Il profilo %s non esiste", (const char*)rep);
 | 
						||
	}
 | 
						||
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::print()
 | 
						||
{
 | 
						||
  if (edit_mask().id2pos(DLG_PREVIEW) < 0)
 | 
						||
    save_and_print(true, printer().printtype());
 | 
						||
  else
 | 
						||
    save_and_print(true, winprinter);
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::mailto()
 | 
						||
{
 | 
						||
  save_and_print(true, exportprinter);
 | 
						||
}
 | 
						||
 | 
						||
void TMotore_application::preview()
 | 
						||
{
 | 
						||
  save_and_print(true, screenvis);
 | 
						||
}
 | 
						||
 | 
						||
int ve0100( int argc, char* argv[])
 | 
						||
{
 | 
						||
  TMotore_application a;
 | 
						||
  a.run( argc, argv, TR("Gestione documenti"));
 | 
						||
  return 0;
 | 
						||
}
 |