Gestitti i tipi riga dei documenti.

git-svn-id: svn://10.65.10.50/trunk@3409 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1996-08-19 16:04:55 +00:00
parent cc99762cb4
commit 359df46fdb
2 changed files with 133 additions and 18 deletions

View File

@ -78,8 +78,7 @@ TTipo_documento::TTipo_documento(const TRectype& rec)
{ } { }
TTipo_documento::~TTipo_documento() TTipo_documento::~TTipo_documento()
{ { }
}
int TTipo_documento::read(const char* tipodoc) int TTipo_documento::read(const char* tipodoc)
{ {
@ -91,14 +90,94 @@ int TTipo_documento::read(const char* tipodoc)
return err; return err;
} }
///////////////////////////////////////////////////////////
// Tipo riga di un documento
///////////////////////////////////////////////////////////
TTipo_riga_documento::TTipo_riga_documento(const char* tiporig)
: TRectype(LF_TABCOM)
{
settab("TRI");
if (tiporig && *tiporig)
read(tiporig);
}
TTipo_riga_documento::TTipo_riga_documento(const TRectype& rec)
: TRectype(rec)
{ }
TTipo_riga_documento::~TTipo_riga_documento()
{ }
int TTipo_riga_documento::read(const char* tiporig)
{
TTable t("%TRI");
put("CODTAB", tiporig);
int err = TRectype::read(t);
if (err != NOERR)
yesnofatal_box("Tipo riga documento errato: %s", tiporig);
return err;
}
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
// Riga documento per vendite // Riga documento per vendite
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
bool TRiga_documento::solo_descrizione() const TAssoc_array TRiga_documento::_tipi;
const TTipo_riga_documento& TRiga_documento::tipo() const
{ {
return get("QTA").empty() && get("PREZZO").empty(); const TString16 tiporig(get("TIPORIGA"));
TTipo_riga_documento* o = (TTipo_riga_documento*)_tipi.objptr(tiporig);
if (o == NULL)
{
if (_tipi.items() == 0)
{
TTable tri("%TRI"); // Tabella dei tipi riga
for (tri.first(); !tri.eof(); tri.next())
{
const TString16 codice = tri.get("CODTAB");
_tipi.add(codice, new TTipo_riga_documento(tri.curr()));
}
}
o = (TTipo_riga_documento*)_tipi.objptr(tiporig);
if (o == NULL)
{
o = new TTipo_riga_documento(tiporig);
_tipi.add(tiporig, o);
}
}
return *o;
}
bool TRiga_documento::sola_descrizione() const
{
char t = tipo().tipo();
if (t <= ' ' && get("QTA").empty() && get("PREZZO").empty())
t = 'D';
return t == 'D';
} }
void TRiga_documento::forza_sola_descrizione()
{
if (tipo().tipo() != 'D')
{
_tipi.restart();
for (const TObject* o = _tipi.get(); o; o = _tipi.get())
{
const TTipo_riga_documento* trd = (const TTipo_riga_documento*)o;
if (trd->tipo() == 'D')
{
put("TIPORIGA", trd->codice());
break;
}
}
zero("QTA");
zero("PREZZO");
}
}
// Ritorna TRUE se le due righe del documento possono essere sommate // Ritorna TRUE se le due righe del documento possono essere sommate
bool TRiga_documento::raggruppabile(const TRiga_documento& r, TToken_string& campi) const bool TRiga_documento::raggruppabile(const TRiga_documento& r, TToken_string& campi) const
@ -115,7 +194,7 @@ bool TRiga_documento::raggruppabile(const TRiga_documento& r, TToken_string& cam
TRiga_documento& TRiga_documento::operator +=(const TRiga_documento& r) TRiga_documento& TRiga_documento::operator +=(const TRiga_documento& r)
{ {
TToken_string campi("QTA|NCOLLI|QTAEVASA|DAEVADERE"); TToken_string campi("QTA|NCOLLI|QTAEVASA");
for (const char* c = campi.get(0); c && ok; c = campi.get()) for (const char* c = campi.get(0); c && ok; c = campi.get())
{ {
real num(r.get_real(c)); real num(r.get_real(c));
@ -301,7 +380,7 @@ long TDocumento::get_next_key(char provv, int anno, const char* codnum) const
const TTipo_documento& TDocumento::tipo() const const TTipo_documento& TDocumento::tipo() const
{ {
const TString16 tipodoc(get("TIPODOC")); const TString16 tipodoc(get("TIPODOC"));
CHECK(*tipodoc, "Tipo documento nullo"); CHECK(tipodoc.not_empty(), "Tipo documento nullo");
TTipo_documento * o = (TTipo_documento*)_tipi.objptr(tipodoc); TTipo_documento * o = (TTipo_documento*)_tipi.objptr(tipodoc);
if (o == NULL) if (o == NULL)
{ {
@ -334,10 +413,11 @@ TDate TLista_documenti::num2date(char provv, int anno, const char* codnum, long
{ {
TLocalisamfile doc(LF_DOC); TLocalisamfile doc(LF_DOC);
TDocumento::set_key(doc.curr(), provv, anno, codnum, num); TDocumento::set_key(doc.curr(), provv, anno, codnum, num);
TDate d;
if (doc.read() == NOERR) if (doc.read(_isgteq) != NOERR) // In caso d'errore ...
d = doc.get("DATADOC"); doc.last(); // prendi l'ultimo
return d;
return doc.get("DATADOC");
} }
int TLista_documenti::read(char tipo, long clifo, int anno, int TLista_documenti::read(char tipo, long clifo, int anno,
@ -420,8 +500,8 @@ int TLista_documenti::read(char tipo, long clifo, int anno,
int TLista_documenti::write(bool re) const int TLista_documenti::write(bool re) const
{ {
int err = NOERR; int err = NOERR;
for (int i = _documenti.items()-1; i >= 0 && err == NOERR; i--) for (int i = 0; i < _documenti.items() && err == NOERR; i++)
err = doc(i).write(re); err = doc(i).write(re);
return err; return err;
} }
@ -606,6 +686,11 @@ int TElaborazione::read(const char* cod)
// TFatturazione bolle // TFatturazione bolle
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
TFatturazione_bolle::TFatturazione_bolle(const char* cod)
: TElaborazione(cod)
{
}
bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out) bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out)
{ {
#ifdef DBG #ifdef DBG
@ -618,7 +703,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out)
} }
if (i >= 5) if (i >= 5)
{ {
yesnofatal_box("Tipo documento non valido: ", (const char*)tipodoc); NFCHECK("Tipo documento non valido: ", (const char*)tipodoc);
return FALSE; return FALSE;
} }
#endif #endif
@ -637,7 +722,11 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out)
// Determina ed eventualmente crea la riga di riferimento // Determina ed eventualmente crea la riga di riferimento
const int riga_rif = riferimenti_in_testa() ? 1 : doc_out.rows()+1; const int riga_rif = riferimenti_in_testa() ? 1 : doc_out.rows()+1;
if (riga_rif > doc_out.rows()) if (riga_rif > doc_out.rows())
doc_out.new_row(); {
TRiga_documento& rout = doc_out.new_row();
rout.forza_sola_descrizione();
}
TRiga_documento& rout = doc_out[riga_rif]; TRiga_documento& rout = doc_out[riga_rif];
// Costruisce la stringa di riferimento // Costruisce la stringa di riferimento
@ -681,7 +770,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out)
for (int r = 1; r <= doc_in.rows(); r++) for (int r = 1; r <= doc_in.rows(); r++)
{ {
const TRiga_documento& rin = doc_in[r]; const TRiga_documento& rin = doc_in[r];
const bool rindesc = rin.solo_descrizione(); // La riga di input e' descrittiva const bool rindesc = rin.sola_descrizione(); // La riga di input e' descrittiva
if (ignora_desc && rindesc) if (ignora_desc && rindesc)
continue; continue;
@ -695,7 +784,7 @@ bool TFatturazione_bolle::raggruppa(TDocumento& doc_in, TDocumento& doc_out)
for (int o = 1; o <= last; o++) // ... cerca una riga compatibile for (int o = 1; o <= last; o++) // ... cerca una riga compatibile
{ {
TRiga_documento& rout = doc_out[o]; TRiga_documento& rout = doc_out[o];
if (rout.solo_descrizione()) // Ignora le righe descrittive if (rout.sola_descrizione()) // Ignora le righe descrittive
continue; continue;
if (rin.raggruppabile(rout, campi_riga)) // Se esiste una riga compatibile ... if (rin.raggruppabile(rout, campi_riga)) // Se esiste una riga compatibile ...
{ {

View File

@ -31,11 +31,33 @@ public:
virtual ~TTipo_documento(); virtual ~TTipo_documento();
}; };
class TTipo_riga_documento : public TRectype
{
protected:
int read(const char* tiporig);
public:
TObject* dup() const { return new TTipo_riga_documento(codice()); }
public:
const TString& codice() const { return get("CODTAB");}
const TString& descrizione() const { return get("S0"); }
char tipo() const { return get_char("S7"); }
TTipo_riga_documento(const char* tiporig = NULL);
TTipo_riga_documento(const TRectype& rec);
virtual ~TTipo_riga_documento();
};
class TRiga_documento : public TRectype class TRiga_documento : public TRectype
{ {
friend class TDocumento; friend class TDocumento;
const TDocumento* _doc; const TDocumento* _doc;
static TAssoc_array _tipi;
protected: protected:
void set_doc(const TDocumento* doc) { _doc = doc; } void set_doc(const TDocumento* doc) { _doc = doc; }
@ -46,7 +68,9 @@ public:
const TDocumento& documento() const const TDocumento& documento() const
{ CHECK(_doc, "Riga documento orfana"); return *_doc; } { CHECK(_doc, "Riga documento orfana"); return *_doc; }
bool solo_descrizione() const; const TTipo_riga_documento& tipo() const;
bool sola_descrizione() const;
void forza_sola_descrizione();
TRiga_documento& operator =(const TRiga_documento& r) TRiga_documento& operator =(const TRiga_documento& r)
{ TRectype::operator=(r); _doc = r._doc; return *this; } { TRectype::operator=(r); _doc = r._doc; return *this; }
@ -229,12 +253,14 @@ public:
class TFatturazione_bolle : public TElaborazione class TFatturazione_bolle : public TElaborazione
{ {
TToken_string _cod_desc;
public: public:
virtual bool raggruppa(TDocumento& din, TDocumento& dout); virtual bool raggruppa(TDocumento& din, TDocumento& dout);
virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, virtual bool elabora(TLista_documenti& doc_in, TLista_documenti& doc_out,
const TDate& data_elab); const TDate& data_elab);
TFatturazione_bolle(const char* cod) : TElaborazione(cod) { } TFatturazione_bolle(const char* cod);
virtual ~TFatturazione_bolle() { } virtual ~TFatturazione_bolle() { }
}; };