Corretto calcolo prorata escludendo i beni ammortizzabili

git-svn-id: svn://10.65.10.50/branches/R_10_00@22992 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2014-09-22 13:53:19 +00:00
parent f49be2e4f1
commit cabf66ad4e
11 changed files with 218 additions and 179 deletions

View File

@ -4,7 +4,10 @@
#include <prefix.h> #include <prefix.h>
#include <progind.h> #include <progind.h>
#include <recarray.h> #include <recarray.h>
#include <relation.h>
#include <recset.h>
#include <sheet.h> #include <sheet.h>
#include <urldefid.h>
#include "cgsaldac.h" #include "cgsaldac.h"
@ -15,18 +18,8 @@
#include <rmov.h> #include <rmov.h>
#include <rmoviva.h> #include <rmoviva.h>
#ifndef FOR_EACH_FILE_RECORD
#define FOR_EACH_FILE_RECORD(isamfile) \
for (int _e##isamfile = isamfile.first(); \
_e##isamfile == NOERR; \
_e##isamfile = isamfile.next())
#endif
class TElimina_zoppi : public TSkeleton_application class TElimina_zoppi : public TSkeleton_application
{ {
// TArray _files;
TArray _decoders; TArray _decoders;
protected: protected:
@ -40,11 +33,11 @@ protected:
static int kill_row(long numreg, char tipor, int numrig); static int kill_row(long numreg, char tipor, int numrig);
static bool firm_handler(TMask_field& f, KEY k); static bool firm_handler(TMask_field& f, KEY k);
static bool select_handler(TMask_field& f, KEY k);
public: public:
const char* app_name() const {return TR("Righe prima nota errate");} const char* app_name() const {return TR("Righe prima nota errate");}
const char* decode(int num, const char* key, const char* field); const char* decode(int num, const char* key, const char* field);
const char* decode(int num, long key, const char* field);
virtual void main_loop(); virtual void main_loop();
}; };
@ -56,22 +49,14 @@ bool TElimina_zoppi::firm_handler(TMask_field& f, KEY k)
if (k == K_F9) if (k == K_F9)
{ {
TArray_sheet sheet(-1, -1, 70, 20, TR("Scelta ditta"), HR("Codice|Ragione Sociale@50")); TArray_sheet sheet(-1, -1, 70, 20, TR("Scelta ditta"), HR("Codice|Ragione Sociale@50"));
TToken_string row; TString_array& rows = sheet.rows_array();
TLocalisamfile ditte(LF_NDITTE); prefix().firms(rows);
FOR_EACH_ARRAY_ROW(rows, r, row)
FOR_EACH_FILE_RECORD(ditte)
{ {
const long cod = ditte.get_long(NDT_CODDITTA); const long cod = row->get_long(0);
if (prefix().exist(cod)) row->add(app().decode(LF_NDITTE, cod, NDT_RAGSOC));
{ if (cod == prefix().get_codditta())
row.cut(0); sheet.select(r);
row.add(cod);
row.add(ditte.get(NDT_RAGSOC));
const long pos = sheet.add(row);
if (cod == prefix().get_codditta())
sheet.select(pos);
}
} }
if (sheet.run() == K_ENTER) if (sheet.run() == K_ENTER)
{ {
@ -86,7 +71,7 @@ bool TElimina_zoppi::firm_handler(TMask_field& f, KEY k)
if (ok) if (ok)
prefix().set_codditta(cod); prefix().set_codditta(cod);
else else
f.error_box(FR("La ditta %05ld non e' attivata per la contabilita'"), cod); f.error_box(FR("La ditta %05ld non è attivata per la contabilità"), cod);
} }
return ok; return ok;
@ -103,11 +88,19 @@ const char* TElimina_zoppi::decode(int num, const char* key, const char* field)
return dec->decode(key); return dec->decode(key);
} }
const char* TElimina_zoppi::decode(int num, long key, const char* field)
{
TString8 k; k.format("%ld", key);
return decode(num, k, field);
}
bool TElimina_zoppi::test_row_file(int lf_rmov, TString_array& arr) bool TElimina_zoppi::test_row_file(int lf_rmov, TString_array& arr)
{ {
bool ok = true; bool ok = true;
TLocalisamfile mov(LF_MOV); TLocalisamfile mov(LF_MOV);
TLocalisamfile row(lf_rmov);
TString8 query; query.format("USE %d", lf_rmov);
TISAM_recordset recset(query);
TString msg; TString msg;
switch (lf_rmov) switch (lf_rmov)
@ -119,7 +112,7 @@ bool TElimina_zoppi::test_row_file(int lf_rmov, TString_array& arr)
} }
msg << ": 0"; msg << ": 0";
TProgind pi(row.items(), msg, true, true); TProgress_monitor pi(recset.items(), msg);
TToken_string riga, descr; TToken_string riga, descr;
long reg, last_reg = 0, found = 0; long reg, last_reg = 0, found = 0;
@ -129,9 +122,10 @@ bool TElimina_zoppi::test_row_file(int lf_rmov, TString_array& arr)
int gruppo, conto; int gruppo, conto;
long sottoconto; long sottoconto;
FOR_EACH_FILE_RECORD(row) const TRectype& row = recset.cursor()->curr();
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{ {
if (!pi.addstatus(1)) if (!pi.add_status(1))
{ {
ok = false; ok = false;
break; break;
@ -242,8 +236,7 @@ bool TElimina_zoppi::test_riga_partita(const TRectype& pagsca)
k.add(pagsca.get(PART_ANNO)); k.add(pagsca.get(PART_ANNO));
k.add(pagsca.get(PART_NUMPART)); k.add(pagsca.get(PART_NUMPART));
k.add(nriga); k.add(nriga);
const TRectype& part = cache().get(LF_PARTITE, k); const int tipomov = atoi(app().decode(LF_PARTITE, k, PART_TIPOMOV));
const int tipomov = part.get_int(PART_TIPOMOV);
ok = tipomov == 1; ok = tipomov == 1;
} }
@ -253,7 +246,9 @@ bool TElimina_zoppi::test_riga_partita(const TRectype& pagsca)
bool TElimina_zoppi::test_scrow_file(int lf_pagsca, TString_array& arr) bool TElimina_zoppi::test_scrow_file(int lf_pagsca, TString_array& arr)
{ {
bool ok = true; bool ok = true;
TLocalisamfile pagsca(lf_pagsca);
TString8 query; query.format("USE %d", lf_pagsca);
TISAM_recordset recset(query);
long found = 0; long found = 0;
TString msg; TString msg;
@ -267,12 +262,13 @@ bool TElimina_zoppi::test_scrow_file(int lf_pagsca, TString_array& arr)
msg << ": 0"; msg << ": 0";
msg.center_just(50); msg.center_just(50);
TProgind pi(pagsca.items(), msg, true, true); TProgress_monitor pi(recset.items(), msg);
TToken_string riga, descr; TToken_string riga, descr;
FOR_EACH_FILE_RECORD(pagsca) const TRectype& pagsca = recset.cursor()->curr();
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{ {
if (!pi.addstatus(1)) if (!pi.add_status())
{ {
ok = false; ok = false;
break; break;
@ -287,11 +283,11 @@ bool TElimina_zoppi::test_scrow_file(int lf_pagsca, TString_array& arr)
case LF_PAGSCA: case LF_PAGSCA:
if (pagsca.get_int(PAGSCA_NRIGP) <= 0) if (pagsca.get_int(PAGSCA_NRIGP) <= 0)
to_kill = true; to_kill = true;
if (!test_riga_partita(pagsca.curr())) if (!test_riga_partita(pagsca))
to_kill = true; to_kill = true;
break; break;
case LF_SCADENZE: case LF_SCADENZE:
if (!test_riga_partita(pagsca.curr())) if (!test_riga_partita(pagsca))
to_kill = true; to_kill = true;
break; break;
default: default:
@ -306,7 +302,7 @@ bool TElimina_zoppi::test_scrow_file(int lf_pagsca, TString_array& arr)
msg << found; msg << found;
pi.set_text(msg); pi.set_text(msg);
riga.format(" |%6ld", pagsca.recno()); riga.format(" |%6ld", recset.cursor()->file().recno());
if (lf_pagsca == LF_SCADENZE) if (lf_pagsca == LF_SCADENZE)
riga.add("S"); riga.add("S");
else else
@ -331,8 +327,10 @@ bool TElimina_zoppi::test_scrow_file(int lf_pagsca, TString_array& arr)
bool TElimina_zoppi::test_head_file(TString_array& arr) bool TElimina_zoppi::test_head_file(TString_array& arr)
{ {
TEsercizi_contabili esc;
bool ok = true; bool ok = true;
TLocalisamfile mov(LF_MOV); TISAM_recordset recset("USE MOV");
TLocalisamfile rmov(LF_RMOV); TLocalisamfile rmov(LF_RMOV);
TLocalisamfile rmoviva(LF_RMOVIVA); TLocalisamfile rmoviva(LF_RMOVIVA);
@ -340,31 +338,39 @@ bool TElimina_zoppi::test_head_file(TString_array& arr)
msg << TR("Controllo testate di prima nota: 0"); msg << TR("Controllo testate di prima nota: 0");
msg.center_just(50); msg.center_just(50);
TProgind pi(mov.items(), msg, true, true, 50); TProgress_monitor pi(recset.items(), msg);
TToken_string riga, descr; TToken_string riga, descr;
const TRectype& mov = recset.cursor()->curr();
FOR_EACH_FILE_RECORD(mov) for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{ {
if (pi.iscancelled()) if (!pi.add_status())
{ {
ok = false; ok = false;
break; break;
} }
pi.addstatus(1);
long reg = mov.get_long(MOV_NUMREG); long reg = mov.get_long(MOV_NUMREG);
int rmov_err = NOERR;
int rmoviva_err = NOERR; bool good = reg > 0;
if (reg > 0) if (good)
{ {
//int rmoviva_err = NOERR;
rmov.put(RMV_NUMREG, reg); rmov.put(RMV_NUMREG, reg);
rmov.put(RMV_NUMRIG, 1); rmov.put(RMV_NUMRIG, 1);
rmov_err = rmov.read(); int rmov_err = rmov.read();
rmoviva.put(RMI_NUMREG, reg); /*rmoviva.put(RMI_NUMREG, reg);
rmoviva.put(RMI_NUMRIG, 1); rmoviva.put(RMI_NUMRIG, 1);
rmoviva_err = rmoviva.read(); int rmoviva_err = rmoviva.read();*/
good = rmov_err == NOERR;
if (good)
{
const int annoes = mov.get_int(MOV_ANNOES);
good = annoes > 0 && esc.exist(annoes);
}
} }
if (reg == 0 || (rmov_err != NOERR && rmoviva_err != NOERR))
if (!good)
{ {
riga.format(" |%6ld|T", reg); riga.format(" |%6ld|T", reg);
riga.add(mov.get(MOV_ANNOES)); riga.add(mov.get(MOV_ANNOES));
@ -487,18 +493,32 @@ int TElimina_zoppi::kill_row(long numreg, char tipor, int numrig)
rmov.put(RMV_NUMRIG, numrig); rmov.put(RMV_NUMRIG, numrig);
int err = rmov.read(); int err = rmov.read();
if (err == NOERR) if (err == NOERR)
{
err = rmov.remove(); err = rmov.remove();
if (err == NOERR && lf == LF_MOV)
{
// Cancella anche le righe collegate alla testata
for (int r = 1; kill_row(numreg, 'C', r) == NOERR; r++);
for (int r = 1; kill_row(numreg, 'I', r) == NOERR; r++);
}
}
return err; return err;
} }
bool TElimina_zoppi::select_handler(TMask_field& f, KEY k) void TElimina_zoppi::main_loop()
{ {
bool ok = true; open_files(LF_CLIFO, LF_NDITTE, LF_PCON, LF_MOV, LF_RMOV, LF_RMOVIVA, LF_PARTITE, LF_SCADENZE, LF_PAGSCA, 0);
if (k == K_SPACE)
{ TMask m(app_name(), 1, 30, 5);
TArray_sheet sheet(-1, -1, 76, 20, app().app_name(), HR("@1|Codice@6|Riga@5|Anno@R|Importo@20R|Grp@R|Cnt@R|Sottoc@R|Descrizione@50")); m.add_number(DLG_USER, 0, TR("Codice ditta "), 1, 1, 5, "BUF").set_handler(firm_handler);
m.add_button(DLG_ELABORA, 0, "", -12, -1, 10, 2, "", BMP_ELABORA).set_exit_key(K_ENTER);
m.add_button(DLG_QUIT, 0, "", -22, -1, 10, 2);
while (m.run() != K_QUIT)
{
TArray_sheet sheet(0, 0, 0, 0, app().app_name(), HR("@1|Codice@6|Riga@5|Anno@R|Importo@20R|Grp@R|Cnt@R|Sottoc@R|Descrizione@50"));
TString_array& arr = sheet.rows_array(); TString_array& arr = sheet.rows_array();
ok = test_row_file(LF_RMOV, arr); bool ok = test_row_file(LF_RMOV, arr);
if (ok) if (ok)
ok = test_row_file(LF_RMOVIVA, arr); ok = test_row_file(LF_RMOVIVA, arr);
if (ok) if (ok)
@ -515,16 +535,15 @@ bool TElimina_zoppi::select_handler(TMask_field& f, KEY k)
{ {
const long total = sheet.checked(); const long total = sheet.checked();
if (total > 0 && if (total > 0 &&
yesno_box(FR("Confermare l'eliminazione di %ld righe."), total)) delete_box(FR("Confermare l'eliminazione di %ld righe."), total))
{ {
TProgind pi(total, TR("Eliminazione righe..."), true, true); TProgress_monitor pi(total, TR("Eliminazione righe..."));
FOR_EACH_ARRAY_ROW(arr, i, riga) FOR_EACH_ARRAY_ROW(arr, i, riga)
{ {
if (sheet.checked(i)) if (sheet.checked(i))
{ {
if (pi.iscancelled()) if (!pi.add_status())
break; break;
pi.addstatus(1);
TString16 str = riga->get(2); TString16 str = riga->get(2);
char tipor = str[0]; char tipor = str[0];
@ -536,21 +555,6 @@ bool TElimina_zoppi::select_handler(TMask_field& f, KEY k)
} }
} }
} }
return ok;
}
void TElimina_zoppi::main_loop()
{
open_files(LF_CLIFO, LF_NDITTE, LF_PCON, LF_MOV, LF_RMOV, LF_RMOVIVA, LF_PARTITE, LF_SCADENZE, LF_PAGSCA, 0);
TMask m(app_name(), 1, 30, 5);
m.add_number(DLG_USER, 0, TR("Codice ditta "), 1, 1, 5, "BUF");
m.add_button(DLG_SELECT, 0, "", -12, -1, 10, 2);
m.add_button(DLG_QUIT, 0, "", -22, -1, 10, 2);
m.set_handler(DLG_USER, firm_handler);
m.set_handler(DLG_SELECT, select_handler);
while (m.run() != K_QUIT);
} }
void elimina_zoppi(int argc, char* argv[]) void elimina_zoppi(int argc, char* argv[])

View File

@ -2803,12 +2803,10 @@ void TStampa_bilanci::leggi_sort()
void TStampa_bilanci::controlla_conto(int file1,int file2) void TStampa_bilanci::controlla_conto(int file1,int file2)
{ {
char dep = '*';
if (!file1) if (!file1)
if (_cambiato_conto_1) if (_cambiato_conto_1)
{ {
set_row(_i,"@68g%c", dep); set_row(_i,"@67g*");
_cambiato_conto_1 = FALSE; _cambiato_conto_1 = FALSE;
} }
else else
@ -2827,7 +2825,7 @@ void TStampa_bilanci::controlla_conto(int file1,int file2)
if (!file2) if (!file2)
if (_cambiato_conto_2) if (_cambiato_conto_2)
{ {
set_row(_i,"@68g%c", dep); set_row(_i,"@67g*");
_cambiato_conto_2 = FALSE; _cambiato_conto_2 = FALSE;
} }
else else
@ -2878,8 +2876,8 @@ void TStampa_bilanci::set_page(int file, int counter)
if (!counter) if (!counter)
{ {
set_row(_i++,FR("@29gATTIVITA'@94gPASSIVITA'")); set_row(_i++,FR("@29gATTIVITA'@98gPASSIVITA'"));
set_row(_i++,"@29g---------@94g----------"); set_row(_i++,"@29g---------@98g----------");
set_row(_i++, dep); set_row(_i++, dep);
} }
@ -2889,8 +2887,8 @@ void TStampa_bilanci::set_page(int file, int counter)
if (!_salto_pagina) if (!_salto_pagina)
{ {
printer().formfeed(); printer().formfeed();
set_row(_i++,FR("@29gCOSTI@94gRICAVI")); set_row(_i++,FR("@29gCOSTI@98gRICAVI"));
set_row(_i++,"@29g-----@94g------"); set_row(_i++,"@29g-----@98g------");
set_row(_i++, dep); set_row(_i++, dep);
_salto_pagina = TRUE; _salto_pagina = TRUE;
@ -3446,91 +3444,69 @@ void TStampa_bilanci::stampa_totali_uno(const real& r1,const real& r2)
void TStampa_bilanci::stampa_prima_colonna(int g, int c, long s, void TStampa_bilanci::stampa_prima_colonna(int g, int c, long s,
const char* desc, const real& saldo) const char* desc, const real& saldo)
{ {
char dep = '*';
if (_codici) //sono stampate solo le descrizioni dei conti if (_codici) //sono stampate solo le descrizioni dei conti
{ {
if (!_totali) if (!_totali)
{ {
if (c != 0 && s == 0) if (c != 0 && s == 0)
set_row(_i, "%-.44s @44g @49g%r @68g%c", desc, &saldo, dep); set_row(_i, "%-.44s @44g @48g%r", desc, &saldo);
else else
set_row(_i, "%-.48s @49g%r @68g%c", desc, &saldo, dep); set_row(_i, "%-.48s @48g%r", desc, &saldo);
} }
else if ( !(c == 0 && s == 0) ) //se cioe' non e' un gruppo else if ( !(c == 0 && s == 0) ) //se cioe' non e' un gruppo
{ {
if (s == 0) //se e' un conto if (s == 0) //se e' un conto
set_row(_i, "%-.44s @44g @49g%r @68g%c", desc, &saldo, dep); set_row(_i, "%-.44s @44g @48g%r", desc, &saldo);
else else
set_row(_i, "%-.48s @49g%r @68g%c", desc, &saldo, dep); set_row(_i, "%-.48s @48g%r", desc, &saldo);
} }
} }
else else
{ {
if (_totali && c == 0 && s == 0l) if (_totali && c == 0 && s == 0l)
return; return;
else if ( c == 0 && s == 0l )
set_row(_i, "@0g%3d", g);
if (c > 0)
{ {
set_row(_i, "%3d ", g); set_row(_i, "@4g%3d", c);
set_row(_i, "@15g%-.31s @49g%r @68g%c", desc, &saldo, dep); if (s > 0)
} set_row(_i, "@8g%6ld", s);
else if (s == 0l)
{
set_row(_i, "%3d ", g);
set_row(_i, "%3d ", c);
set_row(_i, "@15g%-.31s @49g%r @68g%c", desc, &saldo, dep);
}
else
{
set_row(_i, "%3d ", g);
set_row(_i, "%3d ", c);
set_row(_i, "%6ld ", s);
set_row(_i, "@15g%-.31s @49g%r @68g%c", desc, &saldo, dep);
} }
set_row(_i, "@15g%-.31s @48g%r", desc, &saldo);
} }
set_row(_i, "@67g*");
} }
// Guy: stampa la seconda colonna del bilancio di raffronto // Guy: stampa la seconda colonna del bilancio di raffronto
void TStampa_bilanci::stampa_seconda_colonna(int g, int c, long s, void TStampa_bilanci::stampa_seconda_colonna(int g, int c, long s, const char* desc, const real& saldo)
const char* desc, const real& saldo)
{ {
char dep = '*';
if (_codici) //sono stampate solo le descrizioni dei conti if (_codici) //sono stampate solo le descrizioni dei conti
{ {
if (!_totali) if (!_totali)
{ {
set_row(_i, "@68g%c@69g%-.47s @114g%r", dep, desc, &saldo); set_row(_i, "@67g*@69g%-.47s @114g%r", desc, &saldo);
} }
else else
{
if ( !(c == 0 && s == 0) ) if ( !(c == 0 && s == 0) )
{ set_row(_i, "@67g*@69g%-.47s @114g%r", desc, &saldo);
set_row(_i, "@68g%c @69g%-.47s @114g%r", dep, desc, &saldo); }
}
} }
else else
{ {
if (_totali && c == 0 && s == 0l) if (_totali && c == 0 && s == 0l)
return; return;
else if ( c == 0 && s == 0l )
{ set_row(_i, "@67g*@69g%3d ", g);
set_row(_i, "@68g%c@69g%3d ", dep, g); if (c > 0)
set_row(_i, "@84g%-.30s @114g%r", desc, &saldo);
}
else if (s == 0l)
{ {
set_row(_i, "@68g%c@69g%3d ", dep, g); set_row(_i, "@73g%3d", c);
set_row(_i, "%3d", c); if (s > 0)
set_row(_i, "@84g%-.30s @114g%r", desc, &saldo); set_row(_i, "@77g%6ld", s);
}
else
{
set_row(_i, "@68g%c@69g%3d ", dep, g);
set_row(_i, "%3d ", c);
set_row(_i, "%6ld ",s);
set_row(_i, "@84g%-.30s @114g%r", desc, &saldo);
} }
set_row(_i, "@84g%-.30s @114g%r", desc, &saldo);
} }
} }

View File

@ -2424,12 +2424,12 @@ bool TPrimanota_application::protected_record(TRectype& mov)
{ {
if (mov.get_bool(MOV_STAMPATO)) if (mov.get_bool(MOV_STAMPATO))
{ {
ok = delete_box(FR("Il movimento %ld è già stato stampato sul libro giornale:\n" ok = delete_box(FR("Il movimento %ld è già stato stampato sul libro giornale:\n"
"si desidera eliminarlo ugualmente?"), numreg); "si desidera eliminarlo ugualmente?"), numreg);
} }
if (ok && mov.get_bool(MOV_REGST)) if (ok && mov.get_bool(MOV_REGST))
{ {
ok = delete_box(FR("Il movimento %ld è già stato stampato sul bollato:\n" ok = delete_box(FR("Il movimento %ld è già stato stampato sul bollato:\n"
"si desidera eliminarlo ugualmente?"), numreg); "si desidera eliminarlo ugualmente?"), numreg);
} }
if (ok && mov.get_bool(MOV_INVIATO)) if (ok && mov.get_bool(MOV_INVIATO))

View File

@ -1,8 +1,8 @@
#include "cg2100p.h" #include "cg2100p.h"
PAGE "Nuova partita" -1 -1 40 10 PAGE "Nuova partita" -1 -1 42 10
RADIOBUTTON P_NUOVO 1 23 RADIOBUTTON P_NUOVO 1 25
BEGIN BEGIN
PROMPT 0 0 "@BTipo movimento" PROMPT 0 0 "@BTipo movimento"
ITEM "1|Fattura" ITEM "1|Fattura"
@ -14,7 +14,7 @@ END
NUMBER P_ANNO 4 NUMBER P_ANNO 4
BEGIN BEGIN
PROMPT 24 0 "Anno " PROMPT 26 0 "Anno "
// FLAGS "A" // FLAGS "A"
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
WARNING "Inserire l'anno di riferimento partita" WARNING "Inserire l'anno di riferimento partita"
@ -22,20 +22,20 @@ END
STRING P_NUMERO 7 STRING P_NUMERO 7
BEGIN BEGIN
PROMPT 24 1 "Numero " PROMPT 26 1 "Numero "
FLAGS "U#" FLAGS "U#"
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
WARNING "Inserire il numero di riferimento partita" WARNING "Inserire il numero di riferimento partita"
END END
BUTTON DLG_CANCEL 10 2 BUTTON DLG_CANCEL 10 2
BEGIN BEGIN
PROMPT 26 2 "" PROMPT -1 -3 ""
END END
BUTTON DLG_OK 10 2 BUTTON DLG_OK 10 2
BEGIN BEGIN
PROMPT 26 4 "" PROMPT -1 -1 ""
END END
ENDPAGE ENDPAGE

View File

@ -2476,16 +2476,13 @@ bool TPrimanota_application::numdoc_handler(TMask_field& f, KEY key)
if (annodoc > 0 && fornitore > 0) if (annodoc > 0 && fornitore > 0)
{ {
// SELECT NUMREG,DATAREG,DATADOC,NUMDOC FROM MOV // SELECT NUMREG,DATAREG,DATADOC,NUMDOC FROM MOV
// WHERE TIPO='F' AND CODCF=F_FORNITORE AND // WHERE TIPO='F' AND CODCF=F_FORNITORE AND REG<>'' AND
// NUMDOC=F_NUMDOC AND DATAREG>=F_DATADOC AND NUMREG<>F_NUMREG // NUMDOC=F_NUMDOC AND DATAREG>=F_DATADOC AND NUMREG<>F_NUMREG
TString filter; TString filter;
filter << MOV_NUMDOC << "=\"" << f.get() << '"'; filter << '(' << MOV_NUMDOC << "=\"" << f.get() << "\")&&(" << MOV_REG << "!=\"\")";
if (m.edit_mode()) if (m.edit_mode())
{ filter << "&&(" << MOV_NUMREG << "!=\"" << m.get(F_NUMREG) << "\")";
filter.insert("(");
filter << ")&&(" << MOV_NUMREG << "!=\"" << m.get(F_NUMREG) << "\")";
}
TRelation rel(LF_MOV); TRelation rel(LF_MOV);
TRectype& rec = rel.curr(); TRectype& rec = rel.curr();
@ -2505,7 +2502,7 @@ bool TPrimanota_application::numdoc_handler(TMask_field& f, KEY key)
{ {
const int ad = rec.get_date(MOV_DATADOC).year(); const int ad = rec.get_date(MOV_DATADOC).year();
if (ad == annodoc) if (ad == annodoc)
return yesno_box("Il documento %d / %s e' gia' stato inserito con la registrazione %ld\nSi desidera continuare ugualmente?", return yesno_box("Il documento %d / %s è già stato inserito con la registrazione %ld\nSi desidera continuare ugualmente?",
annodoc, (const char*)f.get(), rec.get_long(MOV_NUMREG)); annodoc, (const char*)f.get(), rec.get_long(MOV_NUMREG));
} }
} }

View File

@ -45,7 +45,7 @@ protected:
static bool edit_scadenza_handler(TMask_field& f, KEY k); static bool edit_scadenza_handler(TMask_field& f, KEY k);
static bool nuovo_handler(TMask_field& f, KEY k); static bool nuovo_handler(TMask_field& f, KEY k);
static bool cambio_handler(TMask_field& f, KEY k); static bool cambio_handler(TMask_field& f, KEY k);
void add_importo(TToken_string& s, const TImporto& i, const char* val = NULL, int pos = -1); void add_importo(TToken_string& s, const TImporto& i, const char* val = NULL, int pos = -1);
void add_descrizione(TToken_string& s, const TRiga_partite& riga, int pos = -1); void add_descrizione(TToken_string& s, const TRiga_partite& riga, int pos = -1);
TImporto get_importo(TToken_string& s, int pos) const; TImporto get_importo(TToken_string& s, int pos) const;
@ -85,6 +85,7 @@ public:
TSheet_field& partite() const { return sfield(P_PARTITE); } TSheet_field& partite() const { return sfield(P_PARTITE); }
TSheet_field& scadenze() const { return sfield(P_SCADENZE); } TSheet_field& scadenze() const { return sfield(P_SCADENZE); }
const TBill& conto() const { return _conto; } const TBill& conto() const { return _conto; }
TPartita* partita_corrente() const;
const TImporto& residuo(bool val) const { return val ? _resval : _residuo; } const TImporto& residuo(bool val) const { return val ? _resval : _residuo; }
bool changed() const { return _changed; } bool changed() const { return _changed; }
@ -795,7 +796,6 @@ const TRiga_partite* TGame_mask::cerca_prima_riga() const
return riga; return riga;
} }
void TGame_mask::aggiorna_valuta(const TValuta& val) void TGame_mask::aggiorna_valuta(const TValuta& val)
{ {
TPartite_array& pa = app().partite(); TPartite_array& pa = app().partite();
@ -832,13 +832,25 @@ void TGame_mask::aggiorna_valuta(const TValuta& val)
TToken_string& TGame_mask::add_colored_row(TSheet_field& sheet, char type) const TToken_string& TGame_mask::add_colored_row(TSheet_field& sheet, char type) const
{ {
int r = sheet.insert(-1, FALSE, FALSE); int r = sheet.insert(-1, false, false);
COLOR back, fore; COLOR back, fore;
app().type2colors(type, back, fore); app().type2colors(type, back, fore);
sheet.set_back_and_fore_color(back, fore, r); sheet.set_back_and_fore_color(back, fore, r);
return sheet.row(r); return sheet.row(r);
} }
TPartita* TGame_mask::partita_corrente() const
{
if (_riga_partite < 0)
return NULL;
TToken_string& row = partite().row(_riga_partite);
const int anno = row.get_int(0); // Anno partita
const TString16 num = row.get(); // Numero partita
const TBill& zio = conto();
TPartita* game = app().partite().exist(zio, anno, num);
return game;
}
bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k) bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
{ {
TGame_mask& gm = (TGame_mask&)partite.mask(); TGame_mask& gm = (TGame_mask&)partite.mask();
@ -1189,19 +1201,49 @@ bool TGame_mask::partite_notify(TSheet_field& partite, int r, KEY k)
if (k == K_INS) if (k == K_INS)
{ {
gm.send_key(K_CTRL + 'N', 0, &partite); // Simula la pressione del tasto nuovo gm.send_key(K_CTRL + 'N', 0, &partite); // Simula la pressione del tasto nuovo
return FALSE; // Rifiuta l'aggiunta di una riga return false; // Rifiuta l'aggiunta di una riga
} }
return true; return true;
} }
static bool partita_bloccata(const TPartita& game)
{
int rate = 0, bloccate = 0;
for (int i = game.last(); i > 0; i = game.pred(i))
{
const TRiga_partite& riga = game.riga(i);
if (riga.tipo() == tm_fattura)
{
for (int r = riga.rate(); r > 0; r--)
{
rate++;
const TRiga_scadenze& rata = riga.rata(r);
if (rata.get_bool(SCAD_BLOCCATA))
bloccate++;
}
}
}
return bloccate > 0 && bloccate == rate;
}
bool TGame_mask::scadenze_notify(TSheet_field& scadenze, int r, KEY k) bool TGame_mask::scadenze_notify(TSheet_field& scadenze, int r, KEY k)
{ {
if (k == K_INS) if (k == K_INS)
{ {
TGame_mask& gm = (TGame_mask&)scadenze.mask(); TGame_mask& gm = (TGame_mask&)scadenze.mask();
#ifndef __EXTRA__
const TCausale& causale = app().causale();
const tipo_movimento tm = (tipo_movimento)causale.tipomov();
if (tm == tm_pagamento)
{
const TPartita* game = gm.partita_corrente();
if (game && partita_bloccata(*game))
return error_box(TR("Le rate della partita risultano bloccate"));
}
#endif
gm.send_key(K_CTRL + 'N', 0, &scadenze); // Simula la pressione del tasto nuovo gm.send_key(K_CTRL + 'N', 0, &scadenze); // Simula la pressione del tasto nuovo
return FALSE; // Rifiuta l'aggiunta di una riga return false; // Rifiuta l'aggiunta di una riga
} }
return true; return true;
} }
@ -1397,8 +1439,9 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
{ {
if (m.get_bool(114)) if (m.get_bool(114))
{ {
if (was == NULL) giochi.destroy(game); if (was == NULL)
return f.error_box(FR("La rata %d e' bloccata."), nrata); giochi.destroy(game);
return f.error_box(FR("La rata %d risulta bloccata."), nrata);
} }
#ifndef __EXTRA__ #ifndef __EXTRA__
@ -1414,7 +1457,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
} }
#endif #endif
tipo_movimento tm; tipo_movimento tm = tm_pagamento;
#ifdef __EXTRA__ #ifdef __EXTRA__
TMask* nm = new TNew_mask(gm.conto().tipo(), FALSE, FALSE); TMask* nm = new TNew_mask(gm.conto().tipo(), FALSE, FALSE);
nm->set(P_ANNO, game.anno()); nm->set(P_ANNO, game.anno());
@ -1427,7 +1470,7 @@ bool TGame_mask::edit_scadenza_handler(TMask_field& f, KEY k)
{ {
if (was == NULL) if (was == NULL)
giochi.destroy(game); giochi.destroy(game);
return FALSE; return false;
} }
#else #else
tm = (tipo_movimento)app().causale().tipomov(); tm = (tipo_movimento)app().causale().tipomov();
@ -1530,7 +1573,7 @@ bool TGame_mask::nuovo_handler(TMask_field& f, KEY k)
else else
new_game->init(gm.conto().tipo(), allow_fatt, TRUE); new_game->init(gm.conto().tipo(), allow_fatt, TRUE);
tipo_movimento tm; tipo_movimento tm = tm_pagamento;
#ifndef __EXTRA__ #ifndef __EXTRA__
const TMask& cm = app().curr_mask(); const TMask& cm = app().curr_mask();
@ -1555,7 +1598,9 @@ bool TGame_mask::nuovo_handler(TMask_field& f, KEY k)
{ {
// Creazione nuova partita // Creazione nuova partita
TPartita& game = app().partite().partita(gm.conto(), anno, numero); TPartita& game = app().partite().partita(gm.conto(), anno, numero);
if (tm == tm_pagamento && partita_bloccata(game))
return error_box(TR("Le rate di questa partita risultano bloccate"));
bool edit = FALSE; bool edit = FALSE;
// N.B. Le fatture non possone essere editate in modo contabile // N.B. Le fatture non possone essere editate in modo contabile
if (tm != tm_fattura) if (tm != tm_fattura)
@ -1934,6 +1979,9 @@ void TGame_mask::fill_partite()
bool TGame_mask::edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) const bool TGame_mask::edit_pagamento(TPartita& p, int nriga, int nrata, int nrigp) const
{ {
if (nrigp <= 0)
return false;
TRectype oldpag = p.pagamento(nriga, nrata, nrigp); TRectype oldpag = p.pagamento(nriga, nrata, nrigp);
TRiga_partite& somma = p.riga(nrigp); TRiga_partite& somma = p.riga(nrigp);
@ -2176,24 +2224,28 @@ bool TPrimanota_application::edit_partite(const TMask& m, int riga)
if (changed) if (changed)
{ {
TSheet_field& s = cgs();
if (m.field(CG_DESCR).empty()) if (m.field(CG_DESCR).empty())
{ {
TString descr; TString descr;
if (genera_riferimento(riga, descr)) if (genera_riferimento(riga, descr))
{ {
TSheet_field& s = cgs(); const int idx = s.cid2index(CG_DESCR);
s.row(riga).add(descr, CG_DESCR-101); TToken_string& sr = s.row(riga);
TBill conto; conto.get(s.row(riga), 2, 0x3); sr.add(descr, idx);
TBill conto; conto.get(sr, 2, 0x3);
for (int r = riga+1; r < s.items(); r++) for (int r = riga+1; r < s.items(); r++)
{ {
TBill contro; contro.get(s.row(r), 9, 0x3); TToken_string& sr = s.row(r);
TBill contro; contro.get(sr, 9, 0x3);
if (conto == contro) if (conto == contro)
s.row(r).add(descr, CG_DESCR-101); sr.add(descr, idx);
} }
} }
} }
cgs().force_update(); // Aggiornamento righe contabili s.force_update(); // Aggiornamento righe contabili
calcola_saldo(); calcola_saldo();
_sal_dirty = true; _sal_dirty = true;
} }

View File

@ -310,7 +310,6 @@ static int sort_by_fields(TSheet_field& sheet, int r1, int r2, const short* cons
return diff; return diff;
} }
static int sort_by_date(TSheet_field& sheet, int r1, int r2) static int sort_by_date(TSheet_field& sheet, int r1, int r2)
{ {
// Elenco dei campi da confrontare in ordine di priorita' // Elenco dei campi da confrontare in ordine di priorita'
@ -1064,12 +1063,13 @@ void TEasySolder_mask::fill_sheet()
if (_tipomov == tm_insoluto) if (_tipomov == tm_insoluto)
{ {
s.set_column_header(S_IMPORTO, TR("Importo\nInsoluto")); s.set_column_header(S_IMPORTO, HR("Importo\nInsoluto"));
s.set_column_header(S_RESIDUO, TR("Importo\nPagato")); s.set_column_header(S_RESIDUO, HR("Importo\nPagato"));
} }
else else
{ {
s.set_column_header(S_RESIDUO, TR("Residuo\nScadenza")); s.set_column_header(S_IMPORTO, HR("Importo\nPagamento"));
s.set_column_header(S_RESIDUO, HR("Residuo\nScadenza"));
} }
s.set_column_justify(S_PARTITA, TPartita::allineamento_richiesto(_conto.tipo()) == 'R'); s.set_column_justify(S_PARTITA, TPartita::allineamento_richiesto(_conto.tipo()) == 'R');

View File

@ -159,7 +159,8 @@ bool CG4100_App::sort_sal()
{ {
if (gruppo <= 0 || conto <= 0 || sottoconto <= 0) if (gruppo <= 0 || conto <= 0 || sottoconto <= 0)
{ {
warning_box(FR("Conto non valido alla riga %d nel movimento %ld"), rmov.get_int(RMV_NUMRIG), numreg); warning_box(FR("Conto non valido alla riga %d nel movimento %ld"),
rmov.get_int(RMV_NUMRIG), numreg);
continue; continue;
} }
sal.aggiorna(gruppo, conto, sottoconto, importo, sezione, true, scaricato); sal.aggiorna(gruppo, conto, sottoconto, importo, sezione, true, scaricato);

View File

@ -2501,6 +2501,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
// Prorata per l'anno corrente + quelli eventuali dello scorso anno e quelli che sono oltre 3 anni fa... // Prorata per l'anno corrente + quelli eventuali dello scorso anno e quelli che sono oltre 3 anni fa...
// E quelli che non hanno la % prorata settata in tabella // E quelli che non hanno la % prorata settata in tabella
real aaa = acquisti_iva; real aaa = acquisti_iva;
aaa -= ammort_det_iva; // Scarta gli acquisti di beni ammortizzabili (4-9-2014)
if (percentuale1 != INVALID_PRORATA && percentuale1 != INVALID_PRORATA_ASSERT) if (percentuale1 != INVALID_PRORATA && percentuale1 != INVALID_PRORATA_ASSERT)
aaa -= rr1 ? *rr1 : ZERO; aaa -= rr1 ? *rr1 : ZERO;
if (percentuale2 != INVALID_PRORATA && percentuale2 != INVALID_PRORATA_ASSERT) if (percentuale2 != INVALID_PRORATA && percentuale2 != INVALID_PRORATA_ASSERT)
@ -2533,7 +2534,7 @@ void TLiquidazione_app::recalc_att(int month, const char* codatt)
* Il prorata pagato in annuale viene scritto a 0, perche' in realta' sarebbe * Il prorata pagato in annuale viene scritto a 0, perche' in realta' sarebbe
* la somma di quelli pagati nei mesi precedenti. * la somma di quelli pagati nei mesi precedenti.
*/ */
_plm->put("R2", prorata); // Prorata complessivo (acq. rif. anno attuale + acq. rif. anni precedenti) _plm->put("R2", prorata); // Prorata complessivo (acq. rif. anno attuale + acq. rif. anni precedenti)
_plm->put("R14", prorata_precedente1); // Prorata acq. rif. anno addietro _plm->put("R14", prorata_precedente1); // Prorata acq. rif. anno addietro
_plm->put("R15", prorata_precedente2); // Prorata acq. rif. 2 anni addietro _plm->put("R15", prorata_precedente2); // Prorata acq. rif. 2 anni addietro
@ -3841,8 +3842,8 @@ void TLiquidazione_app::write_liq(int month, const char* codatts)
conguaglio = topay - ppg; conguaglio = topay - ppg;
round_imposta(conguaglio); round_imposta(conguaglio);
_pla->put("R9", conguaglio); _pla->put("R9", conguaglio);
_pla->put("R10",prorata); _pla->put("R10", prorata);
// Prorata delle mie brame... // Prorata delle mie brame...
// Chi e' il piu' sfatto del reame? // Chi e' il piu' sfatto del reame?
@ -4282,8 +4283,7 @@ void TLiquidazione_app::recalc_annual(const char* att)
{ {
if (!look_plm(i,aaa)) if (!look_plm(i,aaa))
continue; continue;
pro_pag += _plm->get_real("R2"); // Can't do anyway else...
pro_pag += _plm->get_real("R2"); // Can't do anyway else...
} }
// Modifiche per PIM13 // Modifiche per PIM13

View File

@ -350,9 +350,11 @@ bool TProrata_msk::on_field_event(TOperable_field& o, TField_event e, long jolly
case F_DATAINI: case F_DATAINI:
if (e == fe_init) if (e == fe_init)
{ {
const TDate oggi(TODAY); TDate d(TODAY); d.set_day(1); --d;
o.set(TDate(1,1,oggi.year()-1)); d.set_day(1);
set(F_DATAFIN, TDate(31,12,oggi.year()-1), 0x3); o.set(d);
d.set_end_month();
set(F_DATAFIN, d, 0x3);
} }
break; break;
case F_DATAFIN: case F_DATAFIN:

View File

@ -797,7 +797,14 @@ TImage* TSolder_tree::image(bool selected) const
case 3: case 3:
{ {
const TRiga_scadenze* s = scadenza(); const TRiga_scadenze* s = scadenza();
id = s && s->chiusa() ? BMP_DIRDNSEL : BMP_DIRDN; id = BMP_DIRDN;
if (s)
{
if (s->get_bool(SCAD_BLOCCATA))
return get_res_icon(10203); // Icona di stop
if (s->chiusa())
id = BMP_DIRDNSEL;
}
} }
break; break;
case 4: case 4: