Aggiunta funzione per classificare importi pim e modificata liquidasiun

di conseguenza


git-svn-id: svn://10.65.10.50/trunk@995 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
villa 1995-02-14 11:30:57 +00:00
parent 7dc0277741
commit 056d2e5a5b
4 changed files with 553 additions and 196 deletions

View File

@ -106,11 +106,11 @@ bool TLiquidazione_app::user_create()
_plm = new TTable("PLM");
_lim = new TTable("LIM");
_lam = new TTable("LAM");
_pla = new TTable("PLA");
_pla = new TTable("%PLA");
_reg = new TTable("REG");
_iva = new TTable("%IVA");
_del = new TTable("%DEL");
_lia = new TTable("LIA");
_lia = new TTable("%LIA");
_rmb = new TTable("RMB");
_mov = &_cur->file(LF_MOV);

View File

@ -11,10 +11,6 @@
#include "cg4300.h"
// -------------------- QUI comincia l'avventura --------------------------
// ----------------------------------------------------- ******************
// che nel gennaio 1995 non solo non e' finita, ma si fa ******************
// ogni giorno piu' odiosa e nevrastenica ******************
// ----------------------------------------------------- ******************
// Datemi un punto di appoggio ******************
// e mi ci appoggero' ******************
// ----------------------------------------------------- ******************
@ -407,16 +403,11 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
const bool sreg = !isreg;
const bool rs8 = _reg_r->get("S8") != trueatt;
const bool cmt = !_cur->is_first_match(LF_RMOVIVA);
const bool sosp_imp = _reg->get_bool("B1");
const TRectype& rcs = _cur->curr(LF_CAUSALI);
if (dok || sreg || rs8 || cmt) continue;
/*
* Fatture in sospensione di imposta non vengono considerate
*/
if (_reg->get_bool("B1"))
continue;
/*
* Tipo documento da eliminare (Scudler 1994)
* Trattasi per lo piu' di non incassati
@ -445,6 +436,14 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
{
look_iva(_rmoviva->get("CODIVA"));
// totali parziali registrati nei pim per motivi ignoti
real bolld_imp = 0.0; // imponibile bolle doganali
real bolld_iva = 0.0; // imposta bolle doganali
real asimp_imp = 0.0; // imponibile acquisti sosp. imposta
real asimp_iva = 0.0; // imposta acquisti sosp. imposta
real vsimp_imp = 0.0; // imponibile vendite sosp. imposta
real vsimp_iva = 0.0; // imposta vendite sosp. imposta
TString codiva = _iva->get("CODTAB");
TString tipoiva = _iva->get("S1");
TString riga11_v = _iva->get("S0");
@ -503,6 +502,23 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
continue;
}
if (sosp_imp) // sospensione di imposta
{
if (tipomov == vendita)
{
vsimp_imp = imponibile;
vsimp_iva = imposta;
}
else
{
asimp_imp = imponibile;
asimp_iva = imposta;
}
}
else // normale
{
// *****************************************
// casi particolari
// *****************************************
@ -610,6 +626,13 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
esenti_b14 += imponibile;
}
// bolle doganali
if (tipodoc == "BD")
{
bolld_imp = imponibile;
bolld_iva = imposta;
}
// plafond
if (_isplafond && tipomov == acquisto && month != 13 &&
tipoiva == "NI" && tipopla != 0)
@ -690,7 +713,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
// Fine casi particolari
// Non che i casi normali siano tanto meglio
// *****************************************
} // non sosp_imp
/*
* Calcolo e aggiornamento
* cerca o crea progressivo IVA
@ -702,7 +725,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
* se liq == FALSE gli importi non contano ai fini
* del calcolo liquidazione
*/
bool liq = !(tipodet == 1 || tipodet == 3 || tipodet == 9);
bool liq = !(tipodet == 1 || tipodet == 3 || tipodet == 9 || sosp_imp);
real imp = _pim_r->get_real("R0"); // imponibile
real ivp = _pim_r->get_real("R1"); // IVA su imp.
@ -725,6 +748,26 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
real adf = _pim_r->get_real("R7");
real adi = _pim_r->get_real("R8");
/* le fottute fatture in sospensione di imposta */
real fsi = _pim_r->get_real("R11");
real fsv = _pim_r->get_real("R12");
/* le putride bolle doganali */
real bdi = _pim_r->get_real("R9");
real bdv = _pim_r->get_real("R10");
if (tipomov == vendita)
{
fsi += vsimp_imp;
fsv += vsimp_iva;
}
else
{
fsi += asimp_imp;
fsv += asimp_iva;
bdi += bolld_imp;
bdv += bolld_iva;
}
if (liq && tipomov == vendita && !corrisp)
// i corrispettivi sono gestiti a parte
@ -831,6 +874,9 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
}
_pim_r->put("B2",isvolaff);
if (!sosp_imp)
{
_pim_r->put("R0",imp);
_pim_r->put("R1",ivp);
_pim_r->put("R2",lor);
@ -838,8 +884,13 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
_pim_r->put("R6",vfs);
_pim_r->put("R7",adf);
_pim_r->put("R8",adi);
_pim_r->put("R9",bdi);
_pim_r->put("R10",bdv);
}
// questi servono per i ricalcoli altrui (classify_pim)
_pim_r->put("R11",fsi);
_pim_r->put("R12",fsv);
_pim_r->put("I1", (long)tipomov);
_pim_r->put("B3", ivarimb ? "X" : "");
_pim_r->put("B4", _isricacq ? "X" : "");

220
cg/classpim.cpp Executable file
View File

@ -0,0 +1,220 @@
// classpim.cpp
// funzione per classificare i PIM e sommare tutto cio' che contengono
#include "classpim.h"
#include <stdlib.h>
bool classify_pim(TRectype& pimr, real& imp, real& iva, tiporec& t)
{
static int last_checked = -1;
// parse CODTAB of pim record
TString ctab = pimr.get("CODTAB");
const int tipocr = atoi(ctab.mid(15,1)); // tipo costo_ricavo
const int tipodet = atoi(ctab.mid(20,1)); // tipo detraibilita'
const int corrisp = (int)pimr.get_long("I0"); // netto = 1, lordo = 2
const int tipomov = (int)pimr.get_long("I1"); // 1 = vendita, 2 = acquisto
const bool vola = pimr.get_bool("B2");
const bool rimb = pimr.get_bool("B3");
const bool ricl = pimr.get_bool("B4");
TString tipoiva = pimr.get("S5");
// cominciamo cosi'
imp = ZERO; iva = ZERO;
for (int i = last_checked + 1; i <= MAX_TIPOREC; i++)
{
tiporec tocheck = (tiporec)i;
bool found = FALSE;
switch(tocheck)
{
case acq_norm:
found = tipomov == 2 && tipoiva != "NS";
found &= (tipodet == 0 || tipodet == 1 || tipodet == 3 ||
tipodet == 5 || tipodet == 9);
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
}
break;
case vend_norm:
found = tipomov == 1 && corrisp == 1 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
}
break;
case acq_simp:
if (tipomov == 2)
{
imp = pimr.get_real("R11");
iva = pimr.get_real("R12");
}
found = !imp.is_zero() || !iva.is_zero();
break;
case vend_simp:
if (tipomov == 1 && corrisp == 1)
{
imp = pimr.get_real("R11");
iva = pimr.get_real("R12");
}
found = !imp.is_zero() || !iva.is_zero();
break;
case bolle_doganali:
if (tipomov == 2 && tipoiva != "NS")
{
imp = pimr.get_real("R9");
iva = pimr.get_real("R10");
}
found = !imp.is_zero() || !iva.is_zero();
break;
case acq_beni_riv:
found = (tipomov == 2 && tipodet != 9 && tipocr == 1);
found &= (tipoiva != "NS" && tipoiva != "NI" && tipoiva != "ES");
found &= (ricl ? TRUE : tipodet == 3);
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
}
found &= !imp.is_zero() || !iva.is_zero();
break;
case base_ventilazione:
found = (tipomov == 2 && tipodet != 9 && (tipocr == 1 || tipocr == 5));
found &= tipoiva != "NS" && tipoiva != "NI" && tipoiva != "ES";
found &= (ricl ? TRUE : tipodet == 3);
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
}
found &= (!imp.is_zero() || !iva.is_zero());
break;
case corr_norm:
found = tipomov == 1 && corrisp == 2 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case corr_simp:
if (tipomov == 1 && corrisp == 2)
{
imp = pimr.get_real("R11");
iva = pimr.get_real("R12");
}
found = !imp.is_zero() || !iva.is_zero();
break;
case acq_beni_ammort:
found = tipomov == 2 && tipocr == 2 &&
tipodet == 0 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case acq_beni_ammort_nd:
found = tipomov == 2 && tipocr ==2 &&
tipodet != 0 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case acq_beni_leasing:
found = tipomov == 2 && tipocr == 8 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case acq_amm_ultdetr:
found = tipomov == 2 && tipocr == 3 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case acq_ind_op_es:
found = tipomov == 2 && tipodet == 1 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case acq_ind_pass_int:
found = tipomov == 2 && tipodet == 3 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case acq_ind_art_19:
found = tipomov == 2 && tipodet == 9 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case cess_amm:
found = tipomov == 1 && tipocr == 4 && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case vend_rimborso:
found = tipomov == 1 && rimb && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
case acq_rimborso:
found = tipomov == 2 && rimb && tipoiva != "NS";
if (found)
{
imp = pimr.get_real("R0");
iva = pimr.get_real("R1");
found &= (!imp.is_zero() || !iva.is_zero());
}
break;
}
if (i == MAX_TIPOREC)
last_checked = -1;
else if (found)
{
t = tocheck;
last_checked = i;
break;
}
}
return last_checked != -1;
}

86
cg/classpim.h Executable file
View File

@ -0,0 +1,86 @@
// classpim.h
// funzioni ed enum per classificare i pim
#ifndef __CLASSPIM_H
#define __CLASSPIM_H
#ifndef __ISAM_H
#include <isam.h>
#endif
#ifndef __REAL_H
#include <real.h>
#endif
// per ora ci si fotte di agenzie viaggio e di
// regimi agricoli
enum tiporec { acq_norm = 0, vend_norm = 1, // acquisti e vendite normali
acq_simp = 2, vend_simp = 3, // acq. e vend. sosp. imposta
bolle_doganali = 4, // bolle doganali (acquisti)
acq_beni_riv = 5, // acq. beni per rivendita
base_ventilazione = 6, // base calcolo per ventil.
corr_norm = 7, corr_simp = 8, // corrispettivi n. e s. imp.
acq_beni_ammort = 9, // acq. beni ammortizz. detr.
acq_beni_ammort_nd = 10, // beni ammort. non detraibili
acq_beni_leasing = 11, // beni strum. acq in leasing
acq_amm_ultdetr = 12, // beni amm. ult. detr 6%
acq_ind_op_es = 13, // acq. indetr. su op.es.
acq_ind_pass_int = 14, // passaggi interni
acq_ind_art_19 = 15, // indetr. art. 19
cess_amm = 16, // cessioni amministrative
vend_rimborso = 17, // vendite valide per rimborso
acq_rimborso = 18 // acq. validi per rimborso
// ACHTUNG: se si aggiunge, cambiare sotto!!!
};
// questo serve nel cpp ma lo metto qua se no
// non lo cambiero' mai quando serve
const int MAX_TIPOREC = 18;
// ---------------------------------------------------------------
// "classifica" un record progressivo IVA passato per reference
// mette l'imponibile in imp, l'imposta in iva, e in t mette
// un valore dell'enum di cui sopra, che dice di che tipo e'
// l'importo ritornato
// ---------------------------------------------------------------
// RITORNA TRUE SE VA CHIAMATA ANCORA CON LO STESSO PIM come
// parametro (ovvero: ci sono altri valori da passare che fanno
// parte dello stesso pim)
// ---------------------------------------------------------------
// mese, anno, attivita' vanno gestiti esternamente. Quando un pim
// contiene dati che valgono per piu' di un caso, ritorna TRUE
// finche' i casi possibili non sono esauriti
// ---------------------------------------------------------------
// ------------------------------- ESEMPIO che fa sempre bene
// TTable pim("PIM");
// while (pim.first(); !pim.eof(); pim.next())
// {
// real imponibile, imposta;
// tiporec tipo;
//
// // Escludi i pim che non vuoi (per attivita', anno, mese)
// if (questo_non_lo_volevo) continue;
//
//
// while (classify_pim(pim.curr(), imponibile, imposta, tipo))
// {
// switch(tipo)
// {
// case acq_norm:
// acq_imponibile += imponibile;
// acq_imposta += imposta;
// break;
// // eccetera
// }
// }
// }
//
// CONTENTA? ciao, f. :)
// -----------------------------------------------------------
bool classify_pim(TRectype& pimr, real& imp, real& iva, tiporec& t);
#endif