campo-sirio/ve/ve6100.cpp
alex 8792453bd0 This commit was generated by cvs2svn to compensate for changes in r1680,
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
1995-08-07 07:59:09 +00:00

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;
}