campo-sirio/sc/sc1200.cpp
guy 7a33c15e88 Aggiornato uso da conto.h e cglib.h a cglib01.h
git-svn-id: svn://10.65.10.50/trunk@4724 c028cbd2-c16b-5b4b-a496-9718f37d4682
1997-06-19 15:19:46 +00:00

364 lines
9.3 KiB
C++
Executable File

#include <applicat.h>
#include <config.h>
#include <mask.h>
#include <progind.h>
#include <relation.h>
#include <urldefid.h>
#include <utility.h>
#include <saldi.h>
#include <pconti.h>
#include <partite.h>
#include <scadenze.h>
#include <pagsca.h>
#include "../cg/cglib02.h"
#include "../cg/saldacon.h"
#include "sc1200.h"
class TCreatepart_app : public TApplication
{
TEsercizi_contabili _esc;
bool _num_cli, _num_for;
TString _desccl, _descfo;
TDate _today;
TLocalisamfile* _conti;
protected: // Applicat
virtual void on_firm_change();
virtual void on_config_change();
virtual bool create();
virtual bool destroy();
virtual bool menu(MENU_TAG m);
protected:
static bool data_handler(TMask_field& f, KEY key);
void zap_file(int logicnum) const;
bool zap_partite() const;
int crea_partite(int anno_es, int anno_rif, int next_anno_es);
public:
char is_clifo(int g, int c, long s, int& indbil);
TCreatepart_app() : _today(TODAY) {}
virtual ~TCreatepart_app() {}
};
inline TCreatepart_app& app() { return (TCreatepart_app&)main_app(); }
bool TCreatepart_app::create()
{
TApplication::create();
_conti = new TLocalisamfile(LF_PCON);
dispatch_e_menu(BAR_ITEM(1));
return TRUE;
}
bool TCreatepart_app::destroy()
{
delete _conti;
return TApplication::destroy();
}
void TCreatepart_app::on_firm_change()
{
_esc.update();
}
void TCreatepart_app::on_config_change()
{
TConfig cd(CONFIG_DITTA, "cg");
_num_cli = cd.get_bool("NrCliDx");
_num_for = cd.get_bool("NrForDx");
TPartita::carica_allineamento();
}
bool TCreatepart_app::data_handler(TMask_field& f, KEY key)
{
TMask& m = f.mask();
bool ok = TRUE;
if ((key == K_TAB && (f.focusdirty() || !m.is_running())) ||
key == K_ENTER)
{
const int anno = m.get_int(F_ANNO);
const TDate oggi(f.get());
if (app()._esc.date2esc(oggi) != anno)
ok = f.error_box("La data non appartiene all'esercizio %d", anno);
if (ok && key == K_TAB)
{
TString desc(50);
TEdit_field& dc = m.efield(F_DESCCL);
if (dc.empty() || !dc.dirty())
{
desc = "Apertura clienti al "; desc << oggi;
dc.set(desc);
dc.set_dirty(FALSE);
}
TEdit_field& df = m.efield(F_DESCFO);
if (df.empty() || !df.dirty())
{
desc = "Apertura fornitori al "; desc << oggi;
df.set(desc);
df.set_dirty(FALSE);
}
}
}
return ok;
}
void TCreatepart_app::zap_file(int logicnum) const
{
TDir dir;
dir.get(logicnum, _lock, _nordir, _sysdirop);
dir.eod() = 0;
dir.put(logicnum, _nordir, _sysdirop);
TSystemisamfile f(logicnum);
f.pack();
}
bool TCreatepart_app::zap_partite() const
{
bool ok = TRUE;
TSystemisamfile partite(LF_PARTITE);
partite.open();
bool zap = partite.items() != 0;
partite.close();
if (zap)
{
zap = yesno_box("Il saldaconto non e' vuoto.\n"
"La procedura lo azzera completamente.\n"
"Si desidera proseguire?");
if (zap)
zap = yesno_box("Confermare l'azzeramento del saldaconto esistente");
if (zap)
{
zap_file(LF_PARTITE);
zap_file(LF_SCADENZE);
zap_file(LF_PAGSCA);
}
else
ok = FALSE;
}
return ok;
}
char TCreatepart_app::is_clifo(int g, int c, long s, int& indbil)
{
_conti->zero();
_conti->put(PCN_GRUPPO, g);
_conti->put(PCN_CONTO, c);
if (_conti->read() != NOERR)
{
warning_box("Archivio saldi disallineato con il piano dei conti\n record saldi non elaborato : gruppo %d conto %d sottoconto %ld", g, c, s);
return '\0';
}
const char cf = _conti->get_char(PCN_TMCF);
indbil = _conti->get_int(PCN_INDBIL);
return cf;
}
int TCreatepart_app::crea_partite(int anno_es, int anno_rif, int next_anno_es)
{
TWait_cursor hourglass;
const bool check = anno_es != next_anno_es;
TRelation saldi(LF_SALDI);
saldi.curr().put(SLD_ANNOES, anno_es);
TCursor cur(&saldi, "", 1, &saldi.curr(), &saldi.curr());
const long items = cur.items();
if (items == 0)
return 0;
// Apre i files per usarli con l'oggetto TPartita
TLocalisamfile partite(LF_PARTITE);
TLocalisamfile scadenze(LF_SCADENZE);
TLocalisamfile pagamenti(LF_PAGSCA);
int n_part = 0;
TProgind prind(items, "Creazione saldaconto", FALSE, TRUE, 45);
for (cur = 0; cur.pos() < items; ++cur)
{
const int gruppo = cur.curr().get_int(SLD_GRUPPO);
const int conto = cur.curr().get_int(SLD_CONTO);
const long sottoc = cur.curr().get_long(SLD_SOTTOCONTO);
int indbil;
const char cf = is_clifo(gruppo, conto, sottoc, indbil);
if (check)
{
TLocalisamfile work_saldi(LF_SALDI);
work_saldi.zero();
work_saldi.put(SLD_GRUPPO, gruppo);
work_saldi.put(SLD_CONTO, conto);
work_saldi.put(SLD_SOTTOCONTO, sottoc);
work_saldi.put(SLD_ANNOES, next_anno_es);
work_saldi.put(SLD_FLSCA, "");
if (work_saldi.read() == NOERR)
continue;
}
if (cf > ' ')
{
TSaldo sld;
real s;
// ciuccia il saldo e vedi se e' movimentato nell'esercizio corrente
if (!sld.ultima_immissione_verifica(anno_es, gruppo, conto, sottoc, indbil, 1))
{
// non movimentato: se e' conto patrimoniale....
if (!(indbil == 1 || indbil == 2 || indbil == 5))
{
prind.addstatus(1);
continue;
}
// .. vedi saldo esercizio precedente, altrimenti inkul
s = sld.saldofin_esprec(anno_es, gruppo, conto, sottoc);
}
else
s = sld.saldo();
// genera importo con sezione appropriata
TImporto saldo('D', s);
saldo.normalize(); // Non togliere, serve per stabilire fattura/nota credito
if (!saldo.is_zero())
{
const TBill clifo(gruppo, conto, sottoc, cf);
TString16 numero("*");
if ((cf == 'C' && _num_cli) || (cf == 'F' && _num_for))
numero.right_just(7);
TPartita game(clifo, anno_rif, numero);
/*
if (check)
{
for (int p = game.last(); p > 0; p = game.pred(p))
{
const TRiga_partite& riga = game.riga(p);
const int g = riga.get_int(PART_GRUPPOCL);
const int c = riga.get_int(PART_CONTOCL);
if (gruppo == g && conto == c)
break; // Esiste gia' una riga con questo conto
}
if (p > 0) // Il cliente esiste gia', per cui ignoro il saldo
continue;
}
*/
TRiga_partite& riga = game.new_row();
riga.put(PART_DATAREG, _today);
riga.put(PART_DATADOC, _today);
riga.put(PART_SEZ, saldo.sezione());
riga.put(PART_IMPORTO, saldo.valore());
riga.put(PART_IMPTOTDOC,saldo.valore());
riga.put(PART_DESCR, cf == 'C' ? _desccl : _descfo);
// cazzata dare/avere/fare/baciare/cagare
const tipo_movimento tipo = (cf == 'C') ^ (saldo.sezione() == 'A') ?
tm_fattura : tm_nota_credito;
riga.put(PART_TIPOMOV, (int)tipo);
if (tipo == tm_fattura)
{
TRiga_scadenze& scad = riga.new_row();
scad.put(SCAD_IMPORTO, saldo.valore());
scad.put(SCAD_DATASCAD, _today);
scad.put(SCAD_TIPOPAG, 1); // rimessa diretta
}
else
{
riga.put(PART_DATAPAG, _today);
const int r = riga.get_int(PART_NRIGA);
TRectype& unas = game.unassigned().row(r, TRUE);
unas.put(PAGSCA_IMPORTO, saldo.valore());
unas.put(PAGSCA_ACCSAL, 'A');
}
if (game.write())
n_part++;
else
{
error_box("Impossibile scrivere la partita %d %s",
anno_rif, (const char *)numero);
break;
}
}
}
prind.addstatus(1);
}
return n_part;
}
bool TCreatepart_app::menu(MENU_TAG)
{
TMask m("sc1200a");
m.set_handler(F_DATA, data_handler);
int anno_es = _esc.last();
m.set(F_ANNO, anno_es);
if (_esc.date2esc(_today) != anno_es)
_today = _esc[anno_es].inizio();
m.set(F_DATA, _today);
while (m.run() == K_ENTER)
{
anno_es = m.get_int(F_ANNO);
_today = m.get(F_DATA);
_desccl = m.get(F_DESCCL);
_descfo = m.get(F_DESCFO);
if (!zap_partite())
continue;
const TEsercizio& selected_es = _esc.esercizio(anno_es);
const int anno_rif = selected_es.inizio().year();
int n_part = crea_partite(anno_es, anno_rif, selected_es.codice());
const int pred_es = _esc.pred(anno_es);
if (pred_es > 0)
{
const int p = crea_partite(pred_es, anno_rif, selected_es.codice());
if (p > 0) n_part += p;
}
if (n_part > 0)
{
TString msg(80);
msg << "Sono state create " << n_part << " partite";
message_box(msg);
break;
}
} // while run
return FALSE;
}
int sc1200(int argc, char** argv)
{
TCreatepart_app a;
a.run(argc, argv, "Apertura scadenze da saldi");
return 0;
}