campo-sirio/cg/cg1307.cpp

563 lines
14 KiB
C++
Raw Normal View History

#include <applicat.h>
#include <defmask.h>
#include <isam.h>
#include <prefix.h>
#include <progind.h>
#include <recarray.h>
#include <sheet.h>
#include "cgsaldac.h"
#include <clifo.h>
#include <mov.h>
#include <nditte.h>
#include <pconti.h>
#include <rmov.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
{
// TArray _files;
TArray _decoders;
protected:
static bool test_riga_partita(const TRectype& pagsca);
static bool test_row_file(int rmov, TString_array& arr);
static bool test_scrow_file(int rmov, TString_array& arr);
static bool test_head_file(TString_array& arr);
static int kill_game(long numreg, int numrig);
static int kill_pagsca(long recno, int lfile);
static int kill_row(long numreg, char tipor, int numrig);
static bool firm_handler(TMask_field& f, KEY k);
static bool select_handler(TMask_field& f, KEY k);
public:
const char* app_name() const {return TR("Righe prima nota errate");}
const char* decode(int num, const char* key, const char* field);
virtual void main_loop();
};
inline TElimina_zoppi& app() { return (TElimina_zoppi&)main_app(); }
bool TElimina_zoppi::firm_handler(TMask_field& f, KEY k)
{
bool ok = true;
if (k == K_F9)
{
TArray_sheet sheet(-1, -1, 70, 20, TR("Scelta ditta"), HR("Codice|Ragione Sociale@50"));
TToken_string row;
TLocalisamfile ditte(LF_NDITTE);
FOR_EACH_FILE_RECORD(ditte)
{
const long cod = ditte.get_long(NDT_CODDITTA);
if (prefix().exist(cod))
{
row.cut(0);
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)
{
f.set(sheet.row().get(0));
k = K_TAB;
}
}
if (k == K_ENTER || k == K_TAB && f.focusdirty())
{
long cod = atol(f.get());
ok = prefix().exist(cod);
if (ok)
prefix().set_codditta(cod);
else
f.error_box(FR("La ditta %05ld non e' attivata per la contabilita'"), cod);
}
return ok;
}
const char* TElimina_zoppi::decode(int num, const char* key, const char* field)
{
TDecoder* dec = (TDecoder*)_decoders.objptr(num);
if (dec == NULL)
{
dec = new TDecoder(num, field);
_decoders.add(dec);
}
return dec->decode(key);
}
bool TElimina_zoppi::test_row_file(int lf_rmov, TString_array& arr)
{
bool ok = true;
TLocalisamfile mov(LF_MOV);
TLocalisamfile row(lf_rmov);
TString msg;
switch (lf_rmov)
{
Patch level : 2.0 470 Files correlati : cg1.exe cg2.exe cg3.exe cg3100a.msk cg3600a.msk cg3600b.msk cg4700a.msk Ricompilazione Demo : [ ] Commento : EP20036 Richiamo registrazione fatt. vendita già inserita, vado alla pagina IVA col mouse mi posiziono sul campo "CR"cerco di entrare nella list box associata al campo. Errore dell'applicazione cg2.exe* (l'errore può non comparire subito ma dopo essere usciti dalla registrazione contabile avendo eseguito quando descritto sopra e poi rientrati ripetendo il tutto.)Win 2000 EP20039 Compilo la maschera fino al group box "Intesta deleghe a", col mouse mi posiziono sul campo Tipo e cerco di entrare nella list box associata al campo: Errore CG1.exe EP20040 Col mouse: mi posiziono sul campo "Stampa dal registro IVA" entro nella tabella registri associata al campo mi posiziono sulla riga del registro iva vendite e clicco sul bottone collega: la procedura ritorna nella maschera Lista movimenti anziché entrare nella tabella registri EP20042 Lavoro col mouse: richiamo un movimento inserito con causale V01 abilitata al saldaconto, vado alla pagina Scadenze e mi posiziono sul campo Ns. Banca ABI.Entro nella tabella banche associata al campo, seleziono una banca inserita e clicco sul bottone collega.Ritorno alla pagina scadenze del movimento contabile. EP20044 Se in file impostazione stampante è indicato stampa su... Visualizzazione, la stampa viene visualizzata correttamente ma non esce stampa su carta. EP20045 Correzione righe di prima nota, digito la password e clicco su conferma, mi propone la ditta 1 e clicco su selezione, compare maschera righe di prima nota errata vuota clicco sul bottone tutti errore dell'applicazione cg1.exe n.b. anche nella versione1.7(E' corretto che il bottone Tutti sia attivo?) EP20051 Col mouse: clicco sul bottone di ricerca richiamo conto 1 1 1 mi posiziono sul campo "codice tabella analisi" ed entro nella tabella associata al campo clicco sul bottone nuovo errore: impossibile trovare CB5.DLL EP20053 Se in file impostazione stampante è indicato stampa su... Visualizzazione la stampa viene visualizzata correttamente ma non esce stampa su carta. EP20059 Ho inserito n clienti. Clicco sul bottone di ricerca e richiamo un cliente già registrato. Clicco sulla freccina singola a sx del botone ricerca (e anche sulle altre freccie): messaggo "vuoi registrare dati inseriti?" EP20060 Il bottone ricerca non ha "freccie avanti-dietro" NON DEVE AVERLO! NON E' UN PROGRAMMA DI IMMISSIONE DATI EP20061 Il bottone ricerca non ha "freccie avanti-dietro" NON DEVE AVERLO! NON E' UN PROGRAMMA DI IMMISSIONE DATI EP20063 entrando nella voce tabella piano dei conti errore impossibile trovare CB5.DLL EP20073 all'interno dei campi (es.numero protocollo) il comando di tastiera "canc" non funziona EP20076 Richiamo un'anagrafica già inserita clicco su nuovo messaggio :"registrare le modifiche?" git-svn-id: svn://10.65.10.50/trunk@11127 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-05-14 13:12:14 +00:00
case LF_RMOV : msg = TR("Controllo righe contabili"); break;
case LF_RMOVIVA: msg = TR("Controllo righe iva"); break;
case LF_PARTITE: msg = TR("Controllo righe saldaconto"); break;
default: CHECKD(0, "Invalid row file %d", lf_rmov); break;
}
msg << ": 0";
TProgind pi(row.items(), msg, true, true);
TToken_string riga, descr;
long reg, last_reg = 0, found = 0;
bool reg_killed = false;
char tipo;
int gruppo, conto;
long sottoconto;
FOR_EACH_FILE_RECORD(row)
{
if (!pi.addstatus(1))
{
ok = false;
break;
}
if (lf_rmov == LF_PARTITE)
reg = row.get_long(PART_NREG);
else
reg = row.get_long(MOV_NUMREG);
if (reg != last_reg)
{
if (reg > 0)
{
mov.put(MOV_NUMREG, reg);
reg_killed = mov.read() != NOERR;
}
else
reg_killed = lf_rmov != LF_PARTITE;
last_reg = reg;
}
if (reg_killed)
{
found++;
const int colon = msg.find(':');
msg.cut(colon+2);
msg << found;
pi.set_text(msg);
switch (lf_rmov)
{
case LF_RMOV :
riga.format(" |%6ld|C%4d", reg, row.get_int(RMV_NUMRIG));
riga.add(row.get(RMV_ANNOES));
riga.add(row.get_real(RMV_IMPORTO).string("."));
riga << ' ' << row.get(RMV_SEZIONE);
break;
case LF_RMOVIVA:
riga.format(" |%6ld|I%4d", reg, row.get_int(RMI_NUMRIG));
riga.add(row.get(RMI_ANNOES));
riga.add(row.get_real(RMI_IMPONIBILE).string("."));
riga << " ";
break;
case LF_PARTITE:
riga.format(" |%6ld|P%4d", reg, row.get_int(PART_NRIGA));
riga.add(row.get(PART_ANNO));
riga.add(row.get_real(PART_IMPORTO).string("."));
riga << ' ' << row.get(PART_SEZ);
break;
default: CHECKD(0, "Invalid row file %d", lf_rmov); break;
};
descr.cut(0);
if (lf_rmov == LF_PARTITE)
{
tipo = row.get_char(PART_TIPOCF);
gruppo = row.get_int(PART_GRUPPOCL);
conto = row.get_int(PART_CONTOCL);
sottoconto = row.get_long(PART_SOTTOCONTO);
descr = row.get(PART_DESCR);
}
else
{
tipo = row.get_char(RMV_TIPOC);
gruppo = row.get_int(RMV_GRUPPO);
conto = row.get_int(RMV_CONTO);
sottoconto = row.get_long(RMV_SOTTOCONTO);
if (lf_rmov == LF_RMOV)
descr = row.get(PART_DESCR);
}
riga.add(gruppo);
riga.add(conto);
riga.add(sottoconto);
if (descr.empty())
{
if (tipo == 'C' || tipo == 'F')
{
descr << tipo << '|' << sottoconto;
descr = app().decode(LF_CLIFO, descr, CLI_RAGSOC);
}
else
{
descr << gruppo << '|' << conto << '|' << sottoconto;
descr = app().decode(LF_PCON, descr, PCN_DESCR);
}
}
riga.add(descr);
arr.add(riga);
}
}
return ok;
}
bool TElimina_zoppi::test_riga_partita(const TRectype& pagsca)
{
const int nriga = pagsca.get_int(PART_NRIGA);
bool ok = nriga > 0;
if (nriga < 9999)
{
TToken_string k;
k = pagsca.get(PART_TIPOCF);
k.add(pagsca.get(PART_GRUPPO), 1);
k.add(pagsca.get(PART_CONTO), 2);
k.add(pagsca.get(PART_SOTTOCONTO), 3);
k.add(pagsca.get(PART_ANNO));
k.add(pagsca.get(PART_NUMPART));
k.add(nriga);
const TRectype& part = cache().get(LF_PARTITE, k);
const int tipomov = part.get_int(PART_TIPOMOV);
ok = tipomov == 1;
}
return ok;
}
bool TElimina_zoppi::test_scrow_file(int lf_pagsca, TString_array& arr)
{
bool ok = true;
TLocalisamfile pagsca(lf_pagsca);
long found = 0;
TString msg;
msg << TR("Controllo righe ");
switch (lf_pagsca)
{
case LF_SCADENZE: msg << TR("scadenze"); break;
case LF_PAGSCA : msg << TR("pagamento"); break;
default: CHECKD(0, "Invalid row file %d", lf_pagsca); break;
}
msg << ": 0";
msg.center_just(50);
TProgind pi(pagsca.items(), msg, true, true);
TToken_string riga, descr;
FOR_EACH_FILE_RECORD(pagsca)
{
if (!pi.addstatus(1))
{
ok = false;
break;
}
bool to_kill = false;
if (pagsca.get_int(SCAD_NRIGA) <= 0 || pagsca.get_int(SCAD_NRATA) <= 0)
to_kill = true;
switch (lf_pagsca)
{
case LF_PAGSCA:
if (pagsca.get_int(PAGSCA_NRIGP) <= 0)
to_kill = true;
if (!test_riga_partita(pagsca.curr()))
to_kill = true;
break;
case LF_SCADENZE:
if (!test_riga_partita(pagsca.curr()))
to_kill = true;
break;
default:
break;
}
if (to_kill)
{
found++;
const int colon = msg.find(':');
msg.cut(colon+2);
msg << found;
pi.set_text(msg);
riga.format(" |%6ld", pagsca.recno());
if (lf_pagsca == LF_SCADENZE)
riga.add("S");
else
riga.add("G");
riga << lf_pagsca;
riga.add(pagsca.get(SCAD_ANNO));
riga.add(TR("Partita ")); riga << pagsca.get(SCAD_NUMPART);
riga.add(pagsca.get(SCAD_GRUPPO));
riga.add(pagsca.get(SCAD_CONTO));
riga.add(pagsca.get(SCAD_SOTTOCONTO));
if (lf_pagsca == LF_SCADENZE)
riga.add(TR("Riga scadenze inconsistente"));
else
riga.add(TR("Riga pagamenti inconsistente"));
arr.add(riga);
}
}
return ok;
}
bool TElimina_zoppi::test_head_file(TString_array& arr)
{
bool ok = true;
TLocalisamfile mov(LF_MOV);
TLocalisamfile rmov(LF_RMOV);
TLocalisamfile rmoviva(LF_RMOVIVA);
TString msg;
msg << TR("Controllo testate di prima nota: 0");
msg.center_just(50);
TProgind pi(mov.items(), msg, true, true, 50);
TToken_string riga, descr;
FOR_EACH_FILE_RECORD(mov)
{
if (pi.iscancelled())
{
ok = false;
break;
}
pi.addstatus(1);
long reg = mov.get_long(MOV_NUMREG);
int rmov_err = NOERR;
int rmoviva_err = NOERR;
if (reg > 0)
{
rmov.put(RMV_NUMREG, reg);
rmov.put(RMV_NUMRIG, 1);
rmov_err = rmov.read();
rmoviva.put(RMI_NUMREG, reg);
rmoviva.put(RMI_NUMRIG, 1);
rmoviva_err = rmoviva.read();
}
if (reg == 0 || (rmov_err != NOERR && rmoviva_err != NOERR))
{
riga.format(" |%6ld|T", reg);
riga.add(mov.get(MOV_ANNOES));
riga.add(mov.get_real(MOV_TOTDOC).string("."));
riga << " | | ";
riga.add(mov.get(MOV_CODCF));
descr = mov.get(MOV_DESCR);
if (descr.empty())
{
char tipo = mov.get_char(MOV_TIPO);
if (tipo == 'C' || tipo == 'F')
{
descr << tipo << '|' << mov.get(MOV_CODCF);
descr = app().decode(LF_CLIFO, descr, CLI_RAGSOC);
}
}
riga.add(descr);
arr.add(riga);
}
}
return ok;
}
int TElimina_zoppi::kill_game(long numreg, int numrig)
{
TPartite_array games;
games.add_numreg(numreg);
for (TPartita* game = games.first(); game; game = games.next())
{
bool update = false;
const int fattura = game->prima_fattura(numreg);
if (fattura > 0)
{
game->scollega_pagamenti(fattura, 1);
game->rimuovi_riga(fattura);
update = true;
}
const int rigapag = game->primo_pagamento(numreg);
if (rigapag > 0)
{
int p;
for (p = game->last(); p > 0; p = game->pred(p))
{
TRiga_partite& part = game->riga(p);
if (part.is_fattura())
{
for (int r = part.rate(); r > 0; r--)
{
TRiga_scadenze& scad = part.rata(r);
for (int s = scad.last(); s > 0; s = scad.pred(s))
{
const TRiga_partite& sum = game->riga(s);
if (sum.get_long(PART_NREG) == numreg)
{
game->elimina_pagamento(p, r, s);
update = true;
}
}
}
}
}
TRecord_array& unas = game->unassigned();
for (int u = unas.last_row(); u > 0; u = unas.pred_row(u))
{
const TRiga_partite& sum = game->riga(u);
if (sum.get_long(PART_NREG) == numreg)
{
game->elimina_pagamento(TPartita::UNASSIGNED, 0, u);
update = true;
}
}
// Elimina le righe sopravvissute
for (p = game->last(); p > 0; p = game->pred(p))
{
TRiga_partite& part = game->riga(p);
if (part.get_long(PART_NREG) == numreg)
{
game->rimuovi_riga(p);
update = true;
}
}
}
if (update)
game->rewrite();
}
return NOERR;
}
int TElimina_zoppi::kill_pagsca(long recno, int lfile)
{
CHECK(lfile == LF_SCADENZE || lfile == LF_PAGSCA, "Invalid file");
TLocalisamfile pagsca(lfile);
int err = pagsca.readat(recno);
if (err == NOERR)
err = pagsca.remove();
return err;
}
int TElimina_zoppi::kill_row(long numreg, char tipor, int numrig)
{
int lf = 0;
switch (tipor)
{
case 'C': lf = LF_RMOV; break;
case 'I': lf = LF_RMOVIVA; break;
case 'T': lf = LF_MOV; break;
case 'P': return kill_game(numreg, numrig);
case 'S':
case 'G': return kill_pagsca(numreg, numrig);
default : break;
}
TLocalisamfile rmov(lf);
rmov.put(RMV_NUMREG, numreg);
if (lf != LF_MOV)
rmov.put(RMV_NUMRIG, numrig);
int err = rmov.read();
if (err == NOERR)
err = rmov.remove();
return err;
}
bool TElimina_zoppi::select_handler(TMask_field& f, KEY k)
{
bool ok = true;
if (k == K_SPACE)
{
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"));
TString_array& arr = sheet.rows_array();
ok = test_row_file(LF_RMOV, arr);
if (ok)
ok = test_row_file(LF_RMOVIVA, arr);
if (ok)
ok = test_head_file(arr);
if (ok)
ok = test_row_file(LF_PARTITE, arr);
if (ok)
ok = test_scrow_file(LF_SCADENZE, arr);
if (ok)
ok = test_scrow_file(LF_PAGSCA, arr);
if (ok)
arr.sort();
if (ok && sheet.run() == K_ENTER)
{
const long total = sheet.checked();
if (total > 0 &&
yesno_box(FR("Confermare l'eliminazione di %ld righe."), total))
{
TProgind pi(total, TR("Eliminazione righe..."), true, true);
FOR_EACH_ARRAY_ROW(arr, i, riga)
{
if (sheet.checked(i))
{
if (pi.iscancelled())
break;
pi.addstatus(1);
TString16 str = riga->get(2);
char tipor = str[0];
int numrig = atoi(str.mid(1));
kill_row(riga->get_long(1), tipor, numrig);
}
}
message_box(TR("Si consiglia di eseguire il ricalcolo\ndei saldi dal menu di prima nota."));
}
}
}
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);
}
int elimina_zoppi(int argc, char* argv[])
{
TElimina_zoppi ez;
ez.run(argc, argv, ez.app_name());
return 0;
}