Patch level : 12.00 1360

Files correlati     : ve0.exe ve2400.msk

Commento:
Agiunto il flag  OnlyOnePaIV nel paragrafo cg ddi ditta.ini per bloccare l'inserimento dei clienti/fornitori per gli utenti che non sono
Risistemato il controllo clienti/fornitori.
This commit is contained in:
Alessandro Bonazzi 2024-10-08 16:18:51 +02:00
parent 1cc5cb6358
commit e3d62c2245
3 changed files with 177 additions and 125 deletions

View File

@ -8,4 +8,6 @@
#define S_RAGSOC 103 #define S_RAGSOC 103
#define S_PAIV 104 #define S_PAIV 104
#define S_COFI 105 #define S_COFI 105
#define S_ERROR 106 #define S_ALLEG 106
#define S_SOSPESO 107
#define S_ERROR 108

View File

@ -40,6 +40,8 @@ BEGIN
ITEM "Ragione Sociale@50" ITEM "Ragione Sociale@50"
ITEM "Partita IVA" ITEM "Partita IVA"
ITEM "Codice Fiscale@16" ITEM "Codice Fiscale@16"
ITEM "Allegato@28"
ITEM "Sospeso"
ITEM "Problema riscontrato@50" ITEM "Problema riscontrato@50"
END END
@ -47,7 +49,7 @@ ENDPAGE
ENDMASK ENDMASK
PAGE "Dati" -1 -1 52 10 PAGE "Dati" -1 -1 52 14
BOOLEAN S_DIRTY BOOLEAN S_DIRTY
BEGIN BEGIN
@ -66,24 +68,42 @@ BEGIN
FLAGS "D" FLAGS "D"
END END
BOOLEAN S_SOSPESO
BEGIN
PROMPT 1 6 "Sospeso"
END
STRING S_PAIV 12 STRING S_PAIV 12
BEGIN BEGIN
PROMPT 1 3 "Partita IVA " PROMPT 1 4 "Partita IVA "
END END
STRING S_COFI 16 STRING S_COFI 16
BEGIN BEGIN
PROMPT 1 4 "Codice Fiscale " PROMPT 1 5 "Codice Fiscale "
END END
BUTTON DLG_USER 10 2 BUTTON DLG_USER 10 2
BEGIN BEGIN
PROMPT -1 3 "Allinea" PROMPT -1 4 "Allinea"
END
LIST_BOX S_ALLEG 1 28
BEGIN
PROMPT 1 6 "Allegato "
ITEM "0|Valido per allegato IVA"
ITEM "1|Non valido per allegato IVA"
ITEM "2|Occasionale"
ITEM "3|Documenti riepilogativi"
ITEM "4|Codice fiscale già inserito"
ITEM "5|Estero CEE"
ITEM "6|Privato"
ITEM "7|Ente pubblico"
END END
MEMO S_ERROR 50 3 MEMO S_ERROR 50 3
BEGIN BEGIN
PROMPT 1 5 "Problema riscontrato" PROMPT 1 7 "Problema riscontrato"
FLAGS "D" FLAGS "D"
END END

View File

@ -24,64 +24,114 @@ protected:
void dirty_sheet_row(); void dirty_sheet_row();
public: public:
TCheck_PIVA_mask() : TAutomask("cg1300l") { }
TCheck_PIVA_mask() : TAutomask("cg1300l") {}
}; };
// Carica lo sheet in base alle impostazioni correnti (F_CLIFO, F_COFI) // Carica lo sheet in base alle impostazioni correnti (F_CLIFO, F_COFI)
void TCheck_PIVA_mask::load_sheet() void TCheck_PIVA_mask::load_sheet()
{ {
const bool check_cofi = get_bool(F_COFI); const bool check_cofi = get_bool(F_COFI);
TSheet_field& s = sfield(F_CLIFO); TSheet_field& s = sfield(F_CLIFO);
s.destroy();
// Elenco di tutti i clienti (o fornitori) // Elenco di tutti i clienti (o fornitori)
TISAM_recordset clifo("USE CLIFO\nFROM TIPOCF=#TIPO\nTO TIPOCF=#TIPO"); TISAM_recordset clifo("USE CLIFO\nFROM TIPOCF=#TIPO\nTO TIPOCF=#TIPO");
clifo.set_var("#TIPO", TVariant(get(F_TIPO))); clifo.set_var("#TIPO", TVariant(get(F_TIPO)));
TProgind pi(clifo.items(), TR("Scansione anagrafica")); TProgind pi(clifo.items(), TR("Scansione anagrafica"));
for (bool ok = clifo.move_first(); ok; ok = clifo.move_next()) TRectype paiv_rec(LF_CLIFO);
TRectype cofi_rec(LF_CLIFO);
s.reset();
for (bool ok = clifo.move_first(); pi.addstatus() && ok; ok = clifo.move_next())
{ {
const TString& stato = clifo.get(CLI_STATOPAIV).as_string();
if (stato.full() && stato != "IT")
continue; // Ignoro gli esteri
const TString& occas = clifo.get(CLI_OCCAS).as_string();
if (occas.full())
continue; // Ignoro gli occasionali
const TString16 paiv = clifo.get(CLI_PAIV).as_string();
if (paiv.full() && !real::is_natural(paiv))
continue; // Ignoro esteri
const TString16 cofi = clifo.get(CLI_COFI).as_string();
const bool paiv_good = paiv.full() && pi_check("", paiv);
const bool cofi_good = cofi.full() && cf_check("", cofi);
if (paiv_good && cofi_good)
continue; // Ignoro chi sicuramente e' a posto
const char tipoana = clifo.get(CLI_TIPOAPER).as_string()[0];
if (tipoana == 'F' && cofi_good)
continue; // Ignoro le persone fisiche col codice fiscale a posto
if (paiv_good && !cofi_good && !check_cofi)
continue; // Ignoro CF se non voluto
// Riga sheet: Selezione|Codice|RagioneSociale|P.IVA|C.Fiscale|Messaggio
TToken_string& tok = s.row(-1);
tok.add(clifo.get(CLI_CODCF).as_int(), 1);
tok.add(clifo.get(CLI_RAGSOC).as_string());
tok.add(paiv);
tok.add(cofi);
TToken_string msg(50, '\n'); TToken_string msg(50, '\n');
if (!paiv_good) msg.add(TR("P.I. errata o mancante")); const TString4 tipo = clifo.get(CLI_TIPOCF).as_string();
if (!cofi_good) msg.add(TR("C.F. errato o mancante")); const long codice = clifo.get(CLI_CODCF).as_int();
msg.trim(); TString4 alleg = clifo.get(CLI_ALLEG).as_string();
tok.add(msg); const TString4 stato = clifo.get(CLI_STATOPAIV).as_string();
const TString4 tipoana = clifo.get(CLI_TIPOAPER).as_string();
const TString4 occas = clifo.get(CLI_OCCAS).as_string();
if (occas.blank())
{
const TString & paiv = clifo.get(CLI_PAIV).as_string();
if (stato.blank() || stato == "IT" || !real::is_natural(paiv))
{
if (tipoana != "F" && paiv.blank())
{
if (alleg != "6" && alleg != "7")
msg.add(TR("Partita IVA mancante"));
}
else
if (tipoana != "F" && !pi_check("", paiv))
msg.add(TR("Partita IVA errata"));
else
{
if (paiv.full())
{
paiv_rec.zero();
paiv_rec.put(CLI_TIPOCF, tipo);
paiv_rec.put(CLI_PAIV, paiv);
TCursor c(new TRelation(LF_CLIFO), "", 5, &paiv_rec, &paiv_rec);
const int items = c.items();
if (items > 1)
{
for (c = 0L; codice == c.curr().get_long(CLI_CODCF) && c.pos() < items; ++c);
msg.add(format(FR("Partita IVA già utilizzato per il codice %ld"), c.curr().get_long(CLI_CODCF)));
}
}
} }
const TString cofi = clifo.get(CLI_COFI).as_string();
if (cofi.blank())
msg.add(TR("Codice Fiscale mancante"));
else
if (!cf_check("", cofi))
msg.add(TR("Codice Fiscale errato"));
else
{
if (cofi.full())
{
cofi_rec.zero();
cofi_rec.put(CLI_TIPOCF, tipo);
cofi_rec.put(CLI_COFI, cofi);
TCursor c(new TRelation(LF_CLIFO), "", 4, &cofi_rec, &cofi_rec);
const int items = c.items();
if (items > 1)
{
for (c = 0L; codice == c.curr().get_long(CLI_CODCF) && c.pos() < items; ++c);
msg.add(format(FR("Codice fiscale già utilizzato per il codice %ld"), c.curr().get_long(CLI_CODCF)));
}
}
}
if (msg.full())
{
// Riga sheet: Selezione|Codice|RagioneSociale|P.IVA|C.Fiscale|Messaggio
int r = s.set_row_cell(S_CODCF, codice);
s.set_row_cell(S_RAGSOC, clifo.get(CLI_RAGSOC).as_string(), r);
s.set_row_cell(S_PAIV, paiv, r);
s.set_row_cell(S_COFI, cofi, r);
if (alleg.blank())
alleg = "0";
s.set_row_cell(S_ALLEG, alleg, r);
s.set_row_cell(S_SOSPESO, clifo.get(CLI_SOSPESO).as_bool(), r);
msg.trim();
s.set_row_cell(S_ERROR, msg, r);
}
}
}
}
s.force_update(); s.force_update();
} }
@ -90,44 +140,40 @@ bool TCheck_PIVA_mask::save_sheet()
{ {
// Tengo pronto il file per fare gli aggiornamenti // Tengo pronto il file per fare gli aggiornamenti
TLocalisamfile clifo(LF_CLIFO); TLocalisamfile clifo(LF_CLIFO);
bool first = true; // Sto per incontrare il primo cliente?
TSheet_field& s = sfield(F_CLIFO); TSheet_field& s = sfield(F_CLIFO);
// Mi tengo da parte le posizioni dei campi utili if (s.items() > 0L && yesnocancel_box(TR("Si desidera salvare le modifiche?")) == K_YES)
const int pos_codcf = s.cid2index(S_CODCF); {
const int pos_paiv = s.cid2index(S_PAIV);
const int pos_cofi = s.cid2index(S_COFI);
// Scandisco solo le righe "spuntate" // Scandisco solo le righe "spuntate"
FOR_EACH_SHEET_ROW(s, r, row) if ((*row)[0] == 'X') FOR_EACH_SHEET_ROW_LOOP(s, r)
if (s.get_bool_row_cell(r, S_DIRTY))
{ {
// Quando incontro il primo cliente selezionato, chiedo conferma
if (first)
{
const KEY k = yesnocancel_box(TR("Si desidera salvare le modifiche?"));
if (k != K_YES)
return k == K_NO;
}
first = false; // D'ora in poi non chiedo piu' conferma
clifo.put(CLI_TIPOCF, get(F_TIPO)); clifo.put(CLI_TIPOCF, get(F_TIPO));
const long codcf = row->get_long(pos_codcf);
const long codcf = s.get_long_row_cell(r, S_CODCF);
clifo.put(CLI_CODCF, codcf); clifo.put(CLI_CODCF, codcf);
int err = clifo.read(_isequal, _lock); // Locco il cliente da aggiornare int err = clifo.read(_isequal, _lock); // Locco il cliente da aggiornare
if (err == NOERR) if (err == NOERR)
{ {
clifo.put(CLI_PAIV, row->get(pos_paiv)); clifo.put(CLI_PAIV, s.get_str_row_cell(r, S_PAIV));
clifo.put(CLI_COFI, row->get(pos_cofi)); clifo.put(CLI_COFI, s.get_str_row_cell(r, S_COFI));
TString alleg = s.get_str_row_cell(r, S_ALLEG);
if (alleg == "0")
alleg.cut(0);
clifo.put(CLI_ALLEG, alleg);
clifo.put(CLI_SOSPESO, s.get_bool_row_cell(r, S_SOSPESO));
err = clifo.rewrite(); // Aggiorno il record err = clifo.rewrite(); // Aggiorno il record
} }
if (err != NOERR) if (err != NOERR)
return error_box("Errore %d durante l'aggiornamento del codice %ld", err, codcf); return error_box("Errore %d durante l'aggiornamento del codice %ld", err, codcf);
} }
}
return true; return true;
} }
@ -143,16 +189,9 @@ void TCheck_PIVA_mask::update_sheet()
void TCheck_PIVA_mask::dirty_sheet_row() void TCheck_PIVA_mask::dirty_sheet_row()
{ {
TSheet_field& s = sfield(F_CLIFO); TSheet_field& s = sfield(F_CLIFO);
TMask& m = s.sheet_mask();
m.set(S_DIRTY, "X");
// Sporco "giro" per aggiornare lo sheet s.set_row_cell(S_DIRTY, true, s.selected());
if (!m.is_running()) s.force_update(s.selected());
{
const int sel = s.selected();
s.update_row(sel);
s.force_update(sel);
}
} }
bool TCheck_PIVA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly) bool TCheck_PIVA_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
@ -171,14 +210,21 @@ bool TCheck_PIVA_mask::on_field_event(TOperable_field& o, TField_event e, long j
if (e == fe_button) if (e == fe_button)
{ {
TSheet_field& s = sfield(F_CLIFO); TSheet_field& s = sfield(F_CLIFO);
FOR_EACH_SHEET_ROW(s, r, row)
row->add(" ", 0); FOR_EACH_SHEET_ROW_LOOP(s, r)
s.set_row_cell(S_DIRTY, false, r);
s.force_update(); s.force_update();
} }
break; break;
case DLG_SAVEREC: case DLG_SAVEREC:
if (e == fe_button)
{
if (save_sheet()) if (save_sheet())
load_sheet(); load_sheet();
}
else
if (e == fe_close)
save_sheet();
break; break;
case S_PAIV: case S_PAIV:
if (e == fe_modify) if (e == fe_modify)
@ -198,39 +244,20 @@ bool TCheck_PIVA_mask::on_field_event(TOperable_field& o, TField_event e, long j
return o.error_box("Codice fiscale errato"); return o.error_box("Codice fiscale errato");
} }
break; break;
case S_ALLEG:
if (e == fe_modify)
dirty_sheet_row();
break;
case S_SOSPESO:
if (e == fe_modify)
dirty_sheet_row();
break;
case DLG_USER: case DLG_USER:
if (e == fe_button)
{
TMask& m = o.mask();
const TString& pi = m.get(S_PAIV); // Leggo partita IVA e
const TString& cf = m.get(S_COFI); // codice fiscale
if (pi.blank()) // Tento di compilare la PAIV vuota
{
if (cf.full() && pi_check("", cf))
{
m.set(S_PAIV, cf);
dirty_sheet_row();
}
else
return o.error_box(TR("Il codice fiscale rappresenta una partita IVA errata"));
} else
if (cf.blank()) // Tento di compilare il COFI vuoto
{
if (pi.full() && pi_check("", pi))
{
m.set(S_COFI, pi);
dirty_sheet_row();
}
else
return o.error_box(TR("Partita IVA errata"));
}
}
break;
case DLG_LINK:
if (e == fe_button) if (e == fe_button)
{ {
TMask& m = o.mask(); TMask& m = o.mask();
TLocalisamfile clifo(LF_CLIFO); // Riempio la chiave 1 di CLIFO TLocalisamfile clifo(LF_CLIFO); // Riempio la chiave 1 di CLIFO
clifo.put(CLI_TIPOCF, get(F_TIPO)); clifo.put(CLI_TIPOCF, get(F_TIPO));
clifo.put(CLI_CODCF, m.get(S_CODCF)); clifo.put(CLI_CODCF, m.get(S_CODCF));
if (clifo.curr().edit()) // Modifica interattiva del cliente if (clifo.curr().edit()) // Modifica interattiva del cliente
@ -262,12 +289,15 @@ public:
void TCheck_PIVA::main_loop() void TCheck_PIVA::main_loop()
{ {
TSheet_field::set_line_number_width(7);
TCheck_PIVA_mask m; TCheck_PIVA_mask m;
m.run(); m.run();
} }
void controlla_PIVA(int argc, char* argv[]) void controlla_PIVA(int argc, char* argv[])
{ {
TCheck_PIVA cp; TCheck_PIVA cp;
cp.run(argc, argv, TR("Controllo Partita IVA")); cp.run(argc, argv, TR("Controllo Partita IVA"));
} }