Migliorata gestione split payment

git-svn-id: svn://10.65.10.50/branches/R_10_00@23051 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2015-03-31 06:04:40 +00:00
parent b130191aae
commit 6788cf17ed
21 changed files with 370 additions and 233 deletions

View File

@ -118,7 +118,7 @@ int cg1300(int argc, char* argv[])
case 'P':
{
TAgg_nprot a;
a.run(argc, argv,TR("Rinumerazione numero di protocollo"));
a.run(argc, argv,TR("Rinumerazione protocollo IVA"));
}
break;
case 'T':

View File

@ -55,13 +55,15 @@ END
RADIOBUTTON F_MODE 1 24
BEGIN
PROMPT 1 6 "@bRiparti da "
PROMPT 1 6 "@bRipartire da "
ITEM "U|Ultima stampa"
MESSAGE CLEAR,F_PROT
MESSAGE CLEAR,F_PROT
ITEM "N|Numero specificato"
MESSAGE ENABLE,F_PROT
MESSAGE ENABLE,F_PROT
ITEM "A|Inizio anno"
MESSAGE CLEAR,F_PROT
MESSAGE CLEAR,F_PROT
ITEM "P|Uguale a num. doc."
MESSAGE CLEAR,F_PROT
END
DATE F_DA
@ -78,7 +80,7 @@ END
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
#include <stdbar.h>
#include <elabar.h>
ENDPAGE
ENDMASK

View File

@ -5,10 +5,12 @@
#include <progind.h>
#include <tabutil.h>
#include <relation.h>
#include <recarray.h>
#include "cg1300.h"
#include "cg1303.h"
#include <causali.h>
#include <mov.h>
#include <partite.h>
@ -19,9 +21,18 @@ HIDDEN bool filtra_mov(const TRelation* r)
{
const TRectype& mov = r->curr();
const int annoiva = mov.get_int(MOV_ANNOIVA);
const TString16 reg = mov.get(MOV_REG);
TString4 reg = mov.get(MOV_REG);
const TAgg_nprot& a = app();
if (reg.full() && reg != a.reg())
{
const TString& codcaus = mov.get(MOV_CODCAUS);
const TString& truereg = cache().get(LF_CAUSALI, codcaus, CAU_REG);
if (truereg != reg && truereg == a.reg()) // REG incoerente
reg = truereg;
}
TAgg_nprot& a = app();
return a.anno() == annoiva && a.reg() == reg;
}
@ -43,14 +54,15 @@ void TAgg_nprot::main_loop()
bool TAgg_nprot::rinumera_prot(char mode, long last_prot)
{
TTable reg("REG");
TString16 s; s.format("%04d%s", _anno, (const char*)_reg);
TString8 s; s.format("%04d%s", _anno, (const char*)_reg);
reg.put("CODTAB", s);
if (reg.read() != NOERR)
return error_box(FR("Impossibile leggere il registro %s del %d"),
(const char*)_reg, _anno);
TFast_isamfile fastmov(LF_MOV);
TRelation rel (LF_MOV);
rel.add(LF_PARTITE,"NREG=NUMREG",2);
rel.add(LF_PARTITE, "NREG=NUMREG", 2);
TLocalisamfile& mov = rel.lfile();
TLocalisamfile& part= rel.lfile(LF_PARTITE);
@ -62,18 +74,16 @@ bool TAgg_nprot::rinumera_prot(char mode, long last_prot)
if (nitems == 0)
return warning_box(TR("Non ci sono movimenti da rinumerare"));
TConfig cnf(CONFIG_DITTA,"cg");
const bool sc_enabled = cnf.get_bool("GesSal");
const bool sc_enabled = ini_get_bool(CONFIG_DITTA,"cg", "GesSal");
cursor.freeze();
cursor = 0L;
TProgind p(nitems, TR("Elaborazione in corso...") , FALSE, TRUE);
long protiva, uprotiva;
if (mode == 'N' || mode == 'U')
{
long protiva, uprotiva;
for (; cursor.pos() < nitems; ++cursor)
{
p.addstatus(1);
@ -115,21 +125,41 @@ bool TAgg_nprot::rinumera_prot(char mode, long last_prot)
dprot = uprot = 0L;
nprot = last_prot;
long first_nreg = 0, first_nprot = 0;
long last_nreg = 0, last_nprot = 0;
for (; cursor.pos() < nitems; ++cursor)
{
p.addstatus(1);
protiva = mov.get_long(MOV_PROTIVA);
uprotiva = mov.get_long(MOV_UPROTIVA);
nprot = nprot+1+dprot; //stile RPG
dprot = 0L;
uprot = 0L;
dprot = (uprotiva == 0L) ? 0L : (uprotiva - protiva);
uprot = (uprotiva == 0L) ? 0L : (nprot + dprot);
mov.put(MOV_PROTIVA, nprot);
mov.put(MOV_UPROTIVA, uprot);
mov.rewrite();
const long protiva = mov.get_long(MOV_PROTIVA);
const long uprotiva = mov.get_long(MOV_UPROTIVA);
const TString& reg = mov.get(MOV_REG);
if (mode == 'P') // Modalità speciale COMARI protiva = numdoc
{
nprot = mov.get_long(MOV_NUMDOC);
dprot = uprot = 0;
}
else
{
nprot = nprot+1+dprot; //stile RPG
dprot = (uprotiva == 0L) ? 0L : (uprotiva - protiva);
uprot = (uprotiva == 0L) ? 0L : (nprot + dprot);
}
if (nprot != protiva || uprot != uprotiva || reg != _reg)
{
mov.put(MOV_REG, _reg);
mov.put(MOV_PROTIVA, nprot);
mov.put(MOV_UPROTIVA, uprot);
int err = mov.rewrite();
if (err != NOERR)
{
cantwrite_box("Movimenti IVA");
break;
}
}
// Aggiorna il nr di prot. iva sul file partite
if (sc_enabled && rel.is_first_match(LF_PARTITE))
{
@ -139,11 +169,22 @@ bool TAgg_nprot::rinumera_prot(char mode, long last_prot)
part.rewrite();
} while (rel.next_match(LF_PARTITE));
}
const long numreg = mov.get_long(MOV_NUMREG);
if (first_nreg <= 0)
{
first_nreg = numreg;
first_nprot = nprot;
}
last_nreg = numreg;
last_nprot = nprot;
}
reg.put("I5", nprot + dprot);
reg.rewrite();
return message_box(TR("Rinumerazione numero protocollo completata"));
return message_box(FR("Rinumerazione numero protocollo completata\n"
"dal movimento %ld (%ld) al movimento %ld (%ld)"),
first_nreg, first_nprot, last_nreg, last_nprot);
}

View File

@ -2,16 +2,14 @@
class TAgg_nprot : public TSkeleton_application
{
TString16 _reg;
int _anno;
TString4 _reg;
int _anno;
public:
virtual void main_loop();
int anno() const { return _anno; }
const TString& reg() const { return _reg; }
protected:
bool rinumera_prot(char mode, long last_prot);
TAgg_nprot() { }
virtual ~TAgg_nprot() { }
public:
int anno() const { return _anno; }
const TString& reg() const { return _reg; }
virtual void main_loop();
};

View File

@ -2129,7 +2129,7 @@ void TPrimanota_application::mask2ini(const TMask& msk, TConfig& ini)
for (int r = game->first(); r <= lastrow; r = game->succ(r))
{
dump_rec(ini, game->riga(r), r, pref);
if (((tipo_movimento)game->riga(r).get_int(PART_TIPOMOV)) == tm_fattura)
if (game->riga(r).tipo() == tm_fattura)
dump_fatt(ini, *game, r, pref);
}
TRecord_array uns = game->unassigned();

View File

@ -19,6 +19,7 @@
#define F_DATACOMP 116
#define F_ANNOIVA 117
#define F_NUMDOCEXT 130
#define F_CC_NUMREG 163
#define F_CLIFO 128
#define F_CLIENTE 151

View File

@ -54,6 +54,16 @@ BEGIN
CHECKTYPE REQUIRED
HELP "Data in cui viene registrata l'operazione"
MESSAGE COPY,F_ANNOIVA,7,10
USE LF_MOV KEY 2
DISPLAY "Data@10" DATAREG
DISPLAY "Numero@7" NUMREG
DISPLAY "Causale" CODCAUS
DISPLAY "Documento" NUMDOC
DISPLAY "Protoc." PROTIVA
DISPLAY "Descrizione@50" DESCR
OUTPUT F_DATAREG DATAREG
OUTPUT F_NUMREG NUMREG
CHEKCTYPE SEARCH
END
NUMBER F_ANNOIVA 4
@ -82,6 +92,8 @@ BEGIN
ADD RUN cg0 -4
CHECKTYPE NORMAL
WARNING "Causale assente"
MESSAGE EMPTY SHOW,F_NUMREG|HIDE,F_CC_NUMREG
MESSAGE SHOW,F_CC_NUMREG|HIDE,F_NUMREG
END
STRING F_DESCRCAUS 50
@ -107,7 +119,7 @@ BEGIN
PROMPT 3 10 "Numero operazione "
HELP "Numero del movimento di prima nota da modificare"
FIELD LF_MOV->NUMREG
USE LF_MOV SELECT BETWEEN(CODCAUS,#F_CODCAUS,#F_CODCAUS)
USE LF_MOV
INPUT NUMREG F_NUMREG
DISPLAY "Numero@7" NUMREG
DISPLAY "Data@10" DATAREG
@ -119,6 +131,18 @@ BEGIN
KEY 1
END
NUMBER F_CC_NUMREG 7
BEGIN
PROMPT 3 10 "Numero operazione "
HELP "Numero del movimento di prima nota da modificare"
USE LF_MOV SELECT BETWEEN(CODCAUS,#F_CODCAUS,#F_CODCAUS)
INPUT NUMREG F_CC_NUMREG
COPY DISPLAY F_NUMREG
OUTPUT F_CC_NUMREG NUMREG
MESSAGE COPY F_NUMREG
FLAGS "H"
END
/* DATACOMP new way
DATE F_DATACOMP
BEGIN

View File

@ -285,7 +285,7 @@ ENDPAGE
ENDMASK
PAGE "Riga" -1 -1 78 11
PAGE "Riga" -1 -1 78 13
GROUPBOX DLG_NULL 76 6
BEGIN

View File

@ -127,7 +127,7 @@ BEGIN
ITEM "Pagamenti@14"
ITEM "Altri importi@14"
ITEM "Descrizione@50"
FLAGS "D"
FLAGS "L"
END
SPREADSHEET P_SCADENZE
@ -146,9 +146,10 @@ BEGIN
ITEM "Prot. IVA"
ITEM "Tipo"
ITEM "Riga pag."
ITEM "Blocc."
ITEM "Motivazione@50"
FLAGS "D"
ITEM "Blocco"
ITEM "Causale\nBlocco@6"
ITEM "Motivazione blocco@50"
FLAGS "L"
END
ENDPAGE
@ -218,7 +219,7 @@ ENDPAGE
ENDMASK
PAGE "Sheet Scadenze" -1 -1 68 15
PAGE "Sheet Scadenze" -1 -1 68 10
NUMBER 101 4
BEGIN
@ -296,28 +297,22 @@ END
BOOLEAN 114
BEGIN
PROMPT 1 8 "Pagamenti bloccati"
MESSAGE FALSE CLEAR,115|CLEAR,116
MESSAGE TRUE ENABLE,115
END
STRING 115 6
BEGIN
PROMPT 1 9 "Motivo "
USE %MBP
INPUT CODTAB 115
DISPLAY "Codice"
DISPLAY "Descrizione@50"
OUTPUT 115 CODTAB
OUTPUT 116 S0
FLAGS "D"
PROMPT 26 8 ""
END
STRING 116 50
STRING 116 50 65
BEGIN
PROMPT 17 9 ""
FLAGS "D"
PROMPT 1 9 ""
END
ENDPAGE
TOOLBAR "" 0 0 0 2
BUTTON DLG_CANCEL 12 2
BEGIN
PROMPT -12 -1 ""

View File

@ -51,7 +51,7 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k)
{
case K_SPACE:
{
const bool can = !recalc && pag.n_rate() > 1 && ps.row(r).get_char(13) != 'X';
const bool can = !recalc && pag.n_rate() > 1 && ps.row(r).get_char(14) != 'X';
ps.sheet_mask().enable(DLG_DELREC, can);
}
break;
@ -97,7 +97,7 @@ bool TPrimanota_application::pag_notify(TSheet_field& ps, int r, KEY k)
break;
case K_DEL:
doit = !recalc && pag.n_rate() > 1 && ps.row(r).get_char(13) != 'X';
doit = !recalc && pag.n_rate() > 1 && ps.row(r).get_char(14) != 'X'; // non cancellabile
if (doit)
{
pag.remove_rata(r);
@ -882,7 +882,8 @@ bool TPrimanota_application::read_scadenze(TMask& m)
}
str.add(scadenza.get(SCAD_DESCR), 11);
str.add(scadenza.get(SCAD_BLOCCATA), 12);
str.add(prot ? "X" : " ", 13);
str.add(scadenza.get(SCAD_MOTIVO), 13);
str.add(prot ? "X" : " ", 14);
}
m.set(FS_RDIFFER, pag.rate_differenziate() ? "1" : "2");
m.set(FS_NAMEPAG, pag.name());
@ -1038,8 +1039,8 @@ void TPrimanota_application::write_scadenze(const TMask& m)
scadenza.put(SCAD_CODPAG, codpag); // Codice pagamento
scadenza.put(SCAD_CODAG, agente); // Codice agente
scadenza.put(SCAD_DATASCAD, row.get(0)); // 0 = Data scadenza
scadenza.put(SCAD_IMPORTO, row.get()); // 1 = Importo
scadenza.put(SCAD_DATASCAD, row.get(0)); // 0 = Data scadenza
scadenza.put(SCAD_IMPORTO, row.get()); // 1 = Importo
scadenza.put(SCAD_IMPORTOVAL, row.get()); // 2 = Importo in valuta
row.get(); // 3 = Percentuale
scadenza.put(SCAD_TIPOPAG, row.get()); // 4 = Tipo pagamento
@ -1051,6 +1052,7 @@ void TPrimanota_application::write_scadenze(const TMask& m)
scadenza.put(SCAD_CODCAB, row.get()); //10 = Vs CAB
scadenza.put(SCAD_DESCR, row.get()); //11 = Note
scadenza.put(SCAD_BLOCCATA, row.get()); //12 = Non pagabile
scadenza.put(SCAD_MOTIVO, row.get()); //13 = Motivo blocco
scadenza.put(SCAD_IMPORTOANT, ((real &)ant[i]));
}
}

View File

@ -195,7 +195,7 @@ void TPay_mask::set_pag(const TRectype& oldpag, const TRiga_scadenze& scad,
const int nrigp = oldpag.get_int(PAGSCA_NRIGP);
const TRiga_partite& sum = p.riga(nrigp);
_assigned = oldpag.get_int(PAGSCA_NRIGA) != TPartita::UNASSIGNED;
_tipomov = (tipo_movimento)sum.get_int(PART_TIPOMOV);
_tipomov = sum.tipo();
_swap_ritsoc = sum.sezione() != sum.sezione_ritsoc();
const TRiga_partite& fatt = _assigned ? scad.riga() : sum;
@ -920,7 +920,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
riga_fattura.add(riga.get(PART_DATAREG));
riga_fattura.add(riga.get(PART_NUMDOC));
riga_fattura.add(riga.get(PART_PROTIVA));
riga_fattura.add(riga.get(PART_TIPOMOV));
riga_fattura.add((int)riga.tipo());
for (int ra = 1; ra <= riga.rate(); ra++)
{
@ -930,16 +930,23 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
row = riga_fattura;
row.add(ra, 1);
row.add(scad.get(SCAD_DATASCAD), 3);
gm.add_importo(row, scad.importo(FALSE), NULL, 5);
gm.add_importo(row, scad.importo(false), NULL, 5);
if (in_valuta)
gm.add_importo(row, scad.importo(TRUE), prima_valuta.codice(), 6);
gm.add_importo(row, scad.importo(true), prima_valuta.codice(), 6);
const TString& descr = scad.get(SCAD_DESCR);
if (descr.not_empty())
if (descr.full())
row.add(descr, 4);
const bool blocked = scad.get_bool(SCAD_BLOCCATA);
row.add(blocked ? "X" : " ", 13);
if (blocked)
{
const TString& cbp = scad.get(SCAD_MOTIVO);
row.add(cbp);
if (cbp.full())
row.add(cache().get("%CBP", cbp, "S0"));
}
const int lastp = scad.last();
for (int pa = scad.first(); pa <= lastp; pa = scad.succ(pa))
@ -971,7 +978,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
row.add(sum.get(PART_DATAREG));
row.add(sum.get(PART_NUMDOC));
row.add("");
row.add(sum.get(PART_TIPOMOV));
row.add((int)sum.tipo());
row.add(pa);
// Le ritenute non possono esistere in valuta
@ -983,7 +990,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TToken_string& rrit = gm.add_colored_row(sheet, 'R');
rrit.add(TR("Ritenute professionali"), 4);
gm.add_importo(rrit, rit, FALSE);
rrit.add(sum.get(PART_TIPOMOV), 11);
rrit.add((int)sum.tipo(), 11);
}
const TImporto soc(sum.sezione_ritsoc(), pag.get_real(PAGSCA_RITSOC));
@ -992,7 +999,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TToken_string& rrit = gm.add_colored_row(sheet, 'R');
rrit.add(TR("Ritenute sociali"), 4);
gm.add_importo(rrit, soc, FALSE);
rrit.add(sum.get(PART_TIPOMOV), 11);
rrit.add((int)sum.tipo(), 11);
}
}
@ -1017,7 +1024,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
gm.add_importo(rabb, abb);
rabb.add("");
}
rabb.add(sum.get(PART_TIPOMOV), 11);
rabb.add((int)sum.tipo(), 11);
}
// Le differenze cambio possono esistere solo in valuta
@ -1029,7 +1036,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TToken_string& rdiff = gm.add_colored_row(sheet, 'C');
rdiff.add(TR("Differenza cambio"), 4);
gm.add_importo(rdiff, diff);
rdiff.add(sum.get(PART_TIPOMOV), 11);
rdiff.add((int)sum.tipo(), 11);
}
}
@ -1089,7 +1096,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
row.add(sum.get(PART_DATAREG));
row.add(sum.get(PART_NUMDOC));
row.add("");
row.add(sum.get(PART_TIPOMOV));
row.add((int)sum.tipo());
row.add(pa);
const TImporto rit(sez, pag.get_real(PAGSCA_RITENUTE));
@ -1098,7 +1105,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TToken_string& row = gm.add_colored_row(sheet, 'R');
row.add(TR("Ritenute professionali"), 4);
gm.add_importo(row, rit, FALSE);
row.add(sum.get(PART_TIPOMOV), 11);
row.add((int)sum.tipo(), 11);
tot_lit += rit;
}
@ -1108,7 +1115,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TToken_string& row = gm.add_colored_row(sheet, 'R');
row.add(TR("Ritenute sociali"), 4);
gm.add_importo(row, soc, FALSE);
row.add(sum.get(PART_TIPOMOV), 11);
row.add((int)sum.tipo(), 11);
tot_lit += soc;
}
@ -1138,7 +1145,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
rabb.add("");
tot_lit += abb;
}
rabb.add(sum.get(PART_TIPOMOV), 11);
rabb.add((int)sum.tipo(), 11);
}
/* Continuo a ritenre impossibile ... per ora
// Le differenze cambio possono esistere solo in valuta
@ -1150,7 +1157,7 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
TToken_string& rdiff = gm.add_colored_row(sheet, 'C');
rdiff.add(TR("Differenza cambio"), 4);
gm.add_importo(rdiff, diff);
rdiff.add(sum.get(PART_TIPOMOV), 11);
rdiff.add((int)sum.tipo(), 11);
}
}
*/
@ -1245,6 +1252,12 @@ bool TGame_mask::scadenze_notify(TSheet_field& scadenze, int r, KEY k)
gm.send_key(K_CTRL + 'N', 0, &scadenze); // Simula la pressione del tasto nuovo
return false; // Rifiuta l'aggiunta di una riga
}
if (k == K_DEL || k == K_SPACE)
{
return false;
}
return true;
}

View File

@ -155,9 +155,23 @@ END
BOOLEAN 113
BEGIN
PROMPT 12 11 "Bloccata"
MESSAGE FALSE CLEAR,114
MESSAGE TRUE ENABLE,114
END
BOOLEAN 114
STRING 114 6
BEGIN
PROMPT 30 11 "Motivo "
USE %CBP
INPUT CODTAB 114
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT 114 CODTAB
CHECKTYPE NORMAL
FLAGS "D"
END
BOOLEAN 115
BEGIN
PROMPT 1 -1 "Non cancellabile"
FLAGS "D"

View File

@ -232,6 +232,7 @@ BEGIN
ITEM "Vs.CAB"
ITEM "Note@50"
ITEM "Bloccata"
ITEM "Motivo"
ITEM "Non cancellabile"
END

View File

@ -157,7 +157,6 @@ public: // vedi sopra per le fisime morali
int _tipodet; // tipo detraibilita'
virtual TObject* dup() const { return new _CorrItem(*this); }
_CorrItem() {}
virtual ~_CorrItem() {}
};
class _DescrItem : public TObject

View File

@ -496,9 +496,6 @@ void TLiquidazione_app::zero_att(int month, const char* codatt)
// Se stiamo ricalcolando per registri(_recalc_regis) azzera PRM e PRP
start = 2; stop = 3;
}
else
if (atoi(_year) < 1998)
stop = 0; // Solo PIM
// PIM / PIS
for (int i = start; i <= stop; i++) // Ciclo per le tabelle da azzerare
{
@ -580,12 +577,15 @@ bool TLiquidazione_app::ivadiff_chiusa(const TRectype& mov, const TDate& fine) c
const TDate data = rid.get("DATAREGP");
if (data > fine)
continue;
if (data == fine && rid.get_long("NUMREGP") == numreg)
continue; // Ignora pagamento automatico dopo un anno
const real imp = rid.get(RMI_IMPOSTA);
if (!imp.is_zero())
{
const char sez = rid.get_char("SEZIONE");
tot += TImporto(sez, imp);
if (rid.get_int(MOV_TIPOMOV) > 1)
if (!some_pag && rid.get_int(MOV_TIPOMOV) > 1)
some_pag = true;
}
}
@ -786,6 +786,59 @@ static void LOG_IVA_DIFF(const TRectype& id)
#endif
}
static void LOG_PIM_DIFF(const TRectype& pim)
{
#ifndef NDEBUG
static FILE* file[2] = { NULL, NULL };
const real iva_ven = pim.get("R29");
const real iva_acq = pim.get("R33");
int nf = -1;
if (!iva_ven.is_zero())
nf = 0; else
if (!iva_acq.is_zero())
nf = 1;
if (nf < 0)
return;
FILE*& f = file[nf];
if (f == NULL)
{
const char* name = NULL;
switch (nf)
{
case 0: name = "PIM_Ven_Diff.log"; break;
case 1: name = "PIM_Acq_Diff.log"; break;
default: break;
}
fopen_s(&f, name, "w");
if (f == NULL)
{
cantwrite_box(name);
fopen_s(&f, name, "w");
}
if (f != NULL)
fprintf(f, "CODTAB\tGen\tFeb\tMar\tApr\tMag\tGiu\tLug\tAgo\tSet\tOtt\tNov\tDic\n");
}
if (f != NULL)
{
TToken_string msg(255, '\t');
const TString& codtab = pim.get("CODTAB");
msg = codtab;
const int mese = atoi(codtab.mid(14, 2));
for (int i = mese; i > 0; i--)
msg.add(" ");
if (!iva_ven.is_zero())
msg.add(iva_ven.stringa(0,2));
else
msg.add(iva_acq.stringa(0,2));
fprintf(f, "%s\n", (const char*)msg);
}
#endif
}
static bool is_autofattura_articolo_17(const TRectype& mov)
{
// E' giusto prendere il tipo documento dal movimento senza fidarsi della causale? si.
@ -978,7 +1031,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
if (_isviaggio)
f74 = TDate(1, 1, year_int-1);
if (_recalc_regis) // Vecchia selezione priam del 1998 o calcolo progressivi per stampa registri bollati
if (_recalc_regis) // Vecchia selezione prima del 1998 o calcolo progressivi per stampa registri bollati
{
t.set_month(month == 13 ? 12 : month);
t.set_year(year_int);
@ -1047,7 +1100,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
}
#ifndef NDEBUG
if (_mov->get_long(MOV_CODCF) == 940)
if (_mov->get_long(MOV_NUMREG) == 21438)
int cazzone = 1;
#endif
@ -1069,15 +1122,15 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
continue; // Ignora movimento di split payment
// Inizio gestione IVA differita
const bool iva_diff = _mov->get_bool(MOV_LIQDIFF);
const bool iva_diff = _mov->get_bool(MOV_LIQDIFF) && is_IVA_diff(_mov->curr());
const bool iva_cass = !iva_diff && !_isviaggio && tm > tm_nessuno && _mov->get_bool(MOV_IVAXCASSA) && is_IVAxCassa(_mov->curr());
const bool movdiff = (iva_diff || iva_cass) && !_recalc_regis; // Aggiunto test su ricalcolo da registri 13-12-2012
const bool bIsMovDiff = (iva_diff || iva_cass) && !_recalc_regis; // Aggiunto test su ricalcolo da registri 13-12-2012
bool dok = is_date_ok(date, month, liqmonth, year_int);
TPartite_array arrpart; // Partite interessate
TPointer_array pagscatt; // Righe di pagsca interessate
if (movdiff && tm == tm_fattura)
if (bIsMovDiff && tm == tm_fattura)
{
const bool id_chiusa = ivadiff_chiusa(_mov->curr(), inizio);
if (!dok && id_chiusa)
@ -1244,7 +1297,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
if (_comp_acconto && !_isdifferita && date.month() == accmonth && date.day() > 20)
continue;
// Ciclo sulle righe iva del movimento
// Ciclo sulle righe IVA del movimento
do
{
const int rmi_tipoatt = max(_rmoviva->get_int(RMI_TIPOATT), 1); // Poteva capitare tipoatt == 0
@ -1314,7 +1367,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
real impon_det; // Imponibile detraibile
real impos_det; // Imposta detraibile
if (movdiff && tm == tm_fattura)
if (bIsMovDiff && tm == tm_fattura)
{
const char sezfat = tipomov == vendita ? 'D' : 'A';
const TDate datareg = _mov->get(MOV_DATAREG);
@ -1346,6 +1399,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
id.put("IMPORTO", imponibile_orig+imposta_orig);
id.put(RMI_IMPONIBILE, imponibile_orig);
/* cazzata?
if (percind > ZERO) // Nel caso di IVA indetraibile memorizza solo la parte detraibile!
{
real imp_det, iva_det, imp_ind, iva_ind;
@ -1354,6 +1408,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
id.put(RMI_IMPOSTA, iva_det);
}
else
*/
id.put(RMI_IMPOSTA, imposta_orig);
const int ew = id.write_rewrite();
@ -1503,7 +1558,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
}
else
{
if (movdiff)
if (bIsMovDiff)
{
if (is_date_ok(date, month, liqmonth, year_int)) // 5-3-2014
{
@ -1525,7 +1580,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
//qui da verificare
if ((imponibile.is_zero() && imposta.is_zero()) &&
(movdiff &&
(bIsMovDiff &&
(is_detraibile > 0 ||
(diff_imp.is_zero() && diff_iva.is_zero() &&
incdiff_imp.is_zero() && incdiff_iva.is_zero())
@ -1575,7 +1630,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
codreg = comune.get_int(COM_CODREG) + 1;
}
if (movdiff)
if (bIsMovDiff)
{
vt_imponibile[codreg] += incdiff_imp;
vt_imposta[codreg] += incdiff_iva;
@ -2359,28 +2414,27 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
cs.add(v.string(), 1);
tab->put("S2",cs);
if (is_detraibile == 0 &&
(!diff_imp.is_zero() ||!diff_iva.is_zero() ||
if (is_detraibile == 0 && // eseguire solo una volta (is_detraibile è in un ciclo da 0 a 1)
(!diff_imp.is_zero() || !diff_iva.is_zero() ||
!incdiff_imp.is_zero() || !incdiff_iva.is_zero()))
{
if (tipomov == vendita)
{
#ifndef NDEBUG
if (month == 7 && reg == "VEN" && !incdiff_iva.is_zero())
{
const real oldv = _pim->get("R29");
const real newv = oldv + incdiff_iva;
__trace("%s %s\t%s\t%s\t%7ld\t%s\t+\t%s\t=\t%s", tab->name(), (const char*)tab->curr().get("CODTAB"), (const char*)reg, (const char*)tipocr_s,
_mov->get_long(MOV_NUMREG), oldv.stringa(12, 2), incdiff_iva.stringa(12, 2), newv.stringa(12, 2));
}
#endif
// fatture vendita a liquidazione differita
if (month == 13 && reg == "VEN" && !incdiff_iva.is_zero())
{
const real oldv = tab->get("R29");
const real newv = oldv + incdiff_iva;
__trace("%s %s\t%s\t%s\t%7ld\t%s\t+\t%s\t=\t%s", tab->name(), (const char*)tab->curr().get("CODTAB"), (const char*)reg, (const char*)tipocr_s,
_mov->get_long(MOV_NUMREG), oldv.stringa(12, 2), incdiff_iva.stringa(12, 2), newv.stringa(12, 2));
}
#endif
// fatture vendita a liquidazione differita
tab->curr().add("R26", diff_imp);
tab->curr().add("R27", diff_iva);
tab->curr().add("R28", incdiff_imp);
tab->curr().add("R29", incdiff_iva);
tab->curr().add("R29", incdiff_iva);
fdiff_imp += diff_imp;
fdiff_iva += diff_iva;
fdiffinc_imp += incdiff_imp;
@ -2670,7 +2724,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
_plm->rewrite();
_pam->rewrite();
_pum->rewrite();
_pom->rewrite();
_pom->rewrite();
if (month == 13)
{
@ -2678,10 +2732,8 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
for (int reg = 0; reg < 23; reg++)
{
look_pem(pem, reg);
real r = pem.get_real("R0") + vt_imponibile[reg];
pem.put("R0", r);
r = pem.get_real("R1") + vt_imposta[reg];
pem.put("R1", r);
pem.curr().add("R0", vt_imponibile[reg]);
pem.curr().add("R1", vt_imposta[reg]);
pem.rewrite();
}
}
@ -3436,7 +3488,6 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
// totali per annuali
real vol_aff_1 = ZERO;
real vol_aff_2 = ZERO;
real vol_aff_t = ZERO;
real vol_aff_l = ZERO;
real tot_cong = ZERO;
@ -3458,9 +3509,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
}
TLocalisamfile& attiv = _nditte->lfile(LF_ATTIV);
const char* tmpatt;
while ((tmpatt = atts.get()) != NULL)
FOR_EACH_TOKEN (atts, tmpatt)
{
const TString16 att = tmpatt;
@ -3626,21 +3675,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
*/
if (attc == 0 && is_lim && is_month_ok_strict(m,month))
{
bool somma_rettifiche = FALSE;
if (year_int < 2000)
{
// se sono per benzinaro le conta solo in annuale,
// se no vanno solo in periodica
// almeno cosi' dicevano fino ad agosto
// poi, sara' il caldo, mi hanno detto che e' sbagliato
const TString& descrett = _lim->get("S0");
const bool isforbenzinaro = descrett[0] == '$' || (descrett[0] == '>' && descrett[1] == '>');
somma_rettifiche = !(month == 13 && !isforbenzinaro) && m < 13;
}
else
{
somma_rettifiche = month < 13 || m < 13; // CM00278
}
const bool somma_rettifiche = month < 13 || m < 13; // CM00278
if (somma_rettifiche)
{
const real rett = _lim->get_real("R5");
@ -3787,30 +3822,26 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
if (month == 13)
{
// totalizza volumi affari e calcola nuovo prorata
// per tutte le attivita'
atts.restart();
while ((tmpatt = atts.get()) != NULL)
// totalizza volumi affari e calcola nuovo prorata per tutte le attività
FOR_EACH_TOKEN(atts, tmpatt)
{
const TString8 att(tmpatt);
const TString8 att = tmpatt;
const int tipoatt = att.right(1)[0] - '0';
if (tipoatt == 1) // su PLA l'attivita' e' sempre 1
{
if (!look_pla(att))
continue;
real vf1 = _pla->get_real("R14");
real vf2 = _pla->get("S1");
real iaq = _pla->get_real("R11"); // IVA acquisti
real ppg = _pla->get_real("R12"); // pro-rata pagato
const real vf1 = _pla->get("R14");
const real vf2 = _pla->get("S1");
const real iaq = _pla->get("R11"); // IVA acquisti
const real ppg = _pla->get("R12"); // pro-rata pagato
vol_aff_1 += vf1;
vol_aff_2 += vf2;
vol_aff_t = vf1 + vf2;
vol_aff_2 += vf2;
vol_aff_l += _pla->get_real("R0"); // volume affari lordo
real es_c1 = _pla->get_real("R1");
real es_c1 = _pla->get_real("R1"); // Tipo esenzione B1
real es_c2 = _pla->get_real("R2");
real es_c3 = _pla->get_real("R3");
real es_c1a = _pla->get_real("R15");
@ -3821,7 +3852,7 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
real prorata = 0.0;
real conguaglio = 0.0;
real topay = 0.0;
const real ris = vol_aff_t; // gia' esclusi: NS, B3, cess. amm
const real ris = vf1 + vf2; // gia' esclusi: NS, B3, cess. amm
// calcola nuovo prorata dal 1998 per ogni attivita' (miste: 1+2)
const real rsa = ris - (es_c1a-es_c1a_am) - (es_c3-es_c3_am);
@ -4176,10 +4207,8 @@ void TLiquidazione_app::recalc_annual(const char* att)
real ven_lrd = 0.0;
real volaff1 = 0.0;
real volaff2 = 0.0;
real imp_ifs = 0.0;
real imp_af = 0.0;
real imp_va7 = 0.0;
TString16 codiva,reg,tiva;
TString4 codiva,reg,tiva;
TToken_string va7("",'!');
const TString8 aaa(att);
@ -4217,26 +4246,25 @@ void TLiquidazione_app::recalc_annual(const char* att)
reg = *_pim_codreg;
look_iva(codiva); look_reg(reg);
tiva = _iva->get("S1");
const bool b3 = _iva->get("S2") == "B3" && atoi(_year) < 1998;
tiporeg treg = (tiporeg)_reg->get_long("I0");
const tiporeg treg = (tiporeg)_reg->get_long("I0");
const bool corrisp = _reg->get_bool("B0");
const tipo_sospensione simp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna;
imp_ifs = _pim->get_real("R0");
imp_af = _pim->get_real("R7");
va7 = _pim->get("S0");
imp_va7 = va7.get(0);
imp_ifs -= imp_af + imp_va7; // Toglie le autofatture e le op. VA7
if ( // ESCLUSI:
strcmp(att,*_pim_codatt) != 0 ||
treg != vendita || // non vendite
tipocr == 4 || // cessioni beni ammortizzabili
tiva == "NS" || // non soggetti
b3 || // bi tre
simp == normale ||
simp == liquidazione) // sospensione di imposta
continue;
real imp_ifs = _pim->get("R0"); // Imponibile
real imp_af = _pim->get("R7"); // Autofatture
va7 = _pim->get("S0");
real imp_va7 = va7.get(0); // operazioni VA7
imp_ifs -= imp_af + imp_va7; // Toglie le autofatture e le op. VA7
if (corrisp)
{
imp_ifs += _pim->get_real("R5"); // Se corrisp. aggiunge le FS
@ -4314,3 +4342,4 @@ void TLiquidazione_app::recalc_annual(const char* att)
_pla->put("S1", volaff2.string());
_pla->rewrite();
}

View File

@ -507,7 +507,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
real autodafe, autodafe_iva, art40, art40_iva;
real diffimp, diffiva, diffincimp, diffinciva;
real diffimp_acq, diffiva_acq, diffincimp_acq, diffinciva_acq;
bool skip_acq = atts.items() == 1 && _mixed;
const bool skip_acq = atts.items() == 1 && _mixed;
// descrittore riga autodafe'
_DescrItem* ads = NULL;
@ -534,7 +534,6 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
// aggiunti alla fine del ciclo, scorrendo tutte le righe generate.
TAssoc_array corr_ann;
_CorrItem cx;
bool is_key;
FOR_EACH_TOKEN(atts, tmpatt)
{
@ -547,6 +546,10 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
// compute
const TString80 codtab = tab->get("CODTAB");
const TString4 anno = codtab.mid(0,4);
if (anno != _year)
break; // 27-02-2014 finiamo con l'anno sbagliato!
const TString8 activity= codtab.mid(4,6);
const int mese = atoi(codtab.mid(13,2));
const int tipodet = atoi(codtab.mid(20,1));
@ -588,29 +591,25 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
diffincimp_acq = tab->get_real("R32");
diffinciva_acq = tab->get_real("R33");
const bool is_rit= tipodet != 0 && month == 13 && rit_imp != 0.0; //Se fattura in ritardo con tipo detr. != 0 e si sta calcolando l'annuale
const bool is_rit= tipodet != 0 && month == 13 && !rit_imp.is_zero(); //Se fattura in ritardo con tipo detr. != 0 e si sta calcolando l'annuale
const tipo_sospensione sosp_imp = _reg->get_bool("B1") ? (tipo_sospensione) _reg->get_int("I9") : nessuna;
issosp |= (sosp_imp != nessuna); // Setta il flag di presenza registri in sospensione (qualsiasi tipo: normale, vol_affari, liquidazione)
// ACHTUNG! Corrispettivi da ventileer possono ventilare
// ad un altro codiva; in tal caso si scrive quello
// ACHTUNG! Corrispettivi da ventileer possono ventilare ad un altro codiva; in tal caso si scrive quello
if (corrisp && other.full())
{
look_iva(other);
codiva = other;
}
// se e' corrispettivo da ventilare non
// scrivo un cannolo ripieno visto che e' stato ventilato
// se e' corrispettivo da ventilare non scrivo un cannolo ripieno visto che e' stato ventilato
if (tipomov == vendita && tipoiva == "VE" && !describe_pis)
continue;
// se e' il dettaglio di una attivita' mista non stampa
// gli acquisti, il perche' losalamadonna
// se e' il dettaglio di una attivita' mista non stampa gli acquisti, il perche' losalamadonna
if (tipomov == acquisto && skip_acq)
continue;
// questi non vanno in liquidazione, i totali sono
// gia' calcolati altrove
// questi non vanno in liquidazione, i totali sono gia' calcolati altrove
if ((tipodet == 1 || tipodet == 3 || tipodet == 9) && !is_rit)
continue;
@ -631,23 +630,23 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
tab->get_real("R33").is_zero())
continue;
if (activity == att && is_month_plain(mese) && _year == anno)
if (activity == att && is_month_plain(mese) /*&& _year == anno*/) // commentato 27-02-2015
{
// vedi se c'e' gia' un item corrispondente
int i;
for(i = last+1; i < _descr_arr.items(); i++)
{
_DescrItem* wd = (_DescrItem*)&_descr_arr[i];
if (wd->_flags == PIM_PIS && wd->_s0 == ref && wd->_s1 == codiva)
_DescrItem& wd = (_DescrItem&)_descr_arr[i];
if (wd._flags == PIM_PIS && wd._s0 == ref && wd._s1 == codiva)
{
d = wd;
d = &wd;
break;
}
if (wd->_flags == TOT_ROW)
if (wd._flags == TOT_ROW)
break;
if (wd->_flags == PIM_PIS &&
wd->_s0 == ref &&
wd->_s1 > codiva)
if (wd._flags == PIM_PIS &&
wd._s0 == ref &&
wd._s1 > codiva)
break;
}
if (d == NULL)
@ -691,7 +690,7 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
}
else // vendita
{
is_key = corr_ann.is_key(codiva);
const bool is_key = corr_ann.is_key(codiva);
cx._totale = 0;
_CorrItem& ca = is_key ? (_CorrItem&) corr_ann[codiva] : cx;
if (sosp_imp != vol_affari)
@ -861,17 +860,17 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
int j;
for (j = totpos + 1; j < _descr_arr.items(); j++)
{
_DescrItem* wd = (_DescrItem*)&_descr_arr[j];
const bool found = wd->_flags == id && wd->_s0 == ref;
_DescrItem& wd = (_DescrItem&)_descr_arr[j];
const bool found = wd._flags == id && wd._s0 == ref;
if (found && wd->_s1 == codiva)
if (found && wd._s1 == codiva)
{
d = wd;
d = &wd;
break;
}
if (wd->_flags == TOT_ROW_DI)
if (wd._flags == TOT_ROW_DI)
break;
if (found && wd->_s1 > codiva)
if (found && wd._s1 > codiva)
break;
}
if (d == NULL)
@ -1153,19 +1152,13 @@ void TLiquidazione_app::describe_pims(int month, const char* codatt, const bool
// calcola nuovo prorata per ogni attivita' (miste: 1+2)
real pr;
if (atoi(_year) > 1997) // Calcolo dal 1998 in poi
const real rsa = ris - (e3-e5) - (e4-e6);
if (!rsa.is_zero())
{
const real rsa = ris - (e3-e5) - (e4-e6);
const real rsn = rsa - e1;
if (!rsa.is_zero())
pr = CENTO - (rsn * CENTO / rsa); // Percentuale di indetraibilita: reciproco della percentuale di detraibilita'
pr = CENTO - (rsn * CENTO / rsa); // Percentuale di indetraibilita: reciproco della percentuale di detraibilita'
pr.round(0);
}
else
{
if (!ris.is_zero())
pr = e1 * CENTO / ris;
}
pr.round(0);
real co = 0.0;
real topay = 0.0;
@ -1236,11 +1229,6 @@ void TLiquidazione_app::describe_liq(int month, const char* codatts, _DescrItem*
d->_r29 = _lim->get_real("R29"); // fdiffinc_iva_ven
d->_r33 = _lim->get_real("R33"); // fdiffinc_iva_acq
/* Dal 1998 in poi il conguaglio prorata non va stampato, ma conglobato nell'iva acquisti
if (atoi(_year) <= 1997)
d->_r10 = _lim->get_real("R7"); // totale conguaglio prorata
*/
TToken_string tt(80);
tt.add(_lam->get_real("R0").string()); // IVA Vendite
tt.add(_lam->get_real("R1").string()); // IVA Acquisti
@ -1479,10 +1467,7 @@ void TLiquidazione_app::set_att(_DescrItem& d)
if (d._f1 == 13)
{
if (d._s4 == "T" && !(d._f2)) // trimestrale e non benzinaro
tim_title << format(FR(": Riepilogo Annuale %s"),(const char*)_year);
else
tim_title << format(FR(": Dichiarazione Annuale %s"),(const char*)_year);
tim_title << format(FR(": Riepilogo Annuale %s"),(const char*)_year);
}
else
{
@ -1634,6 +1619,7 @@ void TLiquidazione_app::set_liqacc_1999(_DescrItem& d)
int TLiquidazione_app::calc_inc_diff(int tipoiva, real& imponibile_diff, real& imposta_diff, real& imponibile_xcas, real& imposta_xcas) const
{
CHECKD(tipoiva == 1 || tipoiva == 2, "Bad tipo iva:", tipoiva);
int flag = 0;
imponibile_diff = imposta_diff = imponibile_xcas = imposta_xcas = ZERO;
@ -1649,10 +1635,14 @@ int TLiquidazione_app::calc_inc_diff(int tipoiva, real& imponibile_diff, real& i
for (bool ok = id.move_first(); ok; ok = id.move_next())
{
const real iva = rec.get_real(RMI_IMPOSTA);
if (!iva.is_zero())
const real imp = rec.get_real(RMI_IMPONIBILE);
if (!iva.is_zero() || !imp.is_zero())
{
#ifdef DBG
if (iva.is_zero() && !imp.is_zero())
int cazzonga = 1;
#endif
const int tipodiff = rec.get_int("TIPODIFF");
const real imp = rec.get_real(RMI_IMPONIBILE);
switch (tipodiff)
{
case 1: imponibile_diff += imp; imposta_diff += iva; break;

View File

@ -134,9 +134,29 @@ bool gestione_IVAxCassa(const TDate& data_mov, long firm)
return yes;
}
static bool mov_has_imposte(const TRectype& mov)
{
const char tipocf = mov.get_char(MOV_TIPO);
if (tipocf == 'C' || tipocf == 'F')
{
tipo_movimento tm = (tipo_movimento)mov.get_int(MOV_TIPOMOV);
if (tm == tm_nessuno)
{
const TString& tipodoc = mov.get(MOV_TIPODOC);
if (tipodoc == "FV" || tipodoc == "FA")
tm = tm_fattura; else
if (tipodoc == "NC")
tm = tm_nota_credito;
}
return tm == tm_fattura || tm == tm_nota_credito;
}
return false;
}
bool is_split_payment(const TRectype& mov)
{
if (mov.get_char(MOV_TIPO) == 'C' && mov.get_int(MOV_ANNOIVA) >= 2015 && mov.get_real(MOV_RITFIS).is_zero())
if (mov_has_imposte(mov) && mov.get_int(MOV_ANNOIVA) >= 2015 && mov.get_real(MOV_RITFIS).is_zero())
{
const TRectype& clifo = cache().get_rec(LF_CLIFO, "C", mov.get(MOV_CODCF));
if (clifo.get_bool(CLI_SPLITPAY)) // Ente pubblico con split payment
@ -150,21 +170,25 @@ bool is_split_payment(const TRectype& mov)
return false;
}
bool is_IVA_diff(const TRectype& mov)
{
if (!mov.get_bool(MOV_LIQDIFF) || mov.get_bool(MOV_IVAXCASSA))
return false;
return mov_has_imposte(mov) && !is_split_payment(mov);
}
bool is_IVAxCassa(const TRectype& mov)
{
if (mov.get_bool(MOV_LIQDIFF) || !mov.get_bool(MOV_IVAXCASSA) || mov.get_char(MOV_TIPO) < 'C')
if (mov.get_bool(MOV_LIQDIFF) || !mov.get_bool(MOV_IVAXCASSA))
return false;
tipo_movimento tm = (tipo_movimento)mov.get_int(MOV_TIPOMOV);
if (tm == tm_nessuno)
{
const TString& tipodoc = mov.get(MOV_TIPODOC);
if (tipodoc == "FV" || tipodoc == "FA")
tm = tm_fattura; else
if (tipodoc == "NC")
tm = tm_nota_credito;
}
if (tm != tm_fattura && tm != tm_nota_credito)
if (!mov_has_imposte(mov))
return false;
const TDate data_reg = mov.get(MOV_DATAREG);
const TDate data_doc = mov.get(MOV_DATADOC);
const TDate data_rif = data_doc.ok() && data_doc < data_reg ? data_doc : data_reg;
if (!gestione_IVAxCassa(data_rif))
return false;
const TRectype& clifo = cache().get_rec(LF_CLIFO, mov.get(MOV_TIPO), mov.get(MOV_CODCF));
@ -186,7 +210,7 @@ bool is_IVAxCassa(const TRectype& mov)
if (paiv.full())
alleg = 0; // Falso allarme: NON è un privato avendo partita IVA
}
if (alleg == 7 || (clifo.get_bool(CLI_SPLITPAY) && is_split_payment(mov)))
if ((alleg == 7 || alleg == 4) && is_split_payment(mov))
{
return false;
}
@ -196,10 +220,7 @@ bool is_IVAxCassa(const TRectype& mov)
return false;
}
const TDate data_reg = mov.get(MOV_DATAREG);
const TDate data_doc = mov.get(MOV_DATADOC);
const TDate data_rif = data_doc.ok() && data_doc < data_reg ? data_doc : data_reg;
return gestione_IVAxCassa(data_rif);
return true;
}

View File

@ -159,6 +159,7 @@ int get_tipodet_from_rmi(const TRectype& rmi, const TRectype& mv, real& percind,
bool gestione_IVAxCassa(const TDate& data, long firm = 0);
bool is_split_payment(const TRectype& mov);
bool is_IVA_diff(const TRectype& mov);
bool is_IVAxCassa(const TRectype& mov);
#endif

View File

@ -792,20 +792,25 @@ int TRiga_partite::ultima_ratapagata() const
// Certified 100%
tipo_movimento TRiga_partite::tipo() const
{
tipo_movimento tm = (tipo_movimento)(get_int(PART_TIPOMOV));
tipo_movimento tm = (tipo_movimento)get_int(PART_TIPOMOV);
if (tm == tm_nessuno)
{
// Tento salvataggioin extremis
const int nriga = get_int(PART_NRIGA);
if (nriga == 1 && get_date(PART_DATADOC).ok())
tm = tm_fattura; else
if (nriga > 1 && get_date(PART_DATAPAG).ok())
tm = tm_pagamento;
#ifdef DBG
if (tm == tm_nessuno && nriga != TPartita::UNASSIGNED)
yesnofatal_box("Riga partite con un tipo losco.");
#endif
if (nriga != TPartita::UNASSIGNED)
{
if (get_date(PART_DATAPAG).ok())
tm = tm_pagamento; else
if (get_date(PART_DATADOC).ok())
tm = tm_fattura;
#ifdef DBG
else
yesnofatal_box("Riga partite %c%ld %d/%s : %d con un tipo losco.",
get_char(PART_TIPOCF), get_long(PART_SOTTOCONTO),
get_int(PART_ANNO), (const char*)get(PART_NUMPART), nriga);
#endif
}
}
return tm;

View File

@ -1,3 +1,3 @@
29
0
$scad|0|0|218|0|Scadenze|NPART*2||
$scad|0|0|224|0|Scadenze|NPART*2||

View File

@ -1,5 +1,5 @@
29
29
30
ANNO|2|4|0|Anno
NUMPART|1|7|0|Numero partita
NRIGA|2|4|0|Numero riga
@ -27,6 +27,7 @@ CODABI|10|5|0|Codice ABI
CODCAB|10|5|0|Codice CAB
CODAG|1|5|0|Codice agente
BLOCCATA|8|1|0|Scadenza non pagabile (bloccata) solo acquisti
MOTIVO|1|6|0|Motivo del blocco
TNRIGA|2|4|0|Numero temporaneo di riga partita
TNRATA|2|4|0|Numero temporaneo di rata
2