campo-sirio/co/co1300.cpp

430 lines
9.2 KiB
C++
Raw Normal View History

#include <applicat.h>
#include <automask.h>
#include <form.h>
#include <report.h>
#include <reprint.h>
#include <textset.h>
#include "co1.h"
#include "co1300a.h"
#include "socicoop.h"
#include "..\ve\velib.h"
#include "..\ve\velib07.h"
////////////////////////////////////////////////////////
// MASCHERA
////////////////////////////////////////////////////////
class TEstrattoConto_mask : public TAutomask
{
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TEstrattoConto_mask();
virtual ~TEstrattoConto_mask() {};
};
TEstrattoConto_mask::TEstrattoConto_mask() :TAutomask ("co1300a")
{
}
bool TEstrattoConto_mask::on_field_event(TOperable_field& f, TField_event e, long jolly)
{
switch (f.dlg())
{
case F_DATAINI:
case F_DATAFIN:
if (e == fe_init || e == fe_modify)
{
const TDate ini = get_date(F_DATAINI);
const TDate fin = get_date(F_DATAFIN);
if (ini.year() == fin.year() && ini.month() == fin.month() &&
ini.day() == 1 && fin.is_end_month())
enable(F_CHIUSURA);
else
{
disable(F_CHIUSURA);
reset(F_CHIUSURA);
}
}
break;
default:
break;
}
return true;
}
////////////////////////////////////////////////////////
// REPORT
////////////////////////////////////////////////////////
class TEstrattoConto_rep : public TDocument_report
{
int _riga;
long _socio;
real _saldocred;
real _saldodeb;
real _ritenuta;
TString _numchi;
TString _tiporit;
TString _sprit;
TString _tipochi;
TString _tipoass;
TString _spchi;
TString _spass;
bool _chiusura;
protected:
virtual bool use_mask() {return false;}
virtual bool set_usr_val(const TString& name, const TVariant& var);
bool incr_field(int idx, const TVariant& var);
void chiudi_mese() ;
public:
TEstrattoConto_rep(bool chiusura);
};
bool TEstrattoConto_rep::incr_field(int idx, const TVariant& var)
{
if (_riga > 0)
{
TReport_section& f1 = section('F',1);
TReport_field* rf = f1.find_field(_riga * 1000 + 100 + idx);
if (rf != NULL)
{
TVariant v = rf->get();
v += var;
rf->set(v);
return true;
}
}
return false;
}
bool TEstrattoConto_rep::set_usr_val(const TString& name, const TVariant& var)
{
if(name == "#EC_TIPOMOV")
{
TReport_section& f1 = section('F',1);
TReport_field* rf = NULL;
int id;
for (id = 1100; ; id += 1000)
{
rf = f1.find_field(id);
if (rf == NULL)
break;
const TVariant& rfv = rf->get();
if (rfv == var)
break;
if (rfv.is_empty())
{
rf->set(var);
break;
}
}
if (rf != NULL)
_riga = id / 1000;
else
_riga = 0;
return true;
}
if (name == "#EC_QTA")
{
incr_field(2, var);
return true;
}
if (name == "#EC_MER")
{
incr_field(5, var);
return true;
}
if (name == "#EC_ACC")
{
incr_field(6, var);
return true;
}
if (name == "#EC_IMPCRE")
{
incr_field(7, var);
return true;
}
if (name == "#EC_IMPDEB")
{
incr_field(8, var);
return true;
}
if (name == "#EC_IMPO")
{
incr_field(9, var);
return true;
}
if (name == "#EC_SOCIO")
{
_socio = var.as_int();
return true;
}
if (name == "#EC_CRED")
{
const real val = var.as_real();
_saldocred += val;
TVariant cod;
get_record_field(RDOC_CODART, cod);
if (_sprit == cod.as_string() && val != ZERO)
{
_chiusura = false;
TVariant totrit;
get_usr_val("#F1.98", totrit);
real v = totrit.as_real() + val;
totrit = v;
set_usr_val("#F1.98", totrit);
}
return true;
}
if (name == "#EC_DEB")
{
const real val = var.as_real();
_saldodeb += val;
TVariant cod;
get_record_field(RDOC_CODART, cod);
if (_sprit == cod.as_string() && val != ZERO)
{
_chiusura = false;
TVariant totrit;
get_usr_val("#F1.98", totrit);
real v = totrit.as_real() - val;
totrit = v;
set_usr_val("#F1.98", totrit);
}
return true;
}
if (name == "#EC_RIT")
{
_ritenuta += var.as_real();
return true;
}
if (name == "#EC_CHIUDI")
{
chiudi_mese();
return true;
}
return TDocument_report::set_usr_val(name,var);
}
void TEstrattoConto_rep::chiudi_mese()
{
const TRecordset * recset = recordset();
if (_chiusura)
{
TRecordset* r = recordset();
const TDate datachi = r->get_var("#DATAFIN").as_date();
if (_ritenuta != ZERO) // create ritenute
{
TDocumento doc('D', datachi.year(), _numchi, 0L);
doc.set_tipo(_tiporit);
doc.stato(doc.tipo().stato_finale_inserimento());
doc.put(DOC_DATADOC, datachi);
doc.put(DOC_TIPOCF, "F");
doc.put(DOC_CODCF, _socio);
TSpesa_prest sp(_sprit);
TRiga_documento & row = doc.new_row(sp.tipo_riga());
row.put(RDOC_CODART, sp.codice());
row.put(RDOC_CHECKED, "X");
row.put(RDOC_DESCR,sp.descrizione());
row.put(RDOC_UMQTA, sp.um());
row.put(RDOC_QTA, UNO);
row.put(RDOC_PREZZO, _ritenuta);
row.put(RDOC_CODIVA, sp.cod_iva());
doc.write();
}
real saldo = _saldocred - _ritenuta - _saldodeb;
if (saldo > ZERO) // assegno
{
TDocumento doc('D', datachi.year(), _numchi, 0L);
doc.set_tipo(_tipoass);
doc.stato(doc.tipo().stato_finale_inserimento());
doc.put(DOC_DATADOC, datachi);
doc.put(DOC_TIPOCF, "F");
doc.put(DOC_CODCF, _socio);
TSpesa_prest sp(_spass);
TRiga_documento & row = doc.new_row(sp.tipo_riga());
row.put(RDOC_CODART, sp.codice());
row.put(RDOC_CHECKED, "X");
row.put(RDOC_DESCR,sp.descrizione());
row.put(RDOC_UMQTA, sp.um());
row.put(RDOC_QTA, UNO);
row.put(RDOC_PREZZO, saldo);
row.put(RDOC_CODIVA, sp.cod_iva());
doc.write();
}
else
if (saldo < ZERO) // chiusura
{
TDocumento doc('D', datachi.year(), _numchi, 0L);
doc.set_tipo(_tipochi);
doc.stato(doc.tipo().stato_finale_inserimento());
doc.put(DOC_DATADOC, datachi);
doc.put(DOC_TIPOCF, "F");
doc.put(DOC_CODCF, _socio);
TSpesa_prest sp(_spchi);
TRiga_documento & row = doc.new_row(sp.tipo_riga());
row.put(RDOC_CODART, sp.codice());
row.put(RDOC_CHECKED, "X");
row.put(RDOC_DESCR,sp.descrizione());
row.put(RDOC_UMQTA, sp.um());
row.put(RDOC_QTA, UNO);
row.put(RDOC_PREZZO, saldo);
row.put(RDOC_CODIVA, sp.cod_iva());
doc.write();
TDate dataap(datachi);
dataap += 1L;
saldo = - saldo;
TDocumento docap('D', dataap.year(), _numchi, 0L);
docap.set_tipo(_tipochi);
docap.stato(docap.tipo().stato_finale_inserimento());
docap.put(DOC_DATADOC, dataap);
docap.put(DOC_TIPOCF, "F");
docap.put(DOC_CODCF, _socio);
sp.read(_spchi);
TRiga_documento & rowap = docap.new_row(sp.tipo_riga());
rowap.put(RDOC_CODART, sp.codice());
rowap.put(RDOC_CHECKED, "X");
rowap.put(RDOC_DESCR,sp.descrizione());
rowap.put(RDOC_UMQTA, sp.um());
rowap.put(RDOC_QTA, UNO);
rowap.put(RDOC_PREZZO, saldo);
rowap.put(RDOC_CODIVA, sp.cod_iva());
docap.write();
}
}
_socio = 0L,
_saldocred = ZERO;
_saldodeb = ZERO;
_ritenuta = ZERO;
}
TEstrattoConto_rep::TEstrattoConto_rep(bool chiusura) : _chiusura(chiusura), _saldocred(), _saldodeb(ZERO), _ritenuta(ZERO)
{
load("co1300a");
TReport_section& b11 = section('B',11);
TReport_section& f1 = section('F',1);
long y = 400;
for (int i = 1000; i <= 8000; i += 1000)
{
for (int j = 100; j <= 109; ++j)
{
if (j == 101 || j == 103 || j == 104)
continue;
TReport_field* rf_b11 = b11.find_field(j);
TReport_field* rf_f1 = new TReport_field(*rf_b11);
f1.add(rf_f1);
const int id = rf_f1->id() + i;
rf_f1->set_id(id);
rf_f1->set_row(y);
rf_f1->set_postscript("");
rf_f1->set_prescript("");
rf_f1->set_field("");
}
y += 100;
}
TConfig c(CONFIG_DITTA);
_numchi = c.get("NumChi");
_tiporit = c.get("TipoRit");
_sprit = c.get("SpRitChi");
_tipochi = c.get("TipoChi");
_spchi = c.get("SpChi");
_tipoass = c.get("TipoAss");
_spass = c.get("SpAss");
}
////////////////////////////////////////////////////////
// APPLICAZIONE
////////////////////////////////////////////////////////
class TEstrattoConto : public TSkeleton_application
{
public:
virtual void main_loop();
};
void TEstrattoConto::main_loop()
{
TEstrattoConto_mask m;
while (m.run() == K_ENTER)
{
TReport_book book;
TEstrattoConto_rep rep(m.get_bool(F_CHIUSURA));
const TDate dataini = m.get_date(F_DATAINI);
const TDate datafin = m.get_date(F_DATAFIN);
const int anno = dataini.year();
// creo recordset dei soci da stampare
TISAM_recordset soci("USE SOCICOOP\nFROM CODCF=#DASOCIO\nTO CODCF=#ASOCIO");
soci.set_var("#DASOCIO", m.get_long(F_DASOCIO));
soci.set_var("#ASOCIO", m.get_long(F_ASOCIO));
for (bool ok = soci.move_first(); ok; ok = soci.move_next())
{
TRecordset* r = rep.recordset();
long codcf = soci.get(SC_CODCF).as_int();
r->set_var("#SOCIO", soci.get("CODCF"));
r->set_var("#ANNO", TVariant(long(anno)));
r->set_var("#DATAINI", dataini);
r->set_var("#DATAFIN", datafin);
book.add(rep);
}
book.print_or_preview();
}
}
int co1300(int argc, char* argv[])
{
TEstrattoConto a;
a.run(argc, argv, TR("Stampa estratto conto"));
return 0;
}