Prima versione funzionante del programma.

Manca ancora le gestione delle righe di spesa e sconti.


git-svn-id: svn://10.65.10.50/trunk@3436 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1996-08-24 11:13:17 +00:00
parent c137c3e4f8
commit 5ac0b14c3c

View File

@ -44,6 +44,7 @@
#include <rmov.h> #include <rmov.h>
#include <rmoviva.h> #include <rmoviva.h>
#include <clifo.h> #include <clifo.h>
#include <cfven.h>
#include <occas.h> #include <occas.h>
#include <scadenze.h> #include <scadenze.h>
@ -60,8 +61,10 @@ enum error_type {
caus_error, caus_error,
register_error, register_error,
change_error, change_error,
val_error,
codpag_error, codpag_error,
row_type_error, row_type_error,
no_rows_error,
conto_error, conto_error,
movement_error, movement_error,
mov_write_error, mov_write_error,
@ -76,19 +79,21 @@ enum error_type {
class TMovimentoPN_VE : public TMovimentoPN class TMovimentoPN_VE : public TMovimentoPN
{ {
TCausale * _caus;
protected: protected:
// simula il K_SPACE di iva_notify // simula il K_SPACE di iva_notify
void create_row(TCausale& caus, int i); void create_row(int i);
// simula il K_ENTER di iva_notify // simula il K_ENTER di iva_notify
void enter_row(TCausale& caus, int i); void enter_row(int i);
// verifica se si tratta di iva indetraibile // verifica se si tratta di iva indetraibile
bool detraibile(TCausale& caus, TRectype& rec) const ; bool detraibile(TRectype& rec) const ;
// cerca la prima tra quelle di contabilita' che corrisponde al tipo indicato // cerca la prima tra quelle di contabilita' che corrisponde al tipo indicato
int type2pos(char tipo); int type2pos(char tipo);
// Trova nelle righe contabili un conto nelle righe di tipo prescelto // Trova nelle righe contabili un conto nelle righe di tipo prescelto
int bill2pos(const TBill& conto, char tipo); int bill2pos(const TBill& conto, char tipo);
// trasforma un real in TImporto, in base al tipo riga // trasforma un real in TImporto, in base al tipo riga
TImporto real2imp(TCausale& caus, const real& r, char row_type); TImporto real2imp(const real& r, char row_type);
// setta il record delle righe di contabilita' // setta il record delle righe di contabilita'
int set_cg_rec(int n, const TImporto& imp, TBill& conto, const char* desc, char tipo); int set_cg_rec(int n, const TImporto& imp, TBill& conto, const char* desc, char tipo);
// aggiunge l'importo indicato alla n-esima riga di contabilita' // aggiunge l'importo indicato alla n-esima riga di contabilita'
@ -103,19 +108,20 @@ public:
bool movement_ok() ; bool movement_ok() ;
// ricalcola le righe di contabilita' dalle righe iva presenti // ricalcola le righe di contabilita' dalle righe iva presenti
// e verifica la quadratura del movimento. Ritorna TRUE se il movimento e' scrivibile // e verifica la quadratura del movimento. Ritorna TRUE se il movimento e' scrivibile
bool recalc_cg_rows(); bool recalc_cg_rows(TCausale* caus = NULL);
}; };
TImporto TMovimentoPN_VE::real2imp(TCausale& caus, const real& r, char row_type) TImporto TMovimentoPN_VE::real2imp(const real& r, char row_type)
{ {
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
bool dare; bool dare;
if (row_type == 'S') if (row_type == 'S')
{ {
dare = caus.sezione_ritsoc() == 'D'; dare = _caus->sezione_ritsoc() == 'D';
} }
else else
{ {
dare = caus.sezione_clifo() == 'D'; dare = _caus->sezione_clifo() == 'D';
if (row_type != 'T' && row_type != 'F') if (row_type != 'T' && row_type != 'F')
dare = !dare; dare = !dare;
} }
@ -124,15 +130,16 @@ TImporto TMovimentoPN_VE::real2imp(TCausale& caus, const real& r, char row_type)
return importo; return importo;
} }
bool TMovimentoPN_VE::detraibile(TCausale& caus, TRectype& rec) const bool TMovimentoPN_VE::detraibile(TRectype& rec) const
{ {
if (caus.iva() == iva_vendite) CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
if (_caus->iva() == iva_vendite)
return TRUE; return TRUE;
if (rec.get_int(RMI_TIPODET) != 0) if (rec.get_int(RMI_TIPODET) != 0)
return FALSE; return FALSE;
const real & p = caus.reg().prorata(); const real & p = _caus->reg().prorata();
return p < 100.0; return p < 100.0;
} }
@ -254,29 +261,30 @@ int TMovimentoPN_VE::set_cg_rec(int n, const TImporto& imp, TBill& conto,
return n; return n;
} }
void TMovimentoPN_VE::create_row(TCausale& caus, int i) void TMovimentoPN_VE::create_row(int i)
{ {
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
TRectype& cur = iva(i); TRectype& cur = iva(i);
real oldimp = cur.get_real(RMI_IMPONIBILE); real oldimp = cur.get_real(RMI_IMPONIBILE);
real oldiva = cur.get_real(RMI_IMPOSTA); real oldiva = cur.get_real(RMI_IMPOSTA);
if (oldiva.is_zero() && caus.corrispettivi()) // In caso di corrispettivi ... if (oldiva.is_zero() && _caus->corrispettivi()) // In caso di corrispettivi ...
{ {
const TString zanicchi(cur.get(RMI_CODIVA)); // Codice IVA const TString zanicchi(cur.get(RMI_CODIVA)); // Codice IVA
const TCodiceIVA i(zanicchi); const TCodiceIVA i(zanicchi);
oldiva = i.scorpora(oldimp); // ... scorpora imposta dall'imponibile oldiva = i.scorpora(oldimp); // ... scorpora imposta dall'imponibile
} }
const char tipod = detraibile(caus,cur) ? 'D' : 'N'; const char tipod = detraibile(cur) ? 'D' : 'N';
if (type2pos(tipod) < 0 && !oldiva.is_zero()) if (type2pos(tipod) < 0 && !oldiva.is_zero())
{ {
const int ri = tipod == 'D' ? 3 : 4; // Calcola riga causale per l'IVA const int ri = tipod == 'D' ? 3 : 4; // Calcola riga causale per l'IVA
TBill c; caus.bill(ri, c); TBill c; _caus->bill(ri, c);
if (c.ok()) if (c.ok())
{ {
const TString80 d(caus.desc_agg(ri)); const TString80 d(_caus->desc_agg(ri));
set_cg_rec(-1, real2imp(caus, ZERO, 'I'), c, d, tipod); set_cg_rec(-1, real2imp(ZERO, 'I'), c, d, tipod);
} }
else else
if (ri == 4) // Se non esiste il conto IVA indetraibile ... if (ri == 4) // Se non esiste il conto IVA indetraibile ...
@ -295,19 +303,20 @@ void TMovimentoPN_VE::create_row(TCausale& caus, int i)
{ {
if (bill2pos(oldconto, 'I') < 0) if (bill2pos(oldconto, 'I') < 0)
{ {
const TString d(caus.desc_agg(2)); const TString d(_caus->desc_agg(2));
set_cg_rec(-1, real2imp(caus, ZERO, 'I'), oldconto, d, 'I'); set_cg_rec(-1, real2imp(ZERO, 'I'), oldconto, d, 'I');
} }
} }
} }
void TMovimentoPN_VE::enter_row(TCausale& caus, int i) void TMovimentoPN_VE::enter_row(int i)
{ {
CHECK(_caus,"Orgggssbb..._caus pointer is NULL!");
TRectype& cur = iva(i); TRectype& cur = iva(i);
real imponibile = cur.get_real(RMI_IMPONIBILE); real imponibile = cur.get_real(RMI_IMPONIBILE);
real imposta = cur.get_real(RMI_IMPOSTA); real imposta = cur.get_real(RMI_IMPOSTA);
if (imposta.is_zero() && caus.corrispettivi()) // In caso di corrispettivi ... if (imposta.is_zero() && _caus->corrispettivi()) // In caso di corrispettivi ...
{ {
const TString zanicchi(cur.get(RMI_CODIVA)); const TString zanicchi(cur.get(RMI_CODIVA));
const TCodiceIVA i(zanicchi); const TCodiceIVA i(zanicchi);
@ -323,11 +332,11 @@ void TMovimentoPN_VE::enter_row(TCausale& caus, int i)
int newpos = bill2pos(conto, 'I'); // Riga in cui andra' l'imponibile int newpos = bill2pos(conto, 'I'); // Riga in cui andra' l'imponibile
const bool detrarre = detraibile(caus,cur); // Determina se IVA detraibile const bool detrarre = detraibile(cur); // Determina se IVA detraibile
// Calcola riga causale col conto opportuno // Calcola riga causale col conto opportuno
const int ri = detrarre ? RIGA_IVA_DETRAIBILE : RIGA_IVA_NON_DETRAIBILE; const int ri = detrarre ? RIGA_IVA_DETRAIBILE : RIGA_IVA_NON_DETRAIBILE;
TBill contoiva; caus.bill(ri, contoiva); TBill contoiva; _caus->bill(ri, contoiva);
if (ri == 4 && !contoiva.ok()) // Se non c'e' il conto IVA indetraibile ... if (ri == 4 && !contoiva.ok()) // Se non c'e' il conto IVA indetraibile ...
{ // ... somma imponibile e imposta { // ... somma imponibile e imposta
@ -338,16 +347,16 @@ void TMovimentoPN_VE::enter_row(TCausale& caus, int i)
// Aggiorna conto sulla riga contabile // Aggiorna conto sulla riga contabile
if (newpos < 0) // conto non esistente: da inserire if (newpos < 0) // conto non esistente: da inserire
{ {
const TImporto val(real2imp(caus,imponibile, 'I')); const TImporto val(real2imp(imponibile, 'I'));
if (conto.ok() && !val.is_zero()) // Se c'e' imponibile ... if (conto.ok() && !val.is_zero()) // Se c'e' imponibile ...
{ // crea una nuova riga contabile { // crea una nuova riga contabile
const TString d(caus.desc_agg(2)); const TString d(_caus->desc_agg(2));
set_cg_rec(-1, val, conto, d, 'I'); set_cg_rec(-1, val, conto, d, 'I');
} }
} }
else else
{ {
TImporto val(real2imp(caus,imponibile, 'I')); TImporto val(real2imp(imponibile, 'I'));
add_cg_rec(newpos, val); add_cg_rec(newpos, val);
} }
@ -360,14 +369,14 @@ void TMovimentoPN_VE::enter_row(TCausale& caus, int i)
{ {
if (!imposta.is_zero()) // Se c'e' imposta ... if (!imposta.is_zero()) // Se c'e' imposta ...
{ // ... crea nuova riga per l'IVA { // ... crea nuova riga per l'IVA
const TImporto val(real2imp(caus,imposta, 'I')); const TImporto val(real2imp(imposta, 'I'));
const TString d(caus.desc_agg(ri)); const TString d(_caus->desc_agg(ri));
set_cg_rec(-1, val, contoiva, d, tipod); set_cg_rec(-1, val, contoiva, d, tipod);
} }
} }
else else
{ {
const TImporto val(real2imp(caus,imposta, 'I')); const TImporto val(real2imp(imposta, 'I'));
add_cg_rec(newposiva, val); add_cg_rec(newposiva, val);
} }
} }
@ -392,17 +401,29 @@ bool TMovimentoPN_VE::movement_ok()
return TRUE; return TRUE;
} }
bool TMovimentoPN_VE::recalc_cg_rows() bool TMovimentoPN_VE::recalc_cg_rows(TCausale* caus)
{ {
const int righe = iva_items(); const int righe = iva_items();
TRectype& head = lfile().curr(); bool external_caus = TRUE;
TString16 codcau(head.get(MOV_CODCAUS)); if (caus == NULL)
int year = head.get_int(MOV_ANNOIVA); {
TCausale caus(codcau,year); external_caus = FALSE;
TRectype& head = lfile().curr();
TString16 codcau(head.get(MOV_CODCAUS));
int year = head.get_int(MOV_ANNOIVA);
_caus = new TCausale (codcau,year);
}
else
_caus = caus;
for (int i=0; i<righe; i++) for (int i=0; i<righe; i++)
{ {
create_row(caus, i); create_row(i);
enter_row(caus, i); enter_row(i);
}
if (!external_caus)
{
delete _caus;
_caus = NULL;
} }
return movement_ok(); return movement_ok();
} }
@ -452,12 +473,19 @@ class TContabilizzazione_app : public TApplication
bool _can_write; // se TRUE e' abilitata la scrittura. Non appena rileva un errore rimane a FALSE for this instance bool _can_write; // se TRUE e' abilitata la scrittura. Non appena rileva un errore rimane a FALSE for this instance
bool _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo bool _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo
TMask *_msk; // maschera di selezione dati TMask *_msk; // maschera di selezione dati
TLocalisamfile *_clifo, // file dei clienti e fornitori TRelation *_clifo; // relazione dei clienti e fornitori + cfven
TLocalisamfile *_attiv, // file delle attivita' (per far funzionare TRegistro)
*_fcaus, // file delle causale (per far funzionare TCausale)
*_frcaus, // file delle righe causali (per far funzionare TCausale)
*_part, // file delle partite (per far funzionare TPartita)
*_scad, // file delle scadenze (per far funzionare TPartita)
*_pags, // file dei pagamenti (per far funzionare TPartita)
*_anamag; // file delle anagrafiche di magazzino *_anamag; // file delle anagrafiche di magazzino
TTable *_cpg, // tabella condizioni di pagamento TTable *_cpg, // tabella condizioni di pagamento
*_gmc, // tabella gruppi/sottogruppi merceologici *_gmc, // tabella gruppi/sottogruppi merceologici
*_rfa, // tabella raggruppamenti fiscali *_rfa, // tabella raggruppamenti fiscali
*_cve, // tabella categorie di vendita *_cve, // tabella categorie di vendita
*_val, // tabella valute estere
*_tri, // tabella tipi di riga *_tri, // tabella tipi di riga
*_caa, // tabella categorie acquisto articoli *_caa, // tabella categorie acquisto articoli
*_cra, // tabella categorie ricavo articoli *_cra, // tabella categorie ricavo articoli
@ -701,13 +729,21 @@ bool TContabilizzazione_app::create()
_doc = new TDocumentoEsteso; _doc = new TDocumentoEsteso;
_cpg = new TTable("%CPG"); _cpg = new TTable("%CPG");
_tri = new TTable("%TRI"); _tri = new TTable("%TRI");
_val = new TTable("%VAL");
_caa = new TTable("CAA"); _caa = new TTable("CAA");
_cra = new TTable("CRA"); _cra = new TTable("CRA");
_gmc = new TTable("GMC"); _gmc = new TTable("GMC");
_rfa = new TTable("RFA"); _rfa = new TTable("RFA");
_cve = new TTable("CVE"); _cve = new TTable("CVE");
_cco = new TTable("CCO"); _cco = new TTable("CCO");
_clifo = new TLocalisamfile(LF_CLIFO); _clifo = new TRelation(LF_CLIFO);
_clifo->add(LF_CFVEN,"TIPOCF=TIPOCF|CODCF=CODCF");
_fcaus = new TLocalisamfile(LF_CAUSALI);
_frcaus = new TLocalisamfile(LF_RCAUSALI);
_part = new TLocalisamfile(LF_PARTITE);
_scad = new TLocalisamfile(LF_SCADENZE);
_pags = new TLocalisamfile(LF_PAGSCA);
_attiv = new TLocalisamfile(LF_ATTIV); // Altrimenti TRegistro non va!
_anamag = new TLocalisamfile(LF_ANAMAG); _anamag = new TLocalisamfile(LF_ANAMAG);
TConfig conf(CONFIG_DITTA); TConfig conf(CONFIG_DITTA);
TString val; TString val;
@ -716,7 +752,7 @@ bool TContabilizzazione_app::create()
// Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza // Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza
// presuppone che il programma di configurazione abbia generato correttamente // presuppone che il programma di configurazione abbia generato correttamente
// il tutto. // il tutto.
for (int i=0; i<8;i++) for (int i=0; i<5;i++)
{ {
val = conf.get("RICERCACR","ve",i+1); val = conf.get("RICERCACR","ve",i+1);
if (val.not_empty()) _search_seq.add(val); if (val.not_empty()) _search_seq.add(val);
@ -740,13 +776,20 @@ bool TContabilizzazione_app::destroy()
if (_doc) delete _doc; if (_doc) delete _doc;
if (_cpg) delete _cpg; if (_cpg) delete _cpg;
if (_tri) delete _tri; if (_tri) delete _tri;
if (_val) delete _val;
if (_gmc) delete _gmc; if (_gmc) delete _gmc;
if (_rfa) delete _rfa; if (_rfa) delete _rfa;
if (_cve) delete _cve; if (_cve) delete _cve;
if (_cco) delete _cco; if (_cco) delete _cco;
if (_caa) delete _caa; if (_caa) delete _caa;
if (_cra) delete _cra; if (_cra) delete _cra;
if (_fcaus) delete _fcaus;
if (_frcaus) delete _frcaus;
if (_part) delete _part;
if (_scad) delete _scad;
if (_pags) delete _pags;
if (_clifo) delete _clifo; if (_clifo) delete _clifo;
if (_attiv) delete _attiv;
if (_anamag) delete _anamag; if (_anamag) delete _anamag;
return TApplication::destroy(); return TApplication::destroy();
} }
@ -768,11 +811,10 @@ bool TContabilizzazione_app::menu(MENU_TAG mt)
error_type TContabilizzazione_app::search_costo_ricavo(TBill& conto, const TRiga_documento& r) error_type TContabilizzazione_app::search_costo_ricavo(TBill& conto, const TRiga_documento& r)
{ {
const int items = _search_seq.items(); const int items = _search_seq.items();
const TString tipocf(_doc->get("TIPOCF")); TLocalisamfile & cli_file = _clifo->lfile();
const bool is_cli = tipocf == "C"; const bool is_cli = cli_file.get(CLI_TIPOCF) == "C";
const long codcf = _doc->get_long("CODCF");
bool skip_art_related = FALSE; bool skip_art_related = FALSE;
bool skip_clifo = FALSE; bool skip_clifo = _clifo->bad();
TCodiceIVA codiva(r.get("CODIVA")); TCodiceIVA codiva(r.get("CODIVA"));
int gr,co; int gr,co;
long so; long so;
@ -782,11 +824,6 @@ error_type TContabilizzazione_app::search_costo_ricavo(TBill& conto, const TRiga
if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa. if (_anamag->read() != NOERR) // se non trova l'articolo saltera' anche gmc,smc,rfa.
skip_art_related = TRUE; skip_art_related = TRUE;
_clifo->put(CLI_TIPOCF,tipocf);
_clifo->put(CLI_CODCF,codcf);
if (_clifo->read() != NOERR)
skip_clifo = TRUE;
// Scorre la stringa di ricerca // Scorre la stringa di ricerca
for (int i=0;good() && i<items;i++) for (int i=0;good() && i<items;i++)
{ {
@ -794,9 +831,9 @@ error_type TContabilizzazione_app::search_costo_ricavo(TBill& conto, const TRiga
if (tok == "CF") if (tok == "CF")
{ {
if (skip_clifo) continue; if (skip_clifo) continue;
gr = _clifo->get_int(CLI_GRUPPORIC); gr = cli_file.get_int(CLI_GRUPPORIC);
co = _clifo->get_int(CLI_CONTORIC); co = cli_file().get_int(CLI_CONTORIC);
so = _clifo->get_long(CLI_SOTTOCRIC); so = cli_file().get_long(CLI_SOTTOCRIC);
conto.set(gr,co,so); conto.set(gr,co,so);
if (conto.ok()) break; // se lo trova esce (tutti != 0) if (conto.ok()) break; // se lo trova esce (tutti != 0)
} }
@ -854,11 +891,11 @@ error_type TContabilizzazione_app::search_costo_ricavo(TBill& conto, const TRiga
const bool is_cve = tok == "CV"; const bool is_cve = tok == "CV";
if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione
TTable* t = is_cve ? _cve : _cco; TTable* t = is_cve ? _cve : _cco;
TString cod(is_cve ? _doc->get("CATVEN") : "CATCO"); TString cod(is_cve ? _doc->get("CATVEN") : "");
if (cod.empty()) if (cod.empty())
{ {
if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo if (skip_clifo) continue; // se non aveva trovato il cliente salta al prossimo
cod = _clifo->get(is_cve ? CLI_CATVEN : CLI_CODCATC); cod = _clifo->lfile(LF_CFVEN).get(is_cve ? CFV_CATVEN : CFV_CODCATC);
} }
t->put("CODTAB",cod); t->put("CODTAB",cod);
if (t->read() == NOERR) if (t->read() == NOERR)
@ -935,7 +972,7 @@ error_type TContabilizzazione_app::compile_head_mov()
// reperisce l'ultimo numero di registrazione disponibile // reperisce l'ultimo numero di registrazione disponibile
mov.last(); mov.last();
int numreg = mov.get_int(MOV_NUMREG) + 1; const long numreg = mov.get_int(MOV_NUMREG) + 1;
if (mov.status() != NOERR || numreg < 1) if (mov.status() != NOERR || numreg < 1)
{ {
_error = nr_reg_error; _error = nr_reg_error;
@ -943,18 +980,19 @@ error_type TContabilizzazione_app::compile_head_mov()
} }
TCodice_numerazione cod_num(_doc->numerazione()); TCodice_numerazione cod_num(_doc->numerazione());
TString numdoc;
// calcola il numero documento aggiungendo l'eventuale prefisso/postfisso. // calcola il numero documento aggiungendo l'eventuale prefisso/postfisso.
numdoc = cod_num.complete_num(_doc->numero()); TString numdoc(cod_num.complete_num(_doc->numero()));
if (numdoc.empty() || cod_num.status() != NOERR) if (numdoc.empty() || cod_num.status() != NOERR)
{ {
_error = nr_doc_error; _error = nr_doc_error;
return _error; return _error;
} }
numdoc.upper(); // Il numero documento e' uppercase!
// Istanzia la causale del documento corrente... // Istanzia la causale del documento corrente...
const TTipo_documento& tipo = _doc->tipo(); const TTipo_documento& tipo = _doc->tipo();
_caus = new TCausale(tipo.causale(),data_reg.year()); const TString codcaus(tipo.causale());
_caus = new TCausale(codcaus,data_reg.year());
if (!_caus->ok()) if (!_caus->ok())
{ {
_error = caus_error; _error = caus_error;
@ -988,10 +1026,25 @@ error_type TContabilizzazione_app::compile_head_mov()
// Reperisce la valuta // Reperisce la valuta
TDate datacam(_doc->get_date("DATACAMBIO")); TDate datacam(_doc->get_date("DATACAMBIO"));
TString codval(_doc->valuta()); TString codval(_doc->valuta());
codval.trim();
// Reperisce il cambio
real cambio(_doc->cambio()); real cambio(_doc->cambio());
if (cambio != 1.0 && codval.empty()) codval.trim();
if (codval == "LIT")
{
codval = "";
cambio = ZERO;
}
if (codval.not_empty())
{
_val->put("CODTAB",codval);
if (_val->read() != NOERR)
{
_error = val_error;
return _error;
}
}
// Reperisce il cambio
if ((cambio != ZERO && codval.empty()) ||
cambio == ZERO && codval.not_empty())
{ {
_error = change_error; _error = change_error;
return _error; return _error;
@ -1002,10 +1055,11 @@ error_type TContabilizzazione_app::compile_head_mov()
long codcf = _doc->get_long("CODCF"); long codcf = _doc->get_long("CODCF");
TString occas; TString occas;
{ {
_clifo->put(CLI_TIPOCF,tipocf); _clifo->put(CLI_CODCF,codcf); TLocalisamfile& cli_file = _clifo->lfile();
if (_clifo->read() == NOERR) cli_file.put(CLI_TIPOCF,tipocf); cli_file.put(CLI_CODCF,codcf);
if (_clifo->read(_isequal) == NOERR) // posiziona il cliente una volta per tutte
{ {
if (_clifo->get_bool(CLI_OCCAS)) if (cli_file.get_bool(CLI_OCCAS))
{ {
occas = _doc->get("OCFPI"); occas = _doc->get("OCFPI");
TLocalisamfile ocf(LF_OCCAS); TLocalisamfile ocf(LF_OCCAS);
@ -1043,7 +1097,8 @@ error_type TContabilizzazione_app::compile_head_mov()
if (registro.agenzia_viaggi()) mov_rec.put(MOV_DATA74TER,data_reg); if (registro.agenzia_viaggi()) mov_rec.put(MOV_DATA74TER,data_reg);
mov_rec.put(MOV_NUMDOC,numdoc); mov_rec.put(MOV_TIPODOC,_caus->tipo_doc()); mov_rec.put(MOV_NUMDOC,numdoc); mov_rec.put(MOV_TIPODOC,_caus->tipo_doc());
mov_rec.put(MOV_CODCAUS,_caus->codice()); mov_rec.put(MOV_DESCR,descr); mov_rec.put(MOV_CODCAUS,_caus->codice()); mov_rec.put(MOV_DESCR,descr);
mov_rec.put(MOV_TIPOMOV,_caus->tipomov()); mov_rec.put(MOV_ANNOIVA,data_reg.year()); mov_rec.put(MOV_TIPOMOV,_caus->tipomov()+'0'); mov_rec.put(MOV_ANNOIVA,data_reg.year());
mov_rec.put(MOV_REG,registro.name());
mov_rec.put(MOV_PROTIVA,ult_prot); mov_rec.put(MOV_CODVAL,codval); mov_rec.put(MOV_PROTIVA,ult_prot); mov_rec.put(MOV_CODVAL,codval);
mov_rec.put(MOV_CAMBIO,cambio); mov_rec.put(MOV_TIPO,tipocf); mov_rec.put(MOV_CAMBIO,cambio); mov_rec.put(MOV_TIPO,tipocf);
mov_rec.put(MOV_DATACAM,datacam); mov_rec.put(MOV_DATACAM,datacam);
@ -1103,11 +1158,10 @@ error_type TContabilizzazione_app::create_iva_rows()
TString16 codiva; TString16 codiva;
TBill conto; TBill conto;
int annoes = head.get_int(MOV_ANNOES); const int annoes = head.get_int(MOV_ANNOES);
long numreg = head.get_long(MOV_NUMREG); const long numreg = head.get_long(MOV_NUMREG);
real cambio = 1.0; real cambio = head.get_real(MOV_CAMBIO);
real imponibile,imposta; real imponibile,imposta;
if (in_valuta) cambio = head.get_real(MOV_CAMBIO);
for (int i = 0; i<items && cur != NULL;i++) for (int i = 0; i<items && cur != NULL;i++)
{ {
@ -1132,7 +1186,7 @@ error_type TContabilizzazione_app::create_iva_rows()
TRectype& rec_iva = _movimento->iva(i); TRectype& rec_iva = _movimento->iva(i);
rec_iva.put(RMI_ANNOES,annoes); rec_iva.put(RMI_ANNOES,annoes);
rec_iva.put(RMI_NUMREG,numreg); rec_iva.put(RMI_NUMREG,numreg);
rec_iva.put(RMI_NUMRIG,i); rec_iva.put(RMI_NUMRIG,i+1); // La numerazione comincia da 1
rec_iva.put(RMI_CODIVA,codiva); rec_iva.put(RMI_CODIVA,codiva);
rec_iva.put(RMI_IMPONIBILE,imponibile); rec_iva.put(RMI_IMPONIBILE,imponibile);
rec_iva.put(RMI_IMPOSTA,imposta); rec_iva.put(RMI_IMPOSTA,imposta);
@ -1152,30 +1206,28 @@ error_type TContabilizzazione_app::create_total_doc_row()
{ {
TRectype& rec_cg = _movimento->cg(0); TRectype& rec_cg = _movimento->cg(0);
TRectype& head = _movimento->lfile().curr(); TRectype& head = _movimento->lfile().curr();
int annoes = head.get_int(MOV_ANNOES); const int annoes = head.get_int(MOV_ANNOES);
long numreg = head.get_long(MOV_NUMREG); const long numreg = head.get_long(MOV_NUMREG);
TDate datareg(head.get_date(MOV_DATAREG)); TDate datareg(head.get_date(MOV_DATAREG));
real totdoc(head.get_real(MOV_TOTDOC)); real totdoc(head.get_real(MOV_TOTDOC));
char rowtype = 'T'; char rowtype = 'T';
TString16 tipocf(_doc->get("TIPOCF")); TLocalisamfile& cli_file = _clifo->lfile();
const long codcf = _doc->get_long("CODCF"); TString16 tipocf(cli_file.get(CLI_TIPOCF));
const long codcf = cli_file.get_long(CLI_CODCF);
int gruppo = 0, conto = 0; int gruppo = 0, conto = 0;
// Trova il mastro del cliente/fornitore // Trova il mastro del cliente/fornitore
_clifo->put(CLI_TIPOCF,tipocf); // cerca prima sul record del cliente/fornitore
_clifo->put(CLI_CODCF,codcf); if (_clifo->good())
// cerca prima sul record
if (_clifo->read() == NOERR)
{ {
gruppo = _clifo->get_int(CLI_GRUPPO); gruppo = cli_file.get_int(CLI_GRUPPO);
conto = _clifo->get_int(CLI_CONTO); conto = cli_file.get_int(CLI_CONTO);
} }
// poi sulla categoria di vendita (solo per i clienti) // poi sulla categoria di vendita (solo per i clienti)
if ((_clifo->bad() || gruppo == 0 || conto == 0) && tipocf == "C") if ((gruppo == 0 || conto == 0) && tipocf == "C")
{ {
TString16 cod_cve(_clifo->get(CLI_CATVEN)); TString16 cod_cve(_clifo->lfile(LF_CFVEN).get(CFV_CATVEN));
_cve->put("CODTAB",cod_cve); _cve->put("CODTAB",cod_cve);
if (_cve->read() == NOERR) if (_cve->read() == NOERR)
{ {
@ -1218,12 +1270,13 @@ error_type TContabilizzazione_app::create_total_doc_row()
error_type TContabilizzazione_app::compile_rows_mov() error_type TContabilizzazione_app::compile_rows_mov()
// Compila le righe // Compila le righe
{ {
_doc->compile_summary(); // Calcola imposta/imponibile per riga // A questo punto il documento e' gia stato calcolato, percio' non c'e' bisogno di
// chiamare la compile_summary() del documento.
const int rows = _doc->rows(); const int rows = _doc->rows();
const TArray& sum_arr = _doc->summary_array(); const TArray& sum_arr = _doc->summary_array();
_righe_iva.destroy(); // resetta l'assoc_array delle righe di iva _righe_iva.destroy(); // resetta l'assoc_array delle righe di iva
for (int i=0; good() && i<rows; i++) // browse all this fucked document rows for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows
{ {
const TRiga_documento& r= (*_doc)[i]; const TRiga_documento& r= (*_doc)[i];
TString16 tiporiga(r.get("TIPORIGA")); TString16 tiporiga(r.get("TIPORIGA"));
@ -1231,25 +1284,34 @@ error_type TContabilizzazione_app::compile_rows_mov()
if (_tri->read() == NOERR) // controlla l'esistenza della riga if (_tri->read() == NOERR) // controlla l'esistenza della riga
{ {
char s4 = _tri->get("S4")[0]; char s4 = _tri->get("S4")[0];
if (s4 == 'D') continue; // salta le righe descrizione switch (s4)
//TBI:
// righe di (S)pese e s(C)onti
if (s4 == 'M') // queste sono le righe di merce. (! big elaboration !)
{ {
TBill conto; case 'M': // righe merce
search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
if (good())
{ {
TRiepilogo_Iva& ri = (TRiepilogo_Iva&) sum_arr[i]; TBill conto;
add_iva_row(conto,ri); search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
if (good())
{
TRiepilogo_Iva& ri = (TRiepilogo_Iva&) sum_arr[i];
add_iva_row(conto,ri);
}
break;
} }
case 'S': // righe spese (TBI)
break;
case 'C': // righe sconti (TBI)
break;
case 'D':
default :
break;
} }
} }
else else
_error = row_type_error; _error = row_type_error;
} }
if (good() && _righe_iva.items() == 0)
_error = no_rows_error;
// Crea le righe di IVA // Crea le righe di IVA
if (good()) if (good())
create_iva_rows(); create_iva_rows();
@ -1258,22 +1320,23 @@ error_type TContabilizzazione_app::compile_rows_mov()
create_total_doc_row(); create_total_doc_row();
// crea le righe di contabilita' // crea le righe di contabilita'
if (good()) if (good())
if (!_movimento->recalc_cg_rows()) _error = movement_error; if (!_movimento->recalc_cg_rows(_caus)) _error = movement_error;
return _error; return _error;
} }
void TContabilizzazione_app::calc_pagament() void TContabilizzazione_app::calc_pagament()
{ {
TString16 codpag(_doc->get("CODPAG")); TRectype& head = _movimento->lfile().curr();
TString16 codpag(head.get(MOV_CODPAG));
TString16 data(_doc->get("DATAINSC")); TString16 data(_doc->get("DATAINSC"));
_pagamento = new TPagamento(codpag, data); _pagamento = new TPagamento(codpag, data);
real totspese = _doc->tot_spese(); real totspese = _doc->tot_spese();
real totimposte = _doc->tot_imposte(); real totimposte = _doc->tot_imposte();
real totimponibili = _doc->tot_documento() - totimposte - totspese; real totimponibili = _doc->tot_documento() - totimposte - totspese;
const bool valuta = _doc->in_valuta(); const bool valuta = head.get(MOV_CODVAL).not_empty();
if (valuta) if (valuta)
{ {
const real change(_doc->cambio()); const real change(head.get_real(MOV_CAMBIO));
real val1 = totimponibili * change; real val1 = totimponibili * change;
real val2 = totimposte * change; real val2 = totimposte * change;
real val3 = totspese * change; real val3 = totspese * change;
@ -1292,7 +1355,7 @@ error_type TContabilizzazione_app::write_scadenze()
const TRectype& head = _movimento->lfile().curr(); const TRectype& head = _movimento->lfile().curr();
const long nreg = head.get_long(MOV_NUMREG); const long nreg = head.get_long(MOV_NUMREG);
const int anno = head.get_int(MOV_ANNOIVA); const int anno = head.get_int(MOV_ANNOIVA);
const TString numpart(_nump_cfg ? MOV_PROTIVA : MOV_NUMDOC); const TString numpart(head.get(_nump_cfg ? MOV_PROTIVA : MOV_NUMDOC));
//TPartita* oldgame = partite().first(); //TPartita* oldgame = partite().first();
TPartita* newgame = NULL; TPartita* newgame = NULL;
@ -1393,7 +1456,7 @@ error_type TContabilizzazione_app::write_scadenze()
delete newgame; delete newgame;
} }
if (_pagamento) if (_pagamento != NULL)
{ {
delete _pagamento; delete _pagamento;
_pagamento = NULL; _pagamento = NULL;
@ -1481,6 +1544,10 @@ void TContabilizzazione_app::display_error()
msg.format("Rilevato un cambio senza valuta relativamente al documento %s/%ld." msg.format("Rilevato un cambio senza valuta relativamente al documento %s/%ld."
"Verificare la correttezza delle informazioni inserite.",(const char*)_doc->numerazione(),_doc->numero()); "Verificare la correttezza delle informazioni inserite.",(const char*)_doc->numerazione(),_doc->numero());
break; break;
case val_error:
msg.format("Rilevato un codice valuta inesistente relativamente al documento %s/%ld."
"Verificare la correttezza della informazione inserita.",(const char*)_doc->numerazione(),_doc->numero());
break;
case codpag_error: case codpag_error:
msg.format("Rilevato un codice pagamento non esistente relativamente al documento %s/%ld." msg.format("Rilevato un codice pagamento non esistente relativamente al documento %s/%ld."
"Verificare l'esistenza del codice pagamento inserito.",(const char*)_doc->numerazione(),_doc->numero()); "Verificare l'esistenza del codice pagamento inserito.",(const char*)_doc->numerazione(),_doc->numero());
@ -1489,6 +1556,10 @@ void TContabilizzazione_app::display_error()
msg.format("Rilevato un codice tipo riga non esistente relativamente al documento %s/%ld." msg.format("Rilevato un codice tipo riga non esistente relativamente al documento %s/%ld."
"Verificare l'esistenza dei vari codici riga inseriti.",(const char*)_doc->numerazione(),_doc->numero()); "Verificare l'esistenza dei vari codici riga inseriti.",(const char*)_doc->numerazione(),_doc->numero());
break; break;
case no_rows_error:
msg.format("Nessuna riga iva contabile e' stata trovata relativamente al documento %s/%ld."
"Verificare l'esistenza dei vari codici riga inseriti.",(const char*)_doc->numerazione(),_doc->numero());
break;
case conto_error: case conto_error:
msg.format("Rilevato un conto di costo/ricavo inesistente relativamente al documento %s/%ld." msg.format("Rilevato un conto di costo/ricavo inesistente relativamente al documento %s/%ld."
"Verificare l'esistenza dei conti associati.",(const char*)_doc->numerazione(),_doc->numero()); "Verificare l'esistenza dei conti associati.",(const char*)_doc->numerazione(),_doc->numero());
@ -1524,7 +1595,11 @@ void TContabilizzazione_app::contabilize_document()
_total_docs++; _total_docs++;
change_doc_status(); change_doc_status();
} }
delete _caus; if (_caus != NULL)
{
delete _caus;
_caus = NULL;
}
delete _movimento; delete _movimento;
} }
@ -1534,20 +1609,25 @@ void TContabilizzazione_app::contabilize()
TLocalisamfile righe_doc(LF_RIGHEDOC); TLocalisamfile righe_doc(LF_RIGHEDOC);
TRectype da(LF_DOC),a(LF_DOC); TRectype da(LF_DOC),a(LF_DOC);
const long items = _num_sheet->items(); const long items = _num_sheet->items();
TString16 codnum;
TString msg;
_total_docs = 0; _total_docs = 0;
for (long i=0L; i<items;i++) // Scorre per tutte le numerazioni dello sheet for (long i=0L; i<items;i++) // Scorre per tutte le numerazioni dello sheet
if (_num_sheet->checked(i)) // Se la numerazione corrente e' stata selezionata if (_num_sheet->checked(i)) // Se la numerazione corrente e' stata selezionata
{ // istanzia un cursore per la numerazione corrente, con i limiti di data { // istanzia un cursore per la numerazione corrente, con i limiti di data
TString16 codnum(_num_sheet->row(i).get(1)); codnum = _num_sheet->row(i).get(1);
da.put("DATADOC",_data_ini); da.put("DATADOC",_data_ini);
da.put("CODNUM",codnum); da.put("CODNUM",codnum);
a.put("DATADOC",_data_fine); a.put("DATADOC",_data_fine);
da.put("CODNUM",codnum); a.put("CODNUM",codnum);
TCursor doc_cur(&doc_rel,"",3,&da,&a); TCursor doc_cur(&doc_rel,"",3,&da,&a);
const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato
TString msg; msg = "Contabilizzazione documenti ";
msg.format("Contabilizzazione documenti %s dal %s al %s",(const char*)codnum,(const char*) _data_ini, (const char*) _data_fine); msg << codnum << " dal ";
msg << _data_ini.string() << " al ";
msg << _data_fine.string();
#ifdef DBG #ifdef DBG
TProgind p(cur_items,msg,TRUE,TRUE,1); TProgind p(cur_items,msg,TRUE,TRUE,1);
#else #else
@ -1562,11 +1642,17 @@ void TContabilizzazione_app::contabilize()
{ {
p.setstatus(j+1); p.setstatus(j+1);
doc_cur = j; doc_cur = j;
_doc->read(doc_cur.curr()); // istanzia il documento _doc->read(doc_cur.curr()); // legge il documento
if (doc_tipo_stato_ok()) // controlla che il tipo documento e lo stato siano coerenti con la ELD selezionata if (doc_tipo_stato_ok()) // controlla che il tipo documento e lo stato siano coerenti con la ELD selezionata
contabilize_document(); contabilize_document();
else else
_error = elaboration_error; {
// ATTENZIONE!: se non ha ancora cominciato a contabilizzare, eventuali
// documenti con tipo o stato differenti vengono semplicemente scartati
// senza segnalare errori
if (_total_docs > 0)
_error = elaboration_error;
}
if (!good()) if (!good())
display_error(); display_error();
} }