ceb86a9c6b
cg2100.cpp Rifatta gestione pagamento immediato cg2102.cpp COrretto handler della data di registrazione cg2104.cpp Corretta gestione numero di riferimento partita cg2105.cpp Proposto in automatico l'importo dei pagamenti cg2200.cpp Azzerata ad ogni ciclo la maschera dei provisori cg3100.cpp Eliminati tutti gli accessi diretti alla tabella esercizi cg3600.cpp Aggiunta gestione e salvataggio colonne cglib04.cpp Tolti accessi diretti alla tabella degli esercizi pagament.cpp Corretta creazione nuove rate rispettando le classificazioni git-svn-id: svn://10.65.10.50/trunk@3985 c028cbd2-c16b-5b4b-a496-9718f37d4682
363 lines
8.4 KiB
C++
Executable File
363 lines
8.4 KiB
C++
Executable File
#include <applicat.h>
|
|
#include <mask.h>
|
|
#include <progind.h>
|
|
#include <tabutil.h>
|
|
#include <urldefid.h>
|
|
|
|
#include "cg2200.h"
|
|
#include "cg2101.h"
|
|
#include "cglib.h"
|
|
|
|
#include <causali.h>
|
|
#include <mov.h>
|
|
#include <rmov.h>
|
|
#include <rmoviva.h>
|
|
|
|
TString& add_plural(TString& s, long num, const char* name)
|
|
{
|
|
const TFixed_string n(name);
|
|
const char last = n[n.len()-1];
|
|
|
|
if (num < 1)
|
|
{
|
|
s << "nessun";
|
|
if (toupper(last) == 'A' || toupper(n[0]) == 'Z' ||
|
|
toupper(n[0]) == 'S' && strchr("aeiouAEIOU", n[1]) == NULL)
|
|
s << tolower(last);
|
|
s << ' ' << name;
|
|
}
|
|
else
|
|
{
|
|
s << num << ' ' << name;
|
|
if (num > 1)
|
|
s[s.len()-1] = (last == 'a') ? 'e' : 'i';
|
|
}
|
|
|
|
return s;
|
|
}
|
|
|
|
class TProvvisori_app : public TApplication
|
|
{
|
|
TLocalisamfile* _sal;
|
|
TLocalisamfile* _cau;
|
|
TTable* _reg;
|
|
|
|
TString16 _from_caus, _to_caus;
|
|
|
|
TSaldo_agg _saldi;
|
|
|
|
protected: // TApplication
|
|
virtual bool create();
|
|
virtual bool destroy();
|
|
virtual bool menu(MENU_TAG m);
|
|
|
|
protected:
|
|
static bool date_handler(TMask_field& f, KEY k);
|
|
|
|
public:
|
|
void inizia_saldi(const TRectype& mov);
|
|
void aggiungi_saldi(const TRectype& rmov, bool lettura);
|
|
void aggiorna_saldi();
|
|
|
|
bool confirm_provv(TCursor& cur, TProgind& pi);
|
|
bool delete_provv(TCursor& cur, TProgind& pi);
|
|
static bool filter(const TRelation* rel);
|
|
|
|
TProvvisori_app() {};
|
|
};
|
|
|
|
inline TProvvisori_app& app()
|
|
{ return (TProvvisori_app&)main_app(); }
|
|
|
|
|
|
bool TProvvisori_app::create()
|
|
{
|
|
TApplication::create();
|
|
|
|
_cau = new TLocalisamfile(LF_CAUSALI);
|
|
_sal = new TLocalisamfile(LF_SALDI);
|
|
_reg = new TTable("REG");
|
|
|
|
dispatch_e_menu(BAR_ITEM(1));
|
|
return TRUE;
|
|
}
|
|
|
|
bool TProvvisori_app::destroy()
|
|
{
|
|
delete _reg;
|
|
delete _sal;
|
|
delete _cau;
|
|
|
|
return TApplication::destroy();
|
|
}
|
|
|
|
void TProvvisori_app::inizia_saldi(const TRectype& r)
|
|
{
|
|
CHECK(r.num() == LF_MOV, "Voglio un movimento");
|
|
|
|
_saldi.reset();
|
|
|
|
tiposal tsal = normale;
|
|
const TString& c = r.get(MOV_CODCAUS);
|
|
if (c.not_empty())
|
|
{
|
|
_cau->put(CAU_CODCAUS, c);
|
|
if (_cau->read() == NOERR)
|
|
{
|
|
if (_cau->get_char(CAU_MOVAP) == 'A') tsal = apertura;
|
|
else if (_cau->get_char(CAU_MOVAP) == 'C') tsal = chiusura;
|
|
}
|
|
}
|
|
_saldi.set_tipo_saldo(tsal);
|
|
|
|
_saldi.set_anno_es(r.get_int(MOV_ANNOES));
|
|
_saldi.set_num_ulmov(r.get_long(MOV_NUMREG));
|
|
_saldi.set_data_ulmov(r.get_date(MOV_DATAREG));
|
|
}
|
|
|
|
void TProvvisori_app::aggiungi_saldi(const TRectype& r, bool lettura)
|
|
{
|
|
CHECK(r.num() == LF_RMOV, "Voglio la riga di un movimento");
|
|
|
|
TBill conto; conto.get(r);
|
|
TImporto importo(r.get_char(RMV_SEZIONE), r.get_real(RMV_IMPORTO));
|
|
|
|
_saldi.set_movprovv(lettura); // In lettura sono tutti provvisori
|
|
_saldi.aggiorna(conto, importo, !lettura); // In lettura devo sottrarre l'importo
|
|
}
|
|
|
|
void TProvvisori_app::aggiorna_saldi()
|
|
{
|
|
_saldi.registra();
|
|
}
|
|
|
|
bool TProvvisori_app::confirm_provv(TCursor& cur, TProgind& pi)
|
|
{
|
|
TLocalisamfile& mov = cur.file(LF_MOV);
|
|
TLocalisamfile rmov(LF_RMOV);
|
|
|
|
for (cur = 0; cur.pos() < cur.items(); ++cur)
|
|
{
|
|
const long numreg = mov.get_long(MOV_NUMREG);
|
|
inizia_saldi(mov.curr());
|
|
|
|
int err = cur.lock();
|
|
for (int rig = 1; err == NOERR; rig++)
|
|
{
|
|
rmov.put(RMV_NUMREG, numreg);
|
|
rmov.put(RMV_NUMRIG, rig);
|
|
if (rmov.read(_isequal, _lock) != NOERR) break;
|
|
aggiungi_saldi(rmov.curr(), TRUE);
|
|
aggiungi_saldi(rmov.curr(), FALSE);
|
|
}
|
|
|
|
if (err == NOERR)
|
|
{
|
|
mov.zero(MOV_PROVVIS);
|
|
err = mov.rewrite();
|
|
if (err == NOERR)
|
|
{
|
|
aggiorna_saldi();
|
|
pi.addstatus(1);
|
|
}
|
|
}
|
|
|
|
if (err != NOERR)
|
|
return error_box("Errore nella conferma del movimento %ld", numreg);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool TProvvisori_app::delete_provv(TCursor& cur, TProgind& pi)
|
|
{
|
|
TLocalisamfile& mov = cur.file(LF_MOV);
|
|
TLocalisamfile rmov(LF_RMOV);
|
|
TLocalisamfile rmoviva(LF_RMOVIVA);
|
|
|
|
TString256 error;
|
|
|
|
for (cur = 0; cur.pos() < cur.items(); ++cur)
|
|
{
|
|
const long numreg = mov.get_long(MOV_NUMREG);
|
|
|
|
mov.setkey(1); // Isam bug on remove with key != 1
|
|
mov.put(MOV_NUMREG, numreg);
|
|
int err = mov.read(_isequal, _lock);
|
|
if (err != NOERR)
|
|
return error_box("Errore %d nel bloccare il record %ld", err, numreg);
|
|
|
|
inizia_saldi(mov.curr());
|
|
|
|
for (int rig = 1; err == NOERR; rig++)
|
|
{
|
|
rmov.put(RMV_NUMREG, numreg);
|
|
rmov.put(RMV_NUMRIG, rig);
|
|
if (rmov.read(_isequal, _lock) != NOERR) break;
|
|
|
|
aggiungi_saldi(rmov.curr(), TRUE);
|
|
err = rmov.remove();
|
|
if (err != NOERR)
|
|
error.format("riga contabile %d", rig);
|
|
}
|
|
for (rig = 1; err == NOERR; rig++)
|
|
{
|
|
rmoviva.put(RMI_NUMREG, numreg);
|
|
rmoviva.put(RMI_NUMRIG, rig);
|
|
if (rmoviva.read(_isequal, _lock) != NOERR) break;
|
|
err = rmov.remove();
|
|
if (err != NOERR)
|
|
error.format("riga IVA %d", rig);
|
|
}
|
|
|
|
if (err == NOERR)
|
|
{
|
|
err = mov.remove();
|
|
if (err != NOERR)
|
|
error = "testata";
|
|
}
|
|
|
|
if (err == NOERR)
|
|
{
|
|
aggiorna_saldi();
|
|
pi.addstatus(1);
|
|
}
|
|
else
|
|
return error_box("Errore %d nella cancellazione della %s del movimento %ld",
|
|
err, (const char*)error, numreg);
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
bool TProvvisori_app::filter(const TRelation* rel)
|
|
{
|
|
bool ok = FALSE;
|
|
|
|
const TRectype& mov = rel->curr();
|
|
if (mov.get_char(MOV_PROVVIS) > ' ')
|
|
{
|
|
const char* caus = mov.get(MOV_CODCAUS);
|
|
ok = app()._from_caus <= caus && app()._to_caus >= caus;
|
|
}
|
|
|
|
return ok;
|
|
}
|
|
|
|
// Deve essere specificata almeno una data (inizio o fine)
|
|
bool TProvvisori_app::date_handler(TMask_field& f, KEY k)
|
|
{
|
|
bool ok = TRUE;
|
|
if (k == K_ENTER && f.get().empty())
|
|
{
|
|
const TMask& m = f.mask();
|
|
if (m.get(F_TODATE).empty())
|
|
ok = f.error_box("E' necessario specificare almeno una data");
|
|
}
|
|
return ok;
|
|
}
|
|
|
|
bool TProvvisori_app::menu(MENU_TAG)
|
|
{
|
|
TMask m("cg2200a");
|
|
m.set_handler(F_FROMDATE, date_handler);
|
|
|
|
TCursor& cur = *m.efield(F_FROMDATE).browse()->cursor();
|
|
|
|
while (TRUE)
|
|
{
|
|
TRectype from(LF_MOV), to(LF_MOV);
|
|
cur.setregion(from, to);
|
|
cur.set_filterfunction(NULL);
|
|
|
|
m.reset();
|
|
|
|
const KEY key = m.run();
|
|
if (key == K_QUIT)
|
|
break;
|
|
|
|
TString16 from_d = m.get(F_FROMDATE);
|
|
TString16 to_d = m.get(F_TODATE);
|
|
|
|
if (from_d.empty() && to_d.empty())
|
|
{
|
|
error_box("E' nessario specificare almeno una data.");
|
|
continue;
|
|
}
|
|
|
|
if (key == K_ENTER)
|
|
{
|
|
const TDate da(from_d);
|
|
const TLibro_giornale lg(da.year());
|
|
const TDate lp(lg.last_print());
|
|
if (da < lp)
|
|
{
|
|
from_d = lp.string();
|
|
const bool ok = yesno_box("Il libro giornale e stato stampato il %s:\n"
|
|
"Si desidera modificare la data iniziale?",
|
|
(const char*)from_d);
|
|
if (!ok) continue;
|
|
}
|
|
}
|
|
|
|
if (from_d.not_empty()) from.put(MOV_DATAREG, from_d);
|
|
|
|
const TString& from_r = m.get(F_FROMREG);
|
|
if (from_r.not_empty()) from.put(MOV_NUMREG, from_r);
|
|
|
|
_from_caus = m.get(F_FROMCAUS);
|
|
|
|
if (to_d.not_empty()) to.put(MOV_DATAREG, to_d);
|
|
|
|
const TString& to_r = m.get(F_TOREG);
|
|
if (to_r.not_empty()) to.put(MOV_NUMREG, to_r);
|
|
|
|
_to_caus = m.get(F_TOCAUS);
|
|
|
|
cur.setregion(from, to);
|
|
cur.set_filterfunction(filter);
|
|
|
|
const TRecnotype total = cur.items();
|
|
|
|
TString action(key == K_ENTER ? "conferma" : "cancellazione");
|
|
action << " di "; add_plural(action, total, "movimento");
|
|
|
|
TString caption("E' stata richiesta la ");
|
|
caption << action << '.';
|
|
|
|
if (total > 0)
|
|
{
|
|
caption << "\nSi desidera continuare?";
|
|
if (!yesno_box(caption)) continue;
|
|
}
|
|
else
|
|
{
|
|
warning_box(caption);
|
|
continue;
|
|
}
|
|
|
|
action[0] = toupper(action[0]);
|
|
TProgind pi(total, action, FALSE, TRUE, 24);
|
|
|
|
cur.freeze(TRUE);
|
|
|
|
if (key == K_ENTER)
|
|
confirm_provv(cur, pi);
|
|
else
|
|
delete_provv(cur, pi);
|
|
|
|
cur.freeze(FALSE);
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
int cg2200(int argc, char** argv)
|
|
{
|
|
TProvvisori_app a;
|
|
a.run(argc, argv, "Gestione provvisori");
|
|
return 0;
|
|
}
|