Aggiunta possibilita' di contabilizzare le merci al lordo degli

sconti.
Cambiato il modo di contabilizzare gli sconti di riga ad importo
e percentuale.


git-svn-id: svn://10.65.10.50/trunk@5211 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
angelo 1997-09-15 14:30:10 +00:00
parent 60c5e6f84c
commit cf8a6e1b55
7 changed files with 203 additions and 37 deletions

View File

@ -142,6 +142,12 @@ GROUP 3
//WARNING "La sequenza di ricerca per anagrafica deve indicare quattro tipi diversi" //WARNING "La sequenza di ricerca per anagrafica deve indicare quattro tipi diversi"
END END
BOOLEAN F_SCONTO_LORDO
BEGIN
PROMPT 2 14 "Contabilizzazione merci al lordo "
FIELD CONTSCLOR
END
ENDPAGE ENDPAGE
ENDMASK ENDMASK

View File

@ -27,5 +27,6 @@ int main( int argc, char** argv )
error_box( usage, argv[0] ); error_box( usage, argv[0] );
break; break;
} }
exit(0);
return rt; return rt;
} }

View File

@ -101,6 +101,8 @@ bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k)
if (k==K_ENTER && f.dirty()) if (k==K_ENTER && f.dirty())
{ {
TMask& m = f.mask(); TMask& m = f.mask();
if (m.get_bool(F_DATA_AUTO))
return TRUE; // Skip controls if data is automatic
TDate da(m.get_date(F_DATA_INI)); TDate da(m.get_date(F_DATA_INI));
TDate a(m.get_date(F_DATA_FIN)); TDate a(m.get_date(F_DATA_FIN));
m.field(F_DATA_REG).set_dirty(); m.field(F_DATA_REG).set_dirty();
@ -115,6 +117,14 @@ bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k)
f.error_box("L'intervallo tra le date non puo' eccedere i 15 giorni."); f.error_box("L'intervallo tra le date non puo' eccedere i 15 giorni.");
return FALSE; return FALSE;
} }
if (F_DATA_FIN)
m.set(F_DATA_REG,f.get());
}
if (f.focusdirty())
{
TMask& m = f.mask();
if (!m.get_bool(F_DATA_AUTO) && f.dlg() == F_DATA_FIN)
m.set(F_DATA_REG,f.get());
} }
return TRUE; return TRUE;
} }
@ -259,7 +269,7 @@ bool TContabilizzazione_app::create()
_msk->set_handler(F_CODICE_ELAB,handle_cod_eld); _msk->set_handler(F_CODICE_ELAB,handle_cod_eld);
_msk->set_handler(F_DATA_INI,handle_data_range); _msk->set_handler(F_DATA_INI,handle_data_range);
_msk->set_handler(F_DATA_FIN,handle_data_range); _msk->set_handler(F_DATA_FIN,handle_data_range);
_msk->set_handler(F_DATA_REG,handle_data_reg); //_msk->set_handler(F_DATA_REG,handle_data_reg);
_msk->set_handler(DLG_USER,handle_select); _msk->set_handler(DLG_USER,handle_select);
_num_sheet = new TArray_sheet(-1,-1,-4,-4,"Codici numerazione", _num_sheet = new TArray_sheet(-1,-1,-4,-4,"Codici numerazione",
"@1|Cod. numerazione|Descrizione@50"); "@1|Cod. numerazione|Descrizione@50");

View File

@ -49,15 +49,12 @@ BOOLEAN F_DATA_AUTO
BEGIN BEGIN
PROMPT 42 5 "Data registrazione automatica" PROMPT 42 5 "Data registrazione automatica"
MESSAGE TRUE CLEAR,F_DATA_REG|"",F_DATA_REG MESSAGE TRUE CLEAR,F_DATA_REG|"",F_DATA_REG
MESSAGE FALSE ENABLE,F_DATA_REG
END END
DATE F_DATA_REG DATE F_DATA_REG
BEGIN BEGIN
PROMPT 42 6 "Data registrazione " PROMPT 42 6 "Data registrazione "
FLAG "A" FLAG "D"
VALIDATE NOT_EMPTY_FUNC
WARNING "La data registrazione e' obbligatoria"
END END
RADIOBUTTON F_SELPROT 1 32 RADIOBUTTON F_SELPROT 1 32

View File

@ -86,6 +86,7 @@
#define F_RICERCAAN2 107 #define F_RICERCAAN2 107
#define F_RICERCAAN3 108 #define F_RICERCAAN3 108
#define F_RICERCAAN4 109 #define F_RICERCAAN4 109
#define F_SCONTO_LORDO 110
// Campi per ve0200f.uml // Campi per ve0200f.uml
#define F_IMPSPINC1 101 #define F_IMPSPINC1 101

View File

@ -399,6 +399,7 @@ public:
real prezzo(bool scontato, bool lordo, int ndec = AUTO_DECIMALS) const ; real prezzo(bool scontato, bool lordo, int ndec = AUTO_DECIMALS) const ;
real importo(bool scontato , bool lordo, int ndec = AUTO_DECIMALS) const ; real importo(bool scontato , bool lordo, int ndec = AUTO_DECIMALS) const ;
real sconto() const { return importo(FALSE,FALSE) - importo(TRUE,FALSE); }
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;
@ -876,11 +877,15 @@ protected:
// Funzione per ricercare il conto di costo/ricavo // Funzione per ricercare il conto di costo/ricavo
error_type search_costo_ricavo(TBill&, const TRiga_documento&); error_type search_costo_ricavo(TBill&, const TRiga_documento&);
// Funzione per aggiungere la riga iva al TAssoc_array _righe_iva // Funzione per aggiungere la riga iva al TAssoc_array _righe_iva
error_type add_iva_row(const TBill&, const TRiga_documento&); error_type add_iva_row(const TBill&, const TRiga_documento&, const int);
// Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva // Funzione atomica per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva
void calculate_spese(real&, real&, int, bool, bool); void calculate_spese(real&, real&, int, bool, bool);
// Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese()) // Funzione per aggiungere le righe di spese d'incasso e bolli al TAssoc_array _righe_iva (chiama calculate_spese())
error_type add_spese_inbo(TDocumento&); error_type add_spese_inbo(TDocumento&, const int);
// Aggiorna le righe di sconto importo o percentuale
error_type adjust_sconto_rows(TDocumento&);
// Controlla la corrispondenza tra limposta del documento e quelle generate
error_type adjust_iva_rows(TDocumento&);
// Crea le righe iva sul movimento // Crea le righe iva sul movimento
error_type create_iva_rows(TDocumento&); error_type create_iva_rows(TDocumento&);
// Crea la riga di totale documento // Crea la riga di totale documento

View File

@ -404,34 +404,51 @@ class TIVA_element : public TObject
real _imp; real _imp;
real _iva; real _iva;
real _ali; real _ali;
TString _cod_iva;
public: public:
real& imp() { return _imp;} // Imponibile real& imp() { return _imp;} // Imponibile
real& iva() { return _iva;} // Iva real& iva() { return _iva;} // Iva
real& ali() { return _ali;} // Aliquota % real& ali() { return _ali;} // Aliquota %
void zero(){ _imp = 0.0; _iva = 0.0; _ali = 0.0; } TString& cod_iva() { return _cod_iva;}
void zero(){ _imp = 0.0; _iva = 0.0; _ali = 0.0; _cod_iva = "";}
virtual TObject* dup() const { return new TIVA_element(*this); } virtual TObject* dup() const { return new TIVA_element(*this); }
TIVA_element& operator = (TIVA_element& a); TIVA_element& operator = (TIVA_element& a);
TIVA_element& operator += (const TRiga_documento& a); TIVA_element& add(const TRiga_documento& a, const bool sc, const int ndec);
TIVA_element() {_imp = 0.0; _iva = 0.0; _ali = 0.0;} TIVA_element() { zero(); }
~TIVA_element() {}; ~TIVA_element() {};
}; };
TIVA_element& TIVA_element::operator=(TIVA_element& a) TIVA_element& TIVA_element::operator=(TIVA_element& a)
{ {
_imp = a.imp(); _iva = a.iva(); _ali = a.ali(); _imp = a.imp(); _iva = a.iva(); _ali = a.ali();
_cod_iva = a.cod_iva();
return *this; return *this;
} }
TIVA_element& TIVA_element::operator+=(const TRiga_documento& a) TIVA_element& TIVA_element::add(const TRiga_documento& a, const bool sc, const int ndec)
// It's horrible, I know. // It's horrible, I know.
{ {
_imp += a.imponibile(); _iva += a.imposta(); _ali = a.iva().aliquota(); const TIVA& xx = a.iva();
if (!sc) // Al netto dello sconto
{
_imp += a.imponibile();
_iva += a.imposta();
}
else
{
real imponibile = a.importo(FALSE,FALSE,ndec); // Imponibile della riga al lordo dello sconto
_imp += imponibile;// Imponibile lorda
_iva += ::iva(imponibile,xx,ndec);// imposta calcolata sull'imponibile lorda
}
_ali = xx.aliquota();
_cod_iva = xx.codice();
return *this; return *this;
} }
static TBill _sco_perc_bill, _sco_imp_bill, // Conti per gli sconti a percentuale ed importi (dalla configurazione) static TBill _sco_perc_bill, _sco_imp_bill, // Conti per gli sconti a percentuale ed importi (dalla configurazione)
_spin_billa, _spin_billv, _spin_billa, _spin_billv,
_spbo_billa, _spbo_billv; _spbo_billa, _spbo_billv;
static bool _contsclor; // Contabilizza sconti al netto o al lordo (sconti suddiviso per ogni contropartita)
static TEsercizi_contabili _esc; // Per sapere a quale esercizio appartiene il documento static TEsercizi_contabili _esc; // Per sapere a quale esercizio appartiene il documento
static TCausale *_caus = NULL; // causale del documento corrente static TCausale *_caus = NULL; // causale del documento corrente
static TMovimentoPN_VE *_movimento = NULL; // Movimento di prima nota static TMovimentoPN_VE *_movimento = NULL; // Movimento di prima nota
@ -552,6 +569,8 @@ bool TContabilizzazione::load_parameters()
so = conf.get_long("SCOIMCODCON","ve",3); so = conf.get_long("SCOIMCODCON","ve",3);
_sco_imp_bill.set(gr,co,so); _sco_imp_bill.set(gr,co,so);
_contsclor = conf.get_bool("CONTSCLOR","ve");
gr = conf.get_int("SPINCODCONA","ve",1); gr = conf.get_int("SPINCODCONA","ve",1);
co = conf.get_int("SPINCODCONA","ve",2); co = conf.get_int("SPINCODCONA","ve",2);
so = conf.get_long("SPINCODCONA","ve",3); so = conf.get_long("SPINCODCONA","ve",3);
@ -890,13 +909,8 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc
} }
break; // case 'P','S' break; // case 'P','S'
} }
case 'C': // righe sconti (TBI) (reperire l'imposta e l'imponibile normalizzare. Il conto e' nei parametri) case 'C':
// quale sconto deve reperire dalla configurazione? Sconto ad importo o sconto a percentuale? // righe sconti: vengono considerate in adjust_sconto_rows()
if (!r.get(RDOC_SCONTO).empty()) // se c'e' la percentuale reperisce il conto dello sconto a percentuale
conto = _sco_perc_bill;
else // altrimenti quello dello sconto ad importo
conto = _sco_imp_bill;
break; // case 'C'
case 'D': // righe descrizioni (saltare) case 'D': // righe descrizioni (saltare)
default : default :
break; break;
@ -906,17 +920,20 @@ error_type TContabilizzazione::search_costo_ricavo(TBill& conto, const TRiga_doc
return _error; return _error;
} }
error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_documento& r) error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_documento& r, const int ndec)
// Aggiunge le righe iva all'assoc_array di raggruppamento // Aggiunge le righe iva all'assoc_array di raggruppamento
{ {
TIVA_element el_tmp; TIVA_element el_tmp;
TString cod(r.iva().codice()); const TIVA& tiva = r.iva();
TString cod(tiva.codice());
const char tipo = conto.tipo(); const char tipo = conto.tipo();
const int gr = conto.gruppo(); const int gr = conto.gruppo();
const int co = conto.conto(); const int co = conto.conto();
const long so = conto.sottoconto(); const long so = conto.sottoconto();
TString key; TString key;
const char tipo_r = r.tipo().tipo(); const char tipo_r = r.tipo().tipo();
const bool sconto_lordo = tipo_r != 'C' && _contsclor && _sco_perc_bill.ok();
bool exists;
int ord=0; int ord=0;
// Ordine con cui vengono immesse le righe IVA: // Ordine con cui vengono immesse le righe IVA:
// merce, omaggi, prestazioni, spese, bolli/spese d'incasso, sconti. // merce, omaggi, prestazioni, spese, bolli/spese d'incasso, sconti.
@ -935,16 +952,43 @@ error_type TContabilizzazione::add_iva_row(const TBill& conto, const TRiga_docum
case 'S': case 'S':
ord = 4; ord = 4;
break; break;
case 'C':
ord = 6;
break;
default: break; default: break;
} }
// Le righe di sconto ad importo o percentuale vanno saltate
if (tipo_r != 'C')
{
key.format("%d|%-4s|%c|%3d|%3d|%6ld",ord,(const char*)cod,tipo,gr,co,so); key.format("%d|%-4s|%c|%3d|%3d|%6ld",ord,(const char*)cod,tipo,gr,co,so);
const bool exists = _righe_iva.is_key(key); exists = _righe_iva.is_key(key);
TIVA_element& el = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp); TIVA_element& el = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp);
el += r;
_righe_iva.add(key,el,exists); el.add(r,sconto_lordo,ndec); // Inserisce la riga IVA al netto o al lordo dello sconto
_righe_iva.add(key,el,exists); // Le righe di sconto le aggiorna dopo
}
if (sconto_lordo) // Se e' settato il flag di contabilizzare anche gli sconti merce
{
real sconto = - r.sconto(); // Imponibile dello sconto (positivo, quindi si cambia di segno
if (sconto != ZERO)
{
real ivasc = ::iva(sconto,tiva,ndec);// imposta calcolata sullo sconto
key.format("6|%-4s|%c|%3d|%3d|%6ld",
(const char*)cod,
_sco_perc_bill.tipo(),
_sco_perc_bill.gruppo(),
_sco_perc_bill.conto(),
_sco_perc_bill.sottoconto());
el_tmp.zero();
exists = _righe_iva.is_key(key);
TIVA_element& el_sc = (exists ? (TIVA_element&)_righe_iva[key] : el_tmp);
el_sc.ali() = tiva.aliquota();
el_sc.cod_iva() = tiva.codice();
el_sc.imp() += sconto;
el_sc.iva() += ivasc;
_righe_iva.add(key,el_sc,exists); // Sostituisce od aggiunge la riga relativa allo sconto
}
}
return no_error; return no_error;
} }
@ -972,12 +1016,11 @@ void TContabilizzazione::calculate_spese(real& spese, real& sp_iva, int ndec, bo
_righe_iva.add(key,el,exists); _righe_iva.add(key,el,exists);
} }
error_type TContabilizzazione::add_spese_inbo(TDocumento& doc) error_type TContabilizzazione::add_spese_inbo(TDocumento& doc, const int ndec)
// Aggiunge le righe di spese incasso/bolli // Aggiunge le righe di spese incasso/bolli
{ {
real tot_netto, sp_incasso, sp_bolli; real tot_netto, sp_incasso, sp_bolli;
real iva_sp_incasso, iva_sp_bolli; real iva_sp_incasso, iva_sp_bolli;
const int ndec = doc.in_valuta() ? 3 : 0;
bool is_cli = doc.get(DOC_TIPOCF) == "C"; bool is_cli = doc.get(DOC_TIPOCF) == "C";
// Aggiunge le spese d'incasso // Aggiunge le spese d'incasso
tot_netto = doc.totale_netto(); tot_netto = doc.totale_netto();
@ -994,6 +1037,100 @@ error_type TContabilizzazione::add_spese_inbo(TDocumento& doc)
return _error; return _error;
} }
// Aggiorna le righe di sconto (importo o a percentuale)
error_type TContabilizzazione::adjust_sconto_rows(TDocumento& doc)
{
TIVA_element el_tmp;
TAssoc_array& aa = doc.tabella_iva();
TRiepilogo_iva * riep;
TString cod,key; // Codice IVA corrente
real sconto,iva;
const int ndec = doc.in_valuta() ? 3 : 0;
// Scorre tutti gli elementi della tabella IVA del documento (elementi per codice iva)
for (riep = (TRiepilogo_iva*) aa.first_item(); riep != NULL; riep = (TRiepilogo_iva*) aa.succ_item())
{
const TIVA& codiva = riep->cod_iva();
cod = codiva.codice(); // Codice IVA
for (int i = 0; i < 2; i++) // Ciclo per sconto a percentuale (i == 0) e ad importo (i == 1)
{
//Importo sconto (sconto_perc() o sconto_imp())
//Calcola ::iva() sullo sconto
//Somma alla riga corrispondente o la crea se non esiste gia'
//I conti per aggiustare l'iva vengono fatti in adjust_iva_rows()
const bool perc = i == 0;
TBill& conto = perc ? _sco_perc_bill : _sco_imp_bill;
sconto = perc ? riep->sconto_perc() : riep->sconto_imp();
iva = ::iva(sconto,codiva,ndec);
if (sconto != ZERO)
{
key.format("6|%-4s|%c|%3d|%3d|%6ld",(const char*)cod,
conto.tipo(),
conto.gruppo(),
conto.conto(),
conto.sottoconto());
const bool exists = _righe_iva.is_key(key);
// Aggiorna imponibile ed imposta all'elemento relativo
el_tmp.zero();
TIVA_element& el = exists ? (TIVA_element&)_righe_iva[key] : el_tmp;
el.imp() += sconto;
el.iva() += iva;
el.ali() = codiva.aliquota();
el.cod_iva() = cod;
_righe_iva.add(key,el,exists);
}
}
}
return no_error;
}
// "Aggiusta" l'imposta sulle righe IVA secondo la tabella interna al documento
// Tratta anche i documenti in valuta. DI solito si tratta di poche lire.
error_type TContabilizzazione::adjust_iva_rows(TDocumento& doc)
{
TAssoc_array& aa = doc.tabella_iva();
TRiepilogo_iva * riep;
TString cod; // Codice IVA corrente
const int items = _righe_iva.items(); // Numero di righe IVA
const bool in_valuta = doc.in_valuta();
const real cambio = doc.cambio();
real iva_gen,imponibile;
// Scorre tutti gli elementi della tabella IVA del documento (elementi per codice iva)
for (riep = (TRiepilogo_iva*) aa.first_item(); riep != NULL; riep = (TRiepilogo_iva*) aa.succ_item())
{
cod = riep->cod_iva().codice(); // Codice IVA
iva_gen = riep->imposta();
if (in_valuta) // I documenti vanno sempre contabilizzati in lire
iva_gen *= cambio;
if (iva_gen < ZERO)
iva_gen.floor(0);
else
iva_gen.ceil(0);
TGeneric_distrib gd(iva_gen); // Instanzia il TGeneric_ditrib con la vera Imposta
// Adesso scorre tutte le righe IVA contabili con questo codice IVA
for (int i = 0; i < items; i++)
{
TRectype& ie = _movimento->iva(i);
if (ie.get(RMI_CODIVA) == cod) // Se il codice IVA e' uguale
gd.add(ie.get_real(RMI_IMPOSTA)); // Aggiunge al TGeneric_distrib l'imposta corrente
}
// Alla fine per performare tutto il calcolo (Thanx to TGeneric_distrib) si fanno le get
// E le si mettono nel rispettivo record IVA
for (i = 0; i < items; i++)
{
TRectype& ie = _movimento->iva(i);
if (ie.get(RMI_CODIVA) == cod) // Se il codice IVA e' uguale
ie.put(RMI_IMPOSTA,gd.get()); // Sostituisce l'imposta con quella ricalcolata al fine di avere tutto giusto
}
} // Visto che vengono restituiti nello stesso ordine in cui sono state chiamate le rispettive TGeneric_distrib::add()
return no_error;
}
error_type TContabilizzazione::create_iva_rows(TDocumento& doc) error_type TContabilizzazione::create_iva_rows(TDocumento& doc)
{ {
const int items = _righe_iva.items(); const int items = _righe_iva.items();
@ -1027,7 +1164,7 @@ error_type TContabilizzazione::create_iva_rows(TDocumento& doc)
conto.set(gr,co,so,tipo); conto.set(gr,co,so,tipo);
conto.find(); conto.find();
imponibile = cur.imp(); imponibile = cur.imp();
if (in_valuta) if (in_valuta) // I documenti vanno sempre contabilizzati in lire
{ {
imponibile = cur.imp() * cambio; // imponibile in lire imponibile = cur.imp() * cambio; // imponibile in lire
imponibile.round(); imponibile.round();
@ -1125,7 +1262,7 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
// Compila le righe // Compila le righe
{ {
const int rows = doc.rows(); const int rows = doc.rows();
const int ndec = doc.in_valuta() ? 3 : 0;
_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=1; good() && i<=rows; i++) // browse all this fucked document rows for (int i=1; good() && i<=rows; i++) // browse all this fucked document rows
{ {
@ -1136,11 +1273,11 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
{ {
TBill conto; TBill conto;
const char tipo = r.tipo().tipo(); const char tipo = r.tipo().tipo();
if (tipo != 'D') if (tipo != 'D' && tipo != 'C')
{ {
search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro search_costo_ricavo(conto,r); // l'errore eventuale viene settato qui dentro
if (good()) if (good())
add_iva_row(conto,r); add_iva_row(conto,r,ndec);
} }
} }
else else
@ -1152,11 +1289,20 @@ error_type TContabilizzazione::compile_rows_mov(TDocumento& doc)
// Crea le righe per le spese d'incasso e bolli // Crea le righe per le spese d'incasso e bolli
if (good()) if (good())
add_spese_inbo(doc); add_spese_inbo(doc,ndec);
// Aggiorna le righe di sconto (sconto ad importo o percentuale)
if (good())
adjust_sconto_rows(doc);
// Crea le righe di IVA // Crea le righe di IVA
if (good()) if (good())
create_iva_rows(doc); create_iva_rows(doc);
// Controlla che le imposte per ogni aliquota ed eventualmente corregge le imposte stesse sulle righe
if (good())
adjust_iva_rows(doc);
// Crea la riga di totale documento // Crea la riga di totale documento
if (good()) if (good())
create_total_doc_row(); create_total_doc_row();