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