which included commits to RCS files with non-trunk default branches. git-svn-id: svn://10.65.10.50/trunk@1681 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			186 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			186 lines
		
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
// ve6100.cpp: modulo per la generazione delle fatture.
 | 
						|
 | 
						|
#include "ve6retv.h"    // valori di ritorno dalle varie funzioni
 | 
						|
 | 
						|
class TCrea_fatture : public TElaborazioni
 | 
						|
{
 | 
						|
protected:   
 | 
						|
  virtual bool menu (MENU_TAG);
 | 
						|
  virtual bool create () ;
 | 
						|
  virtual bool destroy();
 | 
						|
 | 
						|
public:
 | 
						|
  TCrea_fatture (void) {}               // costruttore
 | 
						|
};
 | 
						|
 | 
						|
bool TCrea_fatture::create()
 | 
						|
{
 | 
						|
  cod_elab = "01";                                      // imposta il codice elaborazione (per il riferimento alla tabella ELD)
 | 
						|
  dispatch_e_menu(BAR_ITEM(1)); // chiama il metodo menu
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TCrea_fatture::destroy()
 | 
						|
{
 | 
						|
  delete _msk;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TCrea_fatture::menu(MENU_TAG)
 | 
						|
{
 | 
						|
  int err;                      // errore ritornato dalle funzioni
 | 
						|
  if (err = scan_doc())         // se durante la scansione c'è un errore, esci
 | 
						|
    return !errore_fatale(err);
 | 
						|
  
 | 
						|
  switch (ordinamento)  // in base all'ordinamento, lancia diverse procedure di creazione
 | 
						|
  {
 | 
						|
  case CLIENTE:
 | 
						|
    // crea fatture raggruppando per cliente
 | 
						|
    err = per_cliente();
 | 
						|
    break;
 | 
						|
  case AGENTE:
 | 
						|
    // crea fatture per agente
 | 
						|
    break;
 | 
						|
  case ZONA:
 | 
						|
    // crea fatture per zona
 | 
						|
    break;
 | 
						|
  case DATA_NUMDOC:
 | 
						|
    if (raggruppa)
 | 
						|
      // crea fatture per data/numero documento
 | 
						|
    else
 | 
						|
      // crea una fattura per ogni cliente
 | 
						|
      break;
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  if (err) while (!getchar());          // se c'è un errore, attende la pressione di invio
 | 
						|
  return !errore_fatale(err)            // ritorna FALSE se c'è stato un errore fatale
 | 
						|
  }
 | 
						|
 | 
						|
int per_cliente(void)
 | 
						|
{
 | 
						|
  TLocalisamfile f(LF_DOC);
 | 
						|
  TLocalisamfile rdoc(LF_RDOC);
 | 
						|
  int current = 0;                      // chiave corrente
 | 
						|
  TToken_string tempt;          // ttoken string temporanea
 | 
						|
  TString cliente;
 | 
						|
  TRectype tempr (LF_DOC);
 | 
						|
  TRectype temprdoc (LF_RDOC);
 | 
						|
  TTable t("NUM");                      // tabella numerazioni
 | 
						|
  int nrdoc=0;          // numero di riga della fattura
 | 
						|
  
 | 
						|
  do
 | 
						|
  {
 | 
						|
    // memorizza il record del documento pilota
 | 
						|
    f.zero();
 | 
						|
    tempt = _chiavi->row(current);      // rileva la chiave corrente
 | 
						|
    codnum = tempt.get(0)
 | 
						|
      f.put ("CODNUM", codnum);                 // memorizza i valori della chiave corrente nel record
 | 
						|
    f.put ("ANNO", tempt.get());
 | 
						|
    f.put ("PROVV", tempt.get());
 | 
						|
    f.put ("NDOC", tempt.get());
 | 
						|
    if (!f.read (_isequal))                     // cerca il record corrispondente alla chiave corrente
 | 
						|
    {
 | 
						|
      error_box ("TCrea_fatture::per_cliente() : errore %d durante la lettura su doc", err);
 | 
						|
      return READ_ERROR;
 | 
						|
    }
 | 
						|
    tempr = f.curr();                           // copia ilrecord del doc. pilota in tempr
 | 
						|
    
 | 
						|
    // imposta il numero documento per la fattura da creare
 | 
						|
    t.zero();
 | 
						|
    t.put ("CODTAB", _elab.codnum);     // codice numerazione per le fatture
 | 
						|
    t.read (_isgteq);                                   // legge il primo record con lo stesso codice di numerazione
 | 
						|
    if (t.get("CODTAB") == _elab.codnum)        // controlla che il codice numerazione sia effettivamente lo stesso
 | 
						|
    {
 | 
						|
      n = t.get("I1");                  // legge l'ultimo numero di documento utilizzato (o il primo disponibile)
 | 
						|
      // supponiamo che sia l'ultimo utilizzato
 | 
						|
      n++;              // ora n è il numero della mia fattura (da mettere in NDOC);
 | 
						|
    }
 | 
						|
    else
 | 
						|
      n = 1;            // se non esiste alcun documento con il codice numerazione specificato, allora la fattura corrente è la n° 1
 | 
						|
    
 | 
						|
    // inserisce il record del documento pilota in doc
 | 
						|
    f.curr() = tempr                    // tutti i campi della fattura sono uguali al documento pilota, tranne alcuni (impostati più sotto)
 | 
						|
      f.put ("NDOC", n);                // imposta il numero del documento
 | 
						|
    f.put ("TIPODOC", _elab.tipo_doc_des);      // imposta il tipo di documento
 | 
						|
    f.put ("STATO", ???);               // stato della fattura appena creata
 | 
						|
    
 | 
						|
    if ((err = f.write()) == NOERR)             // se nonci sono problemi
 | 
						|
    {
 | 
						|
      t--;                              // si posiziona sul record precedente nella tabella numerazione
 | 
						|
      t.put ("I1", n);  // imposta nuovo numero del documento
 | 
						|
      t.write();                        // registra
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      switch (err)
 | 
						|
      {
 | 
						|
      case REINSERT:
 | 
						|
        message_box ("ve6100: Errore fatale: il record con la chiave specificata esiste già: impossibile sovrascrivere");
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        message_box ("ve6100: Errore fatale: %d scrivendo sulla tabella NDOC", err);
 | 
						|
        break;
 | 
						|
      }
 | 
						|
      return RECORD_WRITE_ERROR;                // indica al chiamante un errore nella scrittura di un record
 | 
						|
    }
 | 
						|
    
 | 
						|
    // cerca la prima riga del documento pilota in rdoc
 | 
						|
    nrdoc = 1;                  // comincia dalla prima riga
 | 
						|
    temprdoc.zero();
 | 
						|
    temprdoc.put ("CODNUM", tempr.get("CODNUM"));
 | 
						|
    temprdoc.put ("ANNO", tempr.get ("ANNO"));
 | 
						|
    temprdoc.put ("PROVV", tempr.get("PROVV"));
 | 
						|
    temprdoc.put ("NDOC", tempr.get("NDOC"));
 | 
						|
    
 | 
						|
    TRecord_array doc_originale;
 | 
						|
    doc_originale.read (temprdoc);              // legge tutte le righe del documento originale
 | 
						|
    
 | 
						|
    // con la funzione doc_originale.row(i) ho l'i-esima riga del doc. originale
 | 
						|
    TRecord_array doc_destinazione;
 | 
						|
    temprdoc.put ("CODNUM", _elab.codnum);      // imposta il codice numerazione per la fattura
 | 
						|
    
 | 
						|
    
 | 
						|
    /*
 | 
						|
       prendi la prima chiave
 | 
						|
       
 | 
						|
       ripeti
 | 
						|
       cerca su doc il record corrispondente alla chiave corrente
 | 
						|
       
 | 
						|
       prendi il codcf (codice cliente)         // costruzion file pilota per il cliente corrente
 | 
						|
       prendi tutti i campi obbligatori         // meglio: copia il record trovato in un oggetto record
 | 
						|
       
 | 
						|
       scrivi su doc il record relativo alla nuova fattura creata
 | 
						|
       cerca su rdoc la prima riga del doc. pilota              // inserimento del doc. pilota nella fattura
 | 
						|
       copia le righe del doc. pilota nella fattura
 | 
						|
       segna a[0] come processato
 | 
						|
       
 | 
						|
       per ogni chiave dell'array (dopo la prima)
 | 
						|
       se non è processata
 | 
						|
       cerca su doc il record corrispondente
 | 
						|
       se codcf è uguale a codcf del doc. pilota             // meglio: crea un record campione con codcf e campi obbligatori = a guelli del record pilota e cerca il 
 | 
						|
       allora se i campi obbligatori sono uguali a quelli del doc. pilota
 | 
						|
       allora copia tutte le righe del doc. attuale nella fattura
 | 
						|
       indica il record come processato
 | 
						|
       
 | 
						|
       prendi dall'array la prima chiave non processata
 | 
						|
       finché la chiave corrente è oltre l'ultimo record. (chiave corrente == a.items()
 | 
						|
       */
 | 
						|
 | 
						|
 | 
						|
    Per numerazione fatture:
 | 
						|
    TTable t ("NUM");
 | 
						|
    metto in codtab il codice numerazione
 | 
						|
      leggo il record con quel codice
 | 
						|
        nel campi I1 c'è il numero del primo campo disponibile (o dell'ultimo utilizzato)
 | 
						|
 | 
						|
       }
 | 
						|
 | 
						|
 | 
						|
int ve6100 (int argc, char **argv)
 | 
						|
{
 | 
						|
  TCrea_fatture a;
 | 
						|
  a.run (argc, argv, "Fatturazione");
 | 
						|
  return 0;
 | 
						|
}
 |