393 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			393 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <relapp.h>                                                                           
 | 
						||
#include <utility.h>
 | 
						||
#include <tabutil.h>
 | 
						||
#include <msksheet.h>
 | 
						||
#include <recarray.h>
 | 
						||
#include <assoc.h>
 | 
						||
#include <checks.h>
 | 
						||
#include <defmask.h>
 | 
						||
#include "..\mg\mglib.h"
 | 
						||
//#include "..\cg\cglib.h"
 | 
						||
#include "..\ve\veconf.h"
 | 
						||
#include "mg1100.h"
 | 
						||
 | 
						||
 | 
						||
 | 
						||
//********************
 | 
						||
//********************
 | 
						||
// maschera dell'applicazione "Gestione interattiva movimenti di magazzino"
 | 
						||
//
 | 
						||
class TMask_movmag: public TMask {
 | 
						||
  static TRecord_cache cache_causali;
 | 
						||
  TMov_mag * mov_mag;
 | 
						||
  TCodgiac_livelli * livelli_giac; // oggetto gestione livelli di giacenza
 | 
						||
  TString price_codart;
 | 
						||
  real price_quant;
 | 
						||
  bool price_proposed;
 | 
						||
  real proposed_price(const char * codart, real quant,const char * causrig);
 | 
						||
 | 
						||
  bool update_rigamov (int r, const char * old_codcaus);
 | 
						||
 | 
						||
  static bool notify_righe(TSheet_field & fld_righe, int item, KEY k); // notify delle righe di sheet
 | 
						||
  static bool handle_righe(TMask_field &f, KEY k); // handler delle righe
 | 
						||
  static bool handle_righeprezzo1(TMask_field &f, KEY k); // handler del prezzo delle righe
 | 
						||
  static bool handle_righeprezzo2(TMask_field &f, KEY k); // handler del prezzo delle righe
 | 
						||
  static bool handle_codcaus(TMask_field &fld, KEY k); // handler della causale
 | 
						||
  static bool handle_datacomp(TMask_field &, KEY k); // handler del numero di registrazione
 | 
						||
  static void sheetrighe_put(TSheet_field &fld_righe, int item);
 | 
						||
  static void sheetrighe_get(TSheet_field &fld_righe, int item);
 | 
						||
public:
 | 
						||
  TMagazzini magazzini;
 | 
						||
  TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m);
 | 
						||
  virtual ~TMask_movmag();
 | 
						||
};
 | 
						||
 | 
						||
 | 
						||
TRecord_cache TMask_movmag::cache_causali("%CAU");
 | 
						||
 | 
						||
// costruttore della maschera anagrafica di magazzino
 | 
						||
//TMask_movmag::TMask_movmag() : 
 | 
						||
TMask_movmag::TMask_movmag(TCodgiac_livelli *l_m,TMov_mag * m_m) 
 | 
						||
  : TMask("mg1100")
 | 
						||
{
 | 
						||
  // oggetti dell'applicazione
 | 
						||
  livelli_giac= l_m;
 | 
						||
  mov_mag = m_m;
 | 
						||
 | 
						||
  // setta handler e notify
 | 
						||
  TSheet_field & ss=(TSheet_field &)field(F_RIGHE);
 | 
						||
  set_handler(F_DATACOMP, handle_datacomp);
 | 
						||
  set_handler(F_CODCAUS, handle_codcaus);
 | 
						||
  ss.sheet_mask().field(F_QUANT).set_handler(handle_righeprezzo1);
 | 
						||
  ss.sheet_mask().field(F_CAUSRIG).set_handler(handle_righeprezzo1);
 | 
						||
  ss.sheet_mask().field(F_CODART).set_handler(handle_righeprezzo2);
 | 
						||
  ss.set_notify(notify_righe);
 | 
						||
  ss.set_handler(handle_righe);
 | 
						||
  ss.set_userget(sheetrighe_get);
 | 
						||
  ss.set_userput(sheetrighe_put);
 | 
						||
  ss.set_lines_record(m_m->body());
 | 
						||
  // setta i campi della maschera
 | 
						||
  // per la pagina giacenze
 | 
						||
  TSheet_field &fld_righe= (TSheet_field &)field(F_RIGHE); 
 | 
						||
  // setta le colonne in base all'abilitazione dei livelli di giacenza
 | 
						||
  livelli_giac->set_sheetcolumn(fld_righe,F_LIV1,1);
 | 
						||
  livelli_giac->set_sheetcolumn(fld_righe,F_LIV2,2);
 | 
						||
  livelli_giac->set_sheetcolumn(fld_righe,F_LIV3,3);
 | 
						||
  livelli_giac->set_sheetcolumn(fld_righe,F_LIV4,4);
 | 
						||
 | 
						||
  TConfig prassid(CONFIG_DITTA, "ve"); // apre il file di configurazione della ditta corrente
 | 
						||
  if (prassid.get_bool("GES", NULL, A_LISTINI))
 | 
						||
    field(F_CATVEN).show(prassid.get_bool("GESLISCV"));
 | 
						||
  else 
 | 
						||
    field(F_CATVEN).hide();  
 | 
						||
 | 
						||
  ss.sheet_mask().field(F_DESMAG).enable(magazzini.gestmultimag());
 | 
						||
  ss.enable_column(ss.cid2index(F_CODMAG),magazzini.gestmultimag());
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
TMask_movmag::~TMask_movmag()
 | 
						||
{
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
// item varies from 1 to items()
 | 
						||
void TMask_movmag::sheetrighe_get(TSheet_field &fld_righe, int item)
 | 
						||
{
 | 
						||
  TMask_movmag &m=(TMask_movmag &)fld_righe.mask();
 | 
						||
  // prende il record della riga corrente dal record array
 | 
						||
  TRectype &rec= fld_righe.record()->row(item, TRUE);
 | 
						||
  TToken_string &row= fld_righe.row(item-1);
 | 
						||
  // codici di livello
 | 
						||
  row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,1),fld_righe.cid2index(F_LIV1) );
 | 
						||
  row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,2),fld_righe.cid2index(F_LIV2) );
 | 
						||
  row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,3),fld_righe.cid2index(F_LIV3) );
 | 
						||
  row.add( m.livelli_giac->unpack_grpcode(rec.get("LIVGIAC") ,4),fld_righe.cid2index(F_LIV4) );
 | 
						||
}
 | 
						||
 | 
						||
// item varies from 1 to items()
 | 
						||
void TMask_movmag::sheetrighe_put(TSheet_field &fld_righe, int item)
 | 
						||
{
 | 
						||
  TMask_movmag &m=(TMask_movmag &)fld_righe.mask();
 | 
						||
  TToken_string &row= fld_righe.row(item-1);
 | 
						||
          
 | 
						||
    TRectype &recrighe= fld_righe.record()->row(item, TRUE);
 | 
						||
    // codici livello
 | 
						||
    if (m.livelli_giac->enabled()) {
 | 
						||
      TString16 packedcode;
 | 
						||
      m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV1)),1);
 | 
						||
      m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV2)),2);
 | 
						||
      m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV3)),3);
 | 
						||
      m.livelli_giac->pack_grpcode(packedcode,row.get(fld_righe.cid2index(F_LIV4)),4);
 | 
						||
      recrighe.put("LIVGIAC", packedcode);
 | 
						||
    }     
 | 
						||
}  
 | 
						||
  
 | 
						||
bool TMask_movmag::handle_righe(TMask_field &f, KEY k)
 | 
						||
{
 | 
						||
  if (k == K_ENTER)  {
 | 
						||
    TSheet_field & ss=(TSheet_field & )f;
 | 
						||
    for (int i=0; i< ss.items(); i++)
 | 
						||
    {
 | 
						||
      if (*ss.cell(i,ss.cid2index(F_CODMAG)) ==' ')
 | 
						||
      {
 | 
						||
        f.error_box("Nella riga %d manca l'indicazione del magazzino ",i+1);
 | 
						||
        return FALSE;
 | 
						||
      }
 | 
						||
    }
 | 
						||
  }
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
bool TMask_movmag::notify_righe(TSheet_field & ss, int r, KEY key)
 | 
						||
{
 | 
						||
  TMask_movmag &m=(TMask_movmag &)ss.mask();
 | 
						||
  static TString16 old_codcaus;
 | 
						||
  if ( key == K_DEL ) // Cancellazione 
 | 
						||
  {
 | 
						||
    if (*ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica)
 | 
						||
      return FALSE; // can't remove auto lines directly
 | 
						||
    if (r < ss.items()-1)
 | 
						||
    {
 | 
						||
      if (*ss.cell(r+1,ss.cid2index( F_AUTOMATICA))==riga_automatica)
 | 
						||
      {
 | 
						||
        ss.destroy(r + 1);
 | 
						||
      }
 | 
						||
    }
 | 
						||
 | 
						||
  } else if (key == K_INS) { // Inserimento              
 | 
						||
    if (r < ss.items() && *ss.cell(r,ss.cid2index( F_AUTOMATICA))==riga_automatica)
 | 
						||
      return FALSE; // cannot insert between a row and its generated one
 | 
						||
  } else if (key == K_CTRL + K_INS) { // Inserimento accordato
 | 
						||
    if (m.magazzini.standardmag().not_empty())
 | 
						||
    {
 | 
						||
      ss.row(r).add(m.magazzini.standardmag(),ss.cid2index(F_CODMAG));
 | 
						||
      ss.row(r).add(m.magazzini.standarddep(),ss.cid2index(F_CODDEP));
 | 
						||
    }
 | 
						||
    ss.select(r);
 | 
						||
  } else if (key == K_SPACE)  {
 | 
						||
    old_codcaus=ss.sheet_mask().get(F_CAUSRIG);
 | 
						||
    if (old_codcaus.blank())
 | 
						||
      old_codcaus=ss.mask().get(F_CODCAUS);
 | 
						||
 | 
						||
  } else if (key == K_ENTER)  {
 | 
						||
    if (m.update_rigamov(r,old_codcaus))
 | 
						||
       ss.select(r+1);
 | 
						||
  }
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
// proposta soft: solo se il prezzo <20> non nullo (gi<67> impostato)
 | 
						||
bool TMask_movmag::handle_righeprezzo1(TMask_field &f, KEY k)
 | 
						||
{
 | 
						||
  if (f.mask().get(F_PREZZO).blank())
 | 
						||
    return handle_righeprezzo2(f, k);
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
// proposta hard: propone il prezzo in ogni caso
 | 
						||
bool TMask_movmag::handle_righeprezzo2(TMask_field &f, KEY k)
 | 
						||
{
 | 
						||
  TMask_movmag &m=(TMask_movmag &)f.mask().get_sheet()->mask();
 | 
						||
  if (k==K_TAB && f.focusdirty())
 | 
						||
  {
 | 
						||
    //  propone il prezzo in base alla causale
 | 
						||
    if (!f.mask().get(F_QUANT).blank() && 
 | 
						||
      !f.mask().get(F_CODART).blank())
 | 
						||
    {
 | 
						||
      real prz=m.proposed_price(f.mask().get(F_CODART),
 | 
						||
        f.mask().get_real(F_QUANT),
 | 
						||
        f.mask().get(F_CAUSRIG));
 | 
						||
      f.mask().set(F_PREZZO,prz);
 | 
						||
    }
 | 
						||
  }
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
bool TMask_movmag::update_rigamov (int r, const char * old_codcaus)
 | 
						||
{
 | 
						||
  TSheet_field & ss=(TSheet_field & )field(F_RIGHE);
 | 
						||
  
 | 
						||
  TString16 new_codcaus(ss.cell(r,ss.cid2index(F_CAUSRIG)));
 | 
						||
  if (new_codcaus.blank())
 | 
						||
    new_codcaus=get(F_CODCAUS);
 | 
						||
  TCausale_magazzino &oldcau=(TCausale_magazzino &)cache_causali.get(old_codcaus);
 | 
						||
  TCausale_magazzino &cau   =(TCausale_magazzino &)cache_causali.get(new_codcaus);
 | 
						||
  if (*cau.caus_collegata()!='\0')
 | 
						||
  {
 | 
						||
    // deve esserci una riga collegata
 | 
						||
    TString16 codmag,coddep;
 | 
						||
    real prezzo(ss.cell(r,ss.cid2index(F_PREZZO)));
 | 
						||
    if (r < ss.items()-1 && *ss.cell(r+1,ss.cid2index( F_AUTOMATICA)) != riga_automatica)
 | 
						||
    {
 | 
						||
      // manca, la inserisco
 | 
						||
      ss.insert(r+1);
 | 
						||
      ss.row(r+1)=ss.row(r);
 | 
						||
    } else {
 | 
						||
      codmag=ss.cell(r+1,ss.cid2index(F_CODMAG));
 | 
						||
      coddep=ss.cell(r+1,ss.cid2index(F_CODDEP));
 | 
						||
      ss.row(r+1)=ss.row(r);
 | 
						||
    }
 | 
						||
    ss.row(r+1).add(prezzo.string(),ss.cid2index(F_PREZZO));
 | 
						||
    ss.row(r+1).add(codmag,ss.cid2index(F_CODMAG));
 | 
						||
    ss.row(r+1).add(coddep,ss.cid2index(F_CODDEP));
 | 
						||
    ss.row(r+1).add(cau.caus_collegata(),ss.cid2index(F_CAUSRIG));
 | 
						||
    ss.row(r+1).add(TString(1,riga_automatica),ss.cid2index(F_AUTOMATICA));
 | 
						||
    ss.check_row(r+1);
 | 
						||
    ss.force_update(r+1);
 | 
						||
    return TRUE;
 | 
						||
  } else
 | 
						||
    if (*oldcau.caus_collegata()!='\0')
 | 
						||
    {
 | 
						||
      // scollega la vecchia riga
 | 
						||
      ss.destroy(r + 1);
 | 
						||
    }
 | 
						||
  return FALSE;
 | 
						||
}
 | 
						||
 | 
						||
real TMask_movmag::proposed_price(const char *codart, 
 | 
						||
        real quant, const char *causrig)
 | 
						||
{
 | 
						||
  real rv("0");
 | 
						||
  TCausale_magazzino & cau=
 | 
						||
    (TCausale_magazzino &)cache_causali.get(*causrig ? causrig : get(F_CODCAUS));
 | 
						||
  TLocalisamfile anamag(LF_ANAMAG);
 | 
						||
  anamag.put("CODART",codart);
 | 
						||
  anamag.read();
 | 
						||
  switch (cau.tipoprz()) {
 | 
						||
    // prezzo 
 | 
						||
    case 'P': {
 | 
						||
      TLocalisamfile umart(LF_UMART);
 | 
						||
      TConfig cfgditta(CONFIG_DITTA);
 | 
						||
      TCondizione_vendita cv(&cfgditta,&anamag,&umart);
 | 
						||
      cv.put_listino(get(F_CODLIST),get(F_CATVEN));
 | 
						||
      cv.ricerca(codart,quant);
 | 
						||
      rv=cv.get_prezzo();
 | 
						||
    }
 | 
						||
    break;
 | 
						||
    // costo
 | 
						||
    case 'C': {
 | 
						||
      rv=anamag.get_real("ULTCOS1");
 | 
						||
      }
 | 
						||
    break;
 | 
						||
  }
 | 
						||
  return rv;
 | 
						||
}
 | 
						||
 | 
						||
bool TMask_movmag::handle_codcaus(TMask_field &fld, KEY k)
 | 
						||
{
 | 
						||
  static TString16 old_codcaus;
 | 
						||
 | 
						||
  if (k == K_TAB && fld.focusdirty() && old_codcaus!="")  
 | 
						||
  {
 | 
						||
    // aggiorna le righe di sheet
 | 
						||
    TMask_movmag &m=(TMask_movmag &)fld.mask();
 | 
						||
    TSheet_field & ss=(TSheet_field & )m.field(F_RIGHE);
 | 
						||
    bool added_some;
 | 
						||
    
 | 
						||
    // aggiorna le righe che dipendono dalla causale movimento
 | 
						||
    for (int i=0; i< ss.items(); i++)
 | 
						||
    {
 | 
						||
      if (*ss.cell(i,ss.cid2index(F_CAUSRIG)) ==' ')
 | 
						||
        added_some &=(m.update_rigamov(i,old_codcaus));
 | 
						||
    }
 | 
						||
    if (added_some)
 | 
						||
    {
 | 
						||
      ss.dirty();
 | 
						||
      ss.set_focus();
 | 
						||
    }
 | 
						||
  }
 | 
						||
  if (k == K_TAB) 
 | 
						||
    old_codcaus=fld.get();
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
bool TMask_movmag::handle_datacomp(TMask_field &fld, KEY k)
 | 
						||
{
 | 
						||
  if (k == K_TAB) // && fld.focusdirty()) 
 | 
						||
  {
 | 
						||
    int codes=((TMask_movmag &)fld.mask()).mov_mag->codice_esercizio(TDate(fld.get()));
 | 
						||
    if (codes>0) {
 | 
						||
      fld.mask().field(F_ANNOES).set(codes);
 | 
						||
      fld.mask().field(H_ANNOES).set(codes);
 | 
						||
    } else {
 | 
						||
      fld.error_box("La data indicata non appartiene a nessuno degli esercizi contabili inseriti ") ;
 | 
						||
      return FALSE; 
 | 
						||
    }
 | 
						||
  }
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
class TApp_movmag: public TRelation_application {
 | 
						||
  TArray used_files;
 | 
						||
  TMask_movmag *_msk; // maschera principale
 | 
						||
  TCodgiac_livelli * _livelli_giac;// oggetto handler  per i livelli di giacenza
 | 
						||
  TRelation * _rel;   // relazione contenente il file movimenti
 | 
						||
 | 
						||
  virtual bool user_create();
 | 
						||
  virtual bool user_destroy();                        
 | 
						||
  virtual TMask *get_mask(int) { return _msk; }
 | 
						||
  virtual bool changing_mask(int) { return FALSE; }
 | 
						||
  virtual TRelation *get_relation() const { return _rel; }
 | 
						||
  virtual const char *get_next_key();
 | 
						||
 | 
						||
  TString16 _nextcod;    
 | 
						||
public:
 | 
						||
  TApp_movmag() {};
 | 
						||
  virtual ~TApp_movmag() {};
 | 
						||
};
 | 
						||
 | 
						||
 | 
						||
inline TApp_movmag& app() { return (TApp_movmag&) main_app(); }
 | 
						||
 | 
						||
bool TApp_movmag::user_create()
 | 
						||
{
 | 
						||
  used_files.add(new TLocalisamfile(LF_ANAMAG));
 | 
						||
  used_files.add(new TLocalisamfile(LF_UMART));
 | 
						||
  used_files.add(new TLocalisamfile(LF_MOVMAG));
 | 
						||
  used_files.add(new TLocalisamfile(LF_RMOVMAG));
 | 
						||
  used_files.add(new TTable("%CAU"));
 | 
						||
  
 | 
						||
  TMov_mag * m_m= new TMov_mag(); // record del movimento di magazzino
 | 
						||
  m_m->enable_autoload(LF_RMOVMAG);
 | 
						||
  
 | 
						||
  // gestione giacenza a livelli
 | 
						||
  _livelli_giac= new TCodgiac_livelli;
 | 
						||
  // maschera specifica con gli handler dei movimenti
 | 
						||
  _msk= new TMask_movmag(_livelli_giac,m_m);
 | 
						||
  // relazione con un solo file (LF_MOVMAG) ma col record Head_Body
 | 
						||
  _rel= new TRelation(LF_MOVMAG);
 | 
						||
  _rel->lfile().set_curr(m_m);
 | 
						||
      
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
bool TApp_movmag::user_destroy()
 | 
						||
{
 | 
						||
  delete _rel;  
 | 
						||
  delete _msk;
 | 
						||
  delete _livelli_giac;
 | 
						||
  
 | 
						||
  return TRUE;
 | 
						||
}
 | 
						||
 | 
						||
// autonumerazione
 | 
						||
const char *TApp_movmag::get_next_key()
 | 
						||
{
 | 
						||
  return _nextcod.format("%d|%s",F_NUMREG,((TMov_mag &)_rel->curr()).get_next_key());
 | 
						||
}
 | 
						||
 | 
						||
int mg1100(int argc, char* argv[])
 | 
						||
{
 | 
						||
  TApp_movmag a;
 | 
						||
  
 | 
						||
  a.run(argc, argv, "Movimenti di magazzino");
 | 
						||
  return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 |