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 <rmoviva.h>
#include <clifo.h>
#include <cfven.h>
#include <occas.h>
#include <scadenze.h>
@ -60,8 +61,10 @@ enum error_type {
caus_error,
register_error,
change_error,
val_error,
codpag_error,
row_type_error,
no_rows_error,
conto_error,
movement_error,
mov_write_error,
@ -76,19 +79,21 @@ enum error_type {
class TMovimentoPN_VE : public TMovimentoPN
{
TCausale * _caus;
protected:
// 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
void enter_row(TCausale& caus, int i);
void enter_row(int i);
// 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
int type2pos(char tipo);
// Trova nelle righe contabili un conto nelle righe di tipo prescelto
int bill2pos(const TBill& conto, char tipo);
// 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'
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'
@ -103,19 +108,20 @@ public:
bool movement_ok() ;
// ricalcola le righe di contabilita' dalle righe iva presenti
// 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;
if (row_type == 'S')
{
dare = caus.sezione_ritsoc() == 'D';
dare = _caus->sezione_ritsoc() == 'D';
}
else
{
dare = caus.sezione_clifo() == 'D';
dare = _caus->sezione_clifo() == 'D';
if (row_type != 'T' && row_type != 'F')
dare = !dare;
}
@ -124,15 +130,16 @@ TImporto TMovimentoPN_VE::real2imp(TCausale& caus, const real& r, char row_type)
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;
if (rec.get_int(RMI_TIPODET) != 0)
return FALSE;
const real & p = caus.reg().prorata();
const real & p = _caus->reg().prorata();
return p < 100.0;
}
@ -254,29 +261,30 @@ int TMovimentoPN_VE::set_cg_rec(int n, const TImporto& imp, TBill& conto,
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);
real oldimp = cur.get_real(RMI_IMPONIBILE);
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 TCodiceIVA i(zanicchi);
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())
{
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())
{
const TString80 d(caus.desc_agg(ri));
set_cg_rec(-1, real2imp(caus, ZERO, 'I'), c, d, tipod);
const TString80 d(_caus->desc_agg(ri));
set_cg_rec(-1, real2imp(ZERO, 'I'), c, d, tipod);
}
else
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)
{
const TString d(caus.desc_agg(2));
set_cg_rec(-1, real2imp(caus, ZERO, 'I'), oldconto, d, 'I');
const TString d(_caus->desc_agg(2));
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);
real imponibile = cur.get_real(RMI_IMPONIBILE);
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 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
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
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 ...
{ // ... somma imponibile e imposta
@ -338,16 +347,16 @@ void TMovimentoPN_VE::enter_row(TCausale& caus, int i)
// Aggiorna conto sulla riga contabile
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 ...
{ // 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');
}
}
else
{
TImporto val(real2imp(caus,imponibile, 'I'));
TImporto val(real2imp(imponibile, 'I'));
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 ...
{ // ... crea nuova riga per l'IVA
const TImporto val(real2imp(caus,imposta, 'I'));
const TString d(caus.desc_agg(ri));
const TImporto val(real2imp(imposta, 'I'));
const TString d(_caus->desc_agg(ri));
set_cg_rec(-1, val, contoiva, d, tipod);
}
}
else
{
const TImporto val(real2imp(caus,imposta, 'I'));
const TImporto val(real2imp(imposta, 'I'));
add_cg_rec(newposiva, val);
}
}
@ -392,17 +401,29 @@ bool TMovimentoPN_VE::movement_ok()
return TRUE;
}
bool TMovimentoPN_VE::recalc_cg_rows()
bool TMovimentoPN_VE::recalc_cg_rows(TCausale* caus)
{
const int righe = iva_items();
TRectype& head = lfile().curr();
TString16 codcau(head.get(MOV_CODCAUS));
int year = head.get_int(MOV_ANNOIVA);
TCausale caus(codcau,year);
bool external_caus = TRUE;
if (caus == NULL)
{
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++)
{
create_row(caus, i);
enter_row(caus, i);
create_row(i);
enter_row(i);
}
if (!external_caus)
{
delete _caus;
_caus = NULL;
}
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 _nump_cfg; // se TRUE prende il numero rif. partita dal numero protocollo
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
TTable *_cpg, // tabella condizioni di pagamento
*_gmc, // tabella gruppi/sottogruppi merceologici
*_rfa, // tabella raggruppamenti fiscali
*_cve, // tabella categorie di vendita
*_val, // tabella valute estere
*_tri, // tabella tipi di riga
*_caa, // tabella categorie acquisto articoli
*_cra, // tabella categorie ricavo articoli
@ -701,13 +729,21 @@ bool TContabilizzazione_app::create()
_doc = new TDocumentoEsteso;
_cpg = new TTable("%CPG");
_tri = new TTable("%TRI");
_val = new TTable("%VAL");
_caa = new TTable("CAA");
_cra = new TTable("CRA");
_gmc = new TTable("GMC");
_rfa = new TTable("RFA");
_cve = new TTable("CVE");
_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);
TConfig conf(CONFIG_DITTA);
TString val;
@ -716,7 +752,7 @@ bool TContabilizzazione_app::create()
// Attenzione! non esegue alcun controllo di consistenza sulla corretta sequenza
// presuppone che il programma di configurazione abbia generato correttamente
// il tutto.
for (int i=0; i<8;i++)
for (int i=0; i<5;i++)
{
val = conf.get("RICERCACR","ve",i+1);
if (val.not_empty()) _search_seq.add(val);
@ -740,13 +776,20 @@ bool TContabilizzazione_app::destroy()
if (_doc) delete _doc;
if (_cpg) delete _cpg;
if (_tri) delete _tri;
if (_val) delete _val;
if (_gmc) delete _gmc;
if (_rfa) delete _rfa;
if (_cve) delete _cve;
if (_cco) delete _cco;
if (_caa) delete _caa;
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 (_attiv) delete _attiv;
if (_anamag) delete _anamag;
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)
{
const int items = _search_seq.items();
const TString tipocf(_doc->get("TIPOCF"));
const bool is_cli = tipocf == "C";
const long codcf = _doc->get_long("CODCF");
TLocalisamfile & cli_file = _clifo->lfile();
const bool is_cli = cli_file.get(CLI_TIPOCF) == "C";
bool skip_art_related = FALSE;
bool skip_clifo = FALSE;
bool skip_clifo = _clifo->bad();
TCodiceIVA codiva(r.get("CODIVA"));
int gr,co;
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.
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
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 (skip_clifo) continue;
gr = _clifo->get_int(CLI_GRUPPORIC);
co = _clifo->get_int(CLI_CONTORIC);
so = _clifo->get_long(CLI_SOTTOCRIC);
gr = cli_file.get_int(CLI_GRUPPORIC);
co = cli_file().get_int(CLI_CONTORIC);
so = cli_file().get_long(CLI_SOTTOCRIC);
conto.set(gr,co,so);
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";
if (is_cve && !is_cli) continue; // se e' un fornitore salta questa condizione
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 (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);
if (t->read() == NOERR)
@ -935,7 +972,7 @@ error_type TContabilizzazione_app::compile_head_mov()
// reperisce l'ultimo numero di registrazione disponibile
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)
{
_error = nr_reg_error;
@ -943,18 +980,19 @@ error_type TContabilizzazione_app::compile_head_mov()
}
TCodice_numerazione cod_num(_doc->numerazione());
TString numdoc;
// 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)
{
_error = nr_doc_error;
return _error;
}
numdoc.upper(); // Il numero documento e' uppercase!
// Istanzia la causale del documento corrente...
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())
{
_error = caus_error;
@ -988,10 +1026,25 @@ error_type TContabilizzazione_app::compile_head_mov()
// Reperisce la valuta
TDate datacam(_doc->get_date("DATACAMBIO"));
TString codval(_doc->valuta());
codval.trim();
// Reperisce il 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;
return _error;
@ -1002,10 +1055,11 @@ error_type TContabilizzazione_app::compile_head_mov()
long codcf = _doc->get_long("CODCF");
TString occas;
{
_clifo->put(CLI_TIPOCF,tipocf); _clifo->put(CLI_CODCF,codcf);
if (_clifo->read() == NOERR)
TLocalisamfile& cli_file = _clifo->lfile();
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");
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);
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_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_CAMBIO,cambio); mov_rec.put(MOV_TIPO,tipocf);
mov_rec.put(MOV_DATACAM,datacam);
@ -1103,11 +1158,10 @@ error_type TContabilizzazione_app::create_iva_rows()
TString16 codiva;
TBill conto;
int annoes = head.get_int(MOV_ANNOES);
long numreg = head.get_long(MOV_NUMREG);
real cambio = 1.0;
const int annoes = head.get_int(MOV_ANNOES);
const long numreg = head.get_long(MOV_NUMREG);
real cambio = head.get_real(MOV_CAMBIO);
real imponibile,imposta;
if (in_valuta) cambio = head.get_real(MOV_CAMBIO);
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);
rec_iva.put(RMI_ANNOES,annoes);
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_IMPONIBILE,imponibile);
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& head = _movimento->lfile().curr();
int annoes = head.get_int(MOV_ANNOES);
long numreg = head.get_long(MOV_NUMREG);
const int annoes = head.get_int(MOV_ANNOES);
const long numreg = head.get_long(MOV_NUMREG);
TDate datareg(head.get_date(MOV_DATAREG));
real totdoc(head.get_real(MOV_TOTDOC));
char rowtype = 'T';
TString16 tipocf(_doc->get("TIPOCF"));
const long codcf = _doc->get_long("CODCF");
TLocalisamfile& cli_file = _clifo->lfile();
TString16 tipocf(cli_file.get(CLI_TIPOCF));
const long codcf = cli_file.get_long(CLI_CODCF);
int gruppo = 0, conto = 0;
// Trova il mastro del cliente/fornitore
_clifo->put(CLI_TIPOCF,tipocf);
_clifo->put(CLI_CODCF,codcf);
// cerca prima sul record
if (_clifo->read() == NOERR)
// cerca prima sul record del cliente/fornitore
if (_clifo->good())
{
gruppo = _clifo->get_int(CLI_GRUPPO);
conto = _clifo->get_int(CLI_CONTO);
gruppo = cli_file.get_int(CLI_GRUPPO);
conto = cli_file.get_int(CLI_CONTO);
}
// 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);
if (_cve->read() == NOERR)
{
@ -1218,12 +1270,13 @@ error_type TContabilizzazione_app::create_total_doc_row()
error_type TContabilizzazione_app::compile_rows_mov()
// 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 TArray& sum_arr = _doc->summary_array();
_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];
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
{
char s4 = _tri->get("S4")[0];
if (s4 == 'D') continue; // salta le righe descrizione
//TBI:
// righe di (S)pese e s(C)onti
if (s4 == 'M') // queste sono le righe di merce. (! big elaboration !)
switch (s4)
{
TBill conto;
search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
if (good())
case 'M': // righe merce
{
TRiepilogo_Iva& ri = (TRiepilogo_Iva&) sum_arr[i];
add_iva_row(conto,ri);
TBill conto;
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
_error = row_type_error;
}
if (good() && _righe_iva.items() == 0)
_error = no_rows_error;
// Crea le righe di IVA
if (good())
create_iva_rows();
@ -1258,22 +1320,23 @@ error_type TContabilizzazione_app::compile_rows_mov()
create_total_doc_row();
// crea le righe di contabilita'
if (good())
if (!_movimento->recalc_cg_rows()) _error = movement_error;
if (!_movimento->recalc_cg_rows(_caus)) _error = movement_error;
return _error;
}
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"));
_pagamento = new TPagamento(codpag, data);
real totspese = _doc->tot_spese();
real totimposte = _doc->tot_imposte();
real totimponibili = _doc->tot_documento() - totimposte - totspese;
const bool valuta = _doc->in_valuta();
const bool valuta = head.get(MOV_CODVAL).not_empty();
if (valuta)
{
const real change(_doc->cambio());
const real change(head.get_real(MOV_CAMBIO));
real val1 = totimponibili * change;
real val2 = totimposte * change;
real val3 = totspese * change;
@ -1292,7 +1355,7 @@ error_type TContabilizzazione_app::write_scadenze()
const TRectype& head = _movimento->lfile().curr();
const long nreg = head.get_long(MOV_NUMREG);
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* newgame = NULL;
@ -1393,7 +1456,7 @@ error_type TContabilizzazione_app::write_scadenze()
delete newgame;
}
if (_pagamento)
if (_pagamento != NULL)
{
delete _pagamento;
_pagamento = NULL;
@ -1481,6 +1544,10 @@ void TContabilizzazione_app::display_error()
msg.format("Rilevato un cambio senza valuta relativamente al documento %s/%ld."
"Verificare la correttezza delle informazioni inserite.",(const char*)_doc->numerazione(),_doc->numero());
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:
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());
@ -1489,6 +1556,10 @@ void TContabilizzazione_app::display_error()
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());
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:
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());
@ -1524,7 +1595,11 @@ void TContabilizzazione_app::contabilize_document()
_total_docs++;
change_doc_status();
}
delete _caus;
if (_caus != NULL)
{
delete _caus;
_caus = NULL;
}
delete _movimento;
}
@ -1534,20 +1609,25 @@ void TContabilizzazione_app::contabilize()
TLocalisamfile righe_doc(LF_RIGHEDOC);
TRectype da(LF_DOC),a(LF_DOC);
const long items = _num_sheet->items();
TString16 codnum;
TString msg;
_total_docs = 0;
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
{ // 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("CODNUM",codnum);
a.put("DATADOC",_data_fine);
da.put("CODNUM",codnum);
a.put("CODNUM",codnum);
TCursor doc_cur(&doc_rel,"",3,&da,&a);
const long cur_items = doc_cur.items(); // Scorre tutti i documenti che rientrano nell'intervallo selezionato
TString msg;
msg.format("Contabilizzazione documenti %s dal %s al %s",(const char*)codnum,(const char*) _data_ini, (const char*) _data_fine);
msg = "Contabilizzazione documenti ";
msg << codnum << " dal ";
msg << _data_ini.string() << " al ";
msg << _data_fine.string();
#ifdef DBG
TProgind p(cur_items,msg,TRUE,TRUE,1);
#else
@ -1562,11 +1642,17 @@ void TContabilizzazione_app::contabilize()
{
p.setstatus(j+1);
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
contabilize_document();
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())
display_error();
}