batbfrd.h Aggiunto campo importo

batbfrd.uml  Aggiunto campo importo
batbfrr.uml  Aggiunto campo importo
velib.h      Aggiunto codice_numerazione() ai documenti
velib0?.cpp  Implementazione codice_numerazione e gestione decimali automatici


git-svn-id: svn://10.65.10.50/trunk@5068 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 1997-08-18 15:24:00 +00:00
parent a3737ab83a
commit 99bfabf560
7 changed files with 140 additions and 65 deletions

View File

@ -2,4 +2,5 @@
#define F_DES 102 #define F_DES 102
#define F_PICTURE 103 #define F_PICTURE 103
#define F_TIPO 104 #define F_TIPO 104
#define F_FORMULA 105 #define F_IMPORTO 105
#define F_FORMULA 106

View File

@ -44,7 +44,7 @@ END
STRING F_PICTURE 20 STRING F_PICTURE 20
BEGIN BEGIN
PROMPT 2 7 "Picture di pres. " PROMPT 2 7 "Formato di presentazione "
FIELD S3 FIELD S3
END END
@ -52,6 +52,14 @@ BOOLEAN F_TIPO
BEGIN BEGIN
PROMPT 2 9 "Formula numerica" PROMPT 2 9 "Formula numerica"
FIELD B0 FIELD B0
MESSAGE TRUE ENABLE,F_IMPORTO
MESSAGE FALSE CLEAR,F_IMPORTO
END
BOOLEAN F_IMPORTO
BEGIN
PROMPT 2 10 "Importo"
FIELD B1
END END
STRING F_FORMULA 70 50 STRING F_FORMULA 70 50

View File

@ -44,7 +44,7 @@ END
STRING F_PICTURE 20 STRING F_PICTURE 20
BEGIN BEGIN
PROMPT 2 7 "Picture di pres. " PROMPT 2 7 "Formato di presentazione "
FIELD S3 FIELD S3
END END
@ -52,8 +52,17 @@ BOOLEAN F_TIPO
BEGIN BEGIN
PROMPT 2 9 "Formula numerica" PROMPT 2 9 "Formula numerica"
FIELD B0 FIELD B0
MESSAGE TRUE ENABLE,F_IMPORTO
MESSAGE FALSE CLEAR,F_IMPORTO
END END
BOOLEAN F_IMPORTO
BEGIN
PROMPT 2 10 "Importo"
FIELD B1
END
STRING F_FORMULA 70 50 STRING F_FORMULA 70 50
BEGIN BEGIN
PROMPT 2 11 "Formula " PROMPT 2 11 "Formula "

View File

@ -5,13 +5,13 @@
#include <multirec.h> #include <multirec.h>
#endif #endif
#ifndef __MASK_H //#ifndef __MASK_H
#include <mask.h> //#include <mask.h>
#endif //#endif
#ifndef __LFFILES_H //#ifndef __LFFILES_H
#include <lffiles.h> //#include <lffiles.h>
#endif //#endif
#ifndef __CLIFO_H #ifndef __CLIFO_H
#include <clifo.h> #include <clifo.h>
@ -56,9 +56,9 @@ protected:
virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const; virtual int write_rewrite(TBaseisamfile& f, bool re = FALSE) const;
public: public:
bool occasionale() const { return get_bool(CLI_OCCAS ); }; bool occasionale() const { return get_bool(CLI_OCCAS); }
TRectype & vendite() const; TRectype & vendite() const;
// TMask& occas_mask( ){ return _occas_mask; }; // TMask& occas_mask( ){ return _occas_mask; }
// static bool occas_code_handler(TMask_field& f, KEY key); // static bool occas_code_handler(TMask_field& f, KEY key);
// int write_occas( ); // int write_occas( );
// void edita_occasionale( ); // void edita_occasionale( );

View File

@ -43,8 +43,14 @@
#define RIGA_SCONTI 'C' #define RIGA_SCONTI 'C'
#define RIGA_OMAGGI 'O' #define RIGA_OMAGGI 'O'
#define RIGA_DESCRIZIONI 'D' #define RIGA_DESCRIZIONI 'D'
#define MAX_TIPI_DOC 10 #define MAX_TIPI_DOC 10
#define NO_DECIMALS 0
#define STD_DECIMALS 3
#define ALL_DECIMALS 883
#define AUTO_DECIMALS -883
class TDocumento; class TDocumento;
class TRiga_documento; class TRiga_documento;
class TCond_vendita; class TCond_vendita;
@ -238,6 +244,7 @@ public:
const TString & basesconto() const { return _basesconto;} const TString & basesconto() const { return _basesconto;}
const TString & spese() const { return _spese;} const TString & spese() const { return _spese;}
bool mov_mag() const { return get_bool("B1"); } bool mov_mag() const { return get_bool("B1"); }
bool statistiche() const { return get_bool("B2"); }
const TString & stato_mov_iniziale() const {return get("S7"); } const TString & stato_mov_iniziale() const {return get("S7"); }
const TString & stato_mov_finale() const {return get("S8"); } const TString & stato_mov_finale() const {return get("S8"); }
const TString & caus_mov() const {return get("S9"); } const TString & caus_mov() const {return get("S9"); }
@ -254,6 +261,31 @@ public:
virtual ~TTipo_documento(); virtual ~TTipo_documento();
}; };
class TCodice_numerazione : public TRectype
{
int _status;
public:
TObject* dup() const { return new TCodice_numerazione(codice()); }
public:
int read(const char * cod);
const TString& codice() const { return get("CODTAB"); }
const TString& descrizione() const { return get("S0"); }
const TString& prefisso() const { return get("S6"); }
const TString& postfisso() const { return get("S7"); }
const bool num_provv() const { return get_bool("B0"); }
const bool auto_num() const { return get_bool("B1"); }
const TString & tipo_doc(int i) const { CHECK(i < MAX_TIPI_DOC, "Impossibbile tipo documento"); return ((TString& ) get("S2").mid(i << 2, 4)).trim();}
int ntipi_doc() const {const int l = get("S2").len(); return l ? (((l - 1) >> 2) + 1) : 0;}
const char * complete_num (long num);
int status() { return _status; }
TCodice_numerazione(const char* codnum = NULL);
TCodice_numerazione(const TRectype& rec);
virtual ~TCodice_numerazione();
};
class TTipo_riga_documento : public TRectype // velib02 class TTipo_riga_documento : public TRectype // velib02
{ {
@ -356,8 +388,8 @@ public:
void reset_fields(TAuto_variable_rectype& rec) { rec.remove_field(); } void reset_fields(TAuto_variable_rectype& rec) { rec.remove_field(); }
void set_fields(TAuto_variable_rectype& rec); void set_fields(TAuto_variable_rectype& rec);
real prezzo(bool scontato, bool lordo, int ndec) const ; real prezzo(bool scontato, bool lordo, int ndec = AUTO_DECIMALS) const ;
real importo(bool scontato , bool lordo, int ndec) const ; real importo(bool scontato , bool lordo, int ndec = AUTO_DECIMALS) const ;
real iva(int ndec) const; real iva(int ndec) const;
real imponibile() const; real imponibile() const;
real imposta(bool round = TRUE) const; real imposta(bool round = TRUE) const;
@ -380,6 +412,8 @@ class TDocumento : public TAuto_variable_rectype // velib03
TRecfield *_codcf; TRecfield *_codcf;
TRecfield *_cod_occas; TRecfield *_cod_occas;
static TAssoc_array _tipi; static TAssoc_array _tipi;
static TAssoc_array _numerazioni;
int _liv_len[4]; int _liv_len[4];
TRecord_array _rows; // Array di TRectype per le righe documenti di vendita. TRecord_array _rows; // Array di TRectype per le righe documenti di vendita.
@ -429,6 +463,7 @@ public:
bool destroy_row(int n, bool pack = FALSE) { return _rows.destroy_row(n, pack); } bool destroy_row(int n, bool pack = FALSE) { return _rows.destroy_row(n, pack); }
void destroy_rows() { _rows.destroy_rows(); } void destroy_rows() { _rows.destroy_rows(); }
virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock); virtual int read(TBaseisamfile& f, word op = _isequal, word lockop = _nolock);
virtual int readat(TBaseisamfile& f, TRecnotype nrec, word lockop = _nolock);
virtual int write(TBaseisamfile& f) const { return write_rewrite(f, FALSE); } virtual int write(TBaseisamfile& f) const { return write_rewrite(f, FALSE); }
virtual int rewrite(TBaseisamfile& f) const { return write_rewrite(f, TRUE); } virtual int rewrite(TBaseisamfile& f) const { return write_rewrite(f, TRUE); }
virtual int remove(TBaseisamfile& f) const; virtual int remove(TBaseisamfile& f) const;
@ -443,19 +478,20 @@ public:
char tipo_numerazione() const { return get_char("PROVV"); } char tipo_numerazione() const { return get_char("PROVV"); }
int anno() const { return get_int("ANNO"); } int anno() const { return get_int("ANNO"); }
const TString& numerazione() { return get("CODNUM"); } const TString& numerazione() const { return get("CODNUM"); }
long numero() const { return get_long("NDOC"); } long numero() const { return get_long("NDOC"); }
TDate data() const { return get_date("DATADOC"); } TDate data() const { return get_date("DATADOC"); }
const bool in_valuta() const; bool in_valuta() const;
const TString& valuta() const { return get("CODVAL"); } const TString& valuta() const { return get("CODVAL"); }
const real cambio() const { return get_real("CAMBIO"); } real cambio() const { return get_real("CAMBIO"); }
bool tipo_valido() const { return get("TIPODOC").not_empty(); } bool tipo_valido() const { return get("TIPODOC").not_empty(); }
static const TTipo_documento& tipo(const char * tipodoc); static const TTipo_documento& tipo(const char * tipodoc);
const TTipo_documento& tipo() const; const TTipo_documento& tipo() const;
const TCodice_numerazione& codice_numerazione() const;
void set_tipo(const char * tipo) { head().put("TIPODOC", tipo);} void set_tipo(const char * tipo) { head().put("TIPODOC", tipo);}
void set_liv_giac_len(int liv, int len) { _liv_len[liv - 1] = len;} void set_liv_giac_len(int liv, int len) { _liv_len[liv - 1] = len;}
int liv_giac_len(int liv) const { return _liv_len[liv - 1];} int liv_giac_len(int liv) const { return _liv_len[liv - 1];}
bool provvisorio() const { return get_char("PROVV") == 'P'; }
char stato() const { return get_char("STATO"); } char stato() const { return get_char("STATO"); }
void stato(char s) { put("STATO", s); } void stato(char s) { put("STATO", s); }
@ -472,13 +508,11 @@ public:
void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); } void reset_fields(TAuto_variable_rectype & rec) { rec.remove_field(); }
void set_fields(TAuto_variable_rectype & rec); void set_fields(TAuto_variable_rectype & rec);
real spese_incasso(real & imp, int ndec, TTipo_importo netto = _lordo) const ; real spese_incasso(real & imp, int ndec, TTipo_importo netto = _lordo) const ;
real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ; real bolli(real & imp, int ndec, TTipo_importo netto = _lordo) const ;
real descrizione() const;
real riferimento() const; real imponibile(bool spese = FALSE, int ndec = AUTO_DECIMALS) const;
real imponibile(bool spese = FALSE, int ndec = 100) const; real imposta(bool spese = FALSE, int ndec = AUTO_DECIMALS) const;
real imposta(bool spese = FALSE, int ndec = 100) const;
real totale_doc() const; real totale_doc() const;
real totale_netto() const; real totale_netto() const;
real basesconto() const; real basesconto() const;
@ -908,36 +942,6 @@ struct dec_parm {
// add other groups here // add other groups here
}; };
class TCodice_numerazione : public TRectype
{
int _status;
public:
TObject* dup() const { return new TCodice_numerazione(codice()); }
public:
int read(const char * cod);
const TString& codice() const { return get("CODTAB"); }
const TString& descrizione() const { return get("S0"); }
const TString& prefisso() const { return get("S6"); }
const TString& postfisso() const { return get("S7"); }
// const bool manual_num() const { return get_bool("B0"); }
const bool num_provv() const { return get_bool("B0"); }
const bool auto_num() const { return get_bool("B1"); }
// const TString& tipo_doc1() { return get("S2").mid(0,4);}
// const TString& tipo_doc2() { return get("S2").mid(4,4);}
// const TString& tipo_doc3() { return get("S2").mid(8,4);}
// const TString& tipo_doc4() { return get("S2").mid(12,4);}
// const TString& tipo_doc5() { return get("S2").mid(16,4);}
const TString & tipo_doc(int i) const { CHECK(i < MAX_TIPI_DOC, "Impossibbile tipo documento"); return ((TString& ) get("S2").mid(i << 2, 4)).trim();}
int ntipi_doc() const {const int l = get("S2").len(); return l ? (((l - 1) >> 2) + 1) : 0;}
const char * complete_num (long num);
int status() { return _status; }
TCodice_numerazione(const char* codnum = NULL);
TCodice_numerazione(const TRectype& rec);
virtual ~TCodice_numerazione();
};
////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////
// classe TDocumentoEsteso: oggetto che ha come finalita' il calcolo dei riepiloghi IVA // classe TDocumentoEsteso: oggetto che ha come finalita' il calcolo dei riepiloghi IVA
////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////

View File

@ -372,6 +372,9 @@ void TRiga_documento::set_fields(TAuto_variable_rectype & rec)
real TRiga_documento::prezzo(bool scontato, bool lordo, int ndec) const real TRiga_documento::prezzo(bool scontato, bool lordo, int ndec) const
{ {
if (ndec == AUTO_DECIMALS)
ndec = doc().in_valuta() ? 3 : 0;
real prezzo = get_real("PREZZO"); real prezzo = get_real("PREZZO");
if (scontato) if (scontato)
prezzo = prezzo_scontato(prezzo, get("SCONTO")); prezzo = prezzo_scontato(prezzo, get("SCONTO"));
@ -384,6 +387,9 @@ real TRiga_documento::prezzo(bool scontato, bool lordo, int ndec) const
real TRiga_documento::importo(bool scontato, bool lordo, int ndec) const real TRiga_documento::importo(bool scontato, bool lordo, int ndec) const
{ {
if (ndec == AUTO_DECIMALS)
ndec = doc().in_valuta() ? 3 : 0;
real importo; real importo;
TTipo_calcolo c = _nessun_calcolo; TTipo_calcolo c = _nessun_calcolo;
@ -460,10 +466,13 @@ real TRiga_documento::importo(bool scontato, bool lordo, int ndec) const
real TRiga_documento::iva(int ndec) const real TRiga_documento::iva(int ndec) const
{ {
if (ndec == AUTO_DECIMALS)
ndec = doc().in_valuta() ? 3 : 0;
((TRiga_documento *) this)->_iva_calc = TRUE; ((TRiga_documento *) this)->_iva_calc = TRUE;
real iva(::iva(imponibile(), iva(), ndec)); real zanicchi = ::iva(imponibile(), iva(), ndec);
((TRiga_documento *) this)->_iva_calc = FALSE; ((TRiga_documento *) this)->_iva_calc = FALSE;
return iva; return zanicchi;
} }
real TRiga_documento::imponibile() const real TRiga_documento::imponibile() const

View File

@ -195,6 +195,7 @@ TFormula_documento * TTipo_documento::succ_formula(bool restart)
/////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////
TAssoc_array TDocumento::_tipi; TAssoc_array TDocumento::_tipi;
TAssoc_array TDocumento::_numerazioni;
TDocumento::TDocumento() TDocumento::TDocumento()
: TAuto_variable_rectype(LF_DOC), _rows(LF_RIGHEDOC, "NRIGA"), _nuovo(TRUE), : TAuto_variable_rectype(LF_DOC), _rows(LF_RIGHEDOC, "NRIGA"), _nuovo(TRUE),
@ -510,17 +511,18 @@ TRiga_documento& TDocumento::new_row(const char *tipo)
int TDocumento::read(TBaseisamfile& f, word op, word lockop) int TDocumento::read(TBaseisamfile& f, word op, word lockop)
{ {
TRiga_documento* key = new TRiga_documento(this); const TRectype rec(*this); // vecchia testata
TRectype rec(*this);
int err = TRectype::read(f, op, lockop);
const char pr = tipo_numerazione(); const char pr = tipo_numerazione();
const int an = anno(); const int an = anno();
const TString16 cn = numerazione(); const TString16 cn = numerazione();
const long nu = numero(); const long nu = numero();
CHECK(nu > 0, "Numero documento nullo."); CHECK(nu > 0, "Numero documento nullo.");
TRiga_documento* key = new TRiga_documento(this);
set_key(*key, pr, an, cn, nu); set_key(*key, pr, an, cn, nu);
int err = TRectype::read(f);
_cli_for.zero(); _cli_for.zero();
_occas.zero(); _occas.zero();
@ -549,6 +551,32 @@ int TDocumento::read(char provv, int anno, const char* codnum, long numdoc, word
return read(op, lockop); return read(op, lockop);
} }
// Guy: Mancava! Copio bovinamente tanto verra presto rimpiazzata da i Multirectype
int TDocumento::readat(TBaseisamfile& f, TRecnotype nrec, word lockop)
{
int err = TRectype::readat(f, nrec, lockop);
_cli_for.zero();
_occas.zero();
const char pr = tipo_numerazione();
const int an = anno();
const TString16 cn = numerazione();
const long nu = numero();
CHECK(nu > 0, "Numero documento nullo.");
TRiga_documento* key = new TRiga_documento(this);
set_key(*key, pr, an, cn, nu);
_nuovo = FALSE;
_rows.read(key); //ok
set_riga_sconto();
if (is_fattura())
set_riga_esenzione();
return err;
}
long TDocumento::renum(long numdoc) long TDocumento::renum(long numdoc)
{ {
if (numdoc <= 0) if (numdoc <= 0)
@ -898,19 +926,22 @@ int TDocumento::remove(TBaseisamfile& f) const
return err; return err;
} }
const bool TDocumento::in_valuta() const bool TDocumento::in_valuta() const
{ {
const TString& val = valuta(); const TString& val = valuta();
return (val.not_empty() && val != "LIT"); return (val.not_empty() && val != "LIT");
} }
TRiga_documento & TDocumento::row(int index) TRiga_documento& TDocumento::row(int index)
{ {
const int nrows = _rows.rows(); const int nrows = _rows.rows();
TRiga_documento * r = NULL; TRiga_documento * r = NULL;
if (index <= nrows) if (index <= nrows)
{
r = &((TRiga_documento &) _rows.row(index, FALSE)); r = &((TRiga_documento &) _rows.row(index, FALSE));
CHECKD(r, "Riga documento non esistente ", index);
}
else else
{ {
CHECKD((index == nrows + 1 && (_sconto != NULL || _esenzione != NULL)) || (index == nrows + 2 && _sconto != NULL && _esenzione != NULL), CHECKD((index == nrows + 1 && (_sconto != NULL || _esenzione != NULL)) || (index == nrows + 2 && _sconto != NULL && _esenzione != NULL),
@ -970,6 +1001,19 @@ const TTipo_documento& TDocumento::tipo() const
return tipo(tipodoc); return tipo(tipodoc);
} }
const TCodice_numerazione& TDocumento::codice_numerazione() const
{
const TString16 key(numerazione());
TCodice_numerazione* o = (TCodice_numerazione*)_numerazioni.objptr(key);
if (o == NULL)
{
o = new TCodice_numerazione(key);
_numerazioni.add(key, o);
}
return *o;
}
bool TDocumento::raggruppabile(const TDocumento& doc, TToken_string& campi) const bool TDocumento::raggruppabile(const TDocumento& doc, TToken_string& campi) const
{ {
bool ok = raggruppabile() && doc.raggruppabile(); bool ok = raggruppabile() && doc.raggruppabile();
@ -1037,7 +1081,7 @@ void TDocumento::set_fields(TAuto_variable_rectype & rec)
real TDocumento::imponibile(bool spese, int ndec) const real TDocumento::imponibile(bool spese, int ndec) const
{ {
real val; real val;
if (ndec > 99) if (ndec == AUTO_DECIMALS)
ndec = in_valuta() ? 3 : 0; ndec = in_valuta() ? 3 : 0;
for (int i = rows(); i > 0; i--) for (int i = rows(); i > 0; i--)
@ -1057,7 +1101,7 @@ real TDocumento::imposta(bool spese, int ndec) const
{ {
TAssoc_array ive; TAssoc_array ive;
if (ndec > 99) if (ndec == AUTO_DECIMALS)
ndec = in_valuta() ? 3 : 0; ndec = in_valuta() ? 3 : 0;
for (int i = rows(); i > 0; i--) for (int i = rows(); i > 0; i--)