campo-sirio/lv/lv0400.cpp

370 lines
8.7 KiB
C++
Raw Normal View History

#include <automask.h>
#include <execp.h>
#include <msksheet.h>
#include <relapp.h>
#include <recarray.h>
#include <recset.h>
#include "lv0400.h"
#include "../mg/anamag.h"
#include "../mg/mglib.h"
class TContratti_msk: public TAutomask
{
protected:
bool on_art_select();
virtual bool on_field_event(TOperable_field& o,TField_event e,long jolly);
public:
TContratti_msk();
};
bool TContratti_msk::on_art_select()
{
TSheet_field& ss=sfield(F_RIGHE);
TToken_string & row = ss.row(ss.selected());
const TString80 codart(row.get(ss.cid2index(S_CODART)));
const TString4 umcont(row.get(ss.cid2index(S_UM)));
TArticolo artrec(codart);
TMask& rowmask=ss.sheet_mask();
const int indsped=get_int(F_INDSPED);
const TDate oggi(TODAY);
TString query, filter;
filter << "ANNOES=#ANNOES CODART=#CODART TIPOCF=C CODCF=#CLIENTE";
filter << " INDSPED=" << indsped;
query << "USE CLIFOGIAC KEY 3\n"
<< "FROM " << filter << '\n'
<< "TO " << filter << '\n';
TISAM_recordset recgiac (query);
recgiac.set_var("#CLIENTE",get_long(F_CODCF));
recgiac.set_var("#ANNOES",TVariant((long)oggi.year()));
recgiac.set_var("#CODART",TVariant(codart));
real dotod,consyear,consmonth;
if (recgiac.move_first())
{
dotod=artrec.convert_to_um(recgiac.get("GIAC").as_real(),umcont);
consyear=artrec.convert_to_um(recgiac.get("ACQ").as_real()+recgiac.get("ENT").as_real(),umcont);
}
rowmask.set(S_DOTOD,dotod);
row.add(dotod.stringa(),ss.cid2index(S_DOTOD));
rowmask.set(S_CONSANNO,consyear);
row.add(consyear.stringa(),ss.cid2index(S_CONSANNO));
TDate imese(oggi);
imese.set_day(1);
query="USE MOVMAG KEY 3\n";
query << "SELECT (TIPOCF='C')&&(STR(CODCF=" << get_long(F_CODCF) << "))&&(STR(CODINDSP=" << indsped << "))\n";
query << "FROM DATAREG=" << imese << "\n"
<< "TO DATAREG=" << oggi << "\n";
TISAM_recordset recmag(query);
for (bool ok=recmag.move_first(); ok; ok=recmag.move_next())
{
const TCausale_magazzino tcaus(recmag.get(MOVMAG_CODCAUS).as_string());
TString queryrmag="USE RMOVMAG\n";
queryrmag << "SELECT CODART='" << codart << "'\n";
queryrmag << "FROM NUMREG=" << recmag.get(MOVMAG_NUMREG) << "\n"
<< "TO NUMREG=" << recmag.get(MOVMAG_NUMREG) << "\n";
TISAM_recordset recrmag(queryrmag);
for (bool ok=recrmag.move_first(); ok; ok=recrmag.move_next())
{
int sgn_acq=tcaus.sgn(s_acq);
int sgn_ent=tcaus.sgn(s_ent);
const TString& codcaus=recrmag.get(RMOVMAG_CODCAUS).as_string();
if (codcaus.full())
{
const TCausale_magazzino rcaus(codcaus);
sgn_acq=rcaus.sgn(s_acq);
sgn_ent=rcaus.sgn(s_ent);
}
if (sgn_acq!=0 || sgn_ent!=0)
{
const TString4 um=recrmag.get(RMOVMAG_UM).as_string();
const real qta=artrec.convert_to_um(recrmag.get(RMOVMAG_QUANT).as_real(),umcont,um);
if (sgn_acq!=0)
consmonth+=qta*sgn_acq;
if (sgn_ent!=0)
consmonth+=qta*sgn_ent;
}
}
}
rowmask.set(S_CONSMESE,consmonth);
row.add(consmonth.stringa(),ss.cid2index(S_CONSMESE));
const bool varclcons = rowmask.get_int(S_PPCONF)>0;
ss.enable_cell(ss.selected(),ss.cid2index(S_CALCCONS));
rowmask.set(S_CALCCONS,"0");
row.add("0",ss.cid2index(S_CALCCONS));
return true;
}
bool TContratti_msk:: on_field_event(TOperable_field& o,TField_event e,long jolly)
{
switch(o.dlg())
{
case DLG_PLANNING:
if (e==fe_button && edit_mode())
{
TRelation_application& app=(TRelation_application&) main_app();
app.get_relation()->read(_isequal,_unlock);
TString str;
str << "lv0 -4 " << get(F_CODCF) << " " << get(F_CODCONT);
TExternal_app planning(str);
planning.run();
app.get_relation()->read(_isequal,_lock);
}
break;
case S_CODART:
if (e==fe_modify)
{
TSheet_field& ss=sfield(F_RIGHE);
TToken_string& row=ss.row(ss.selected());
row.add(o.get(),ss.cid2index(S_CODART));
TArticolo art(o.get());
const TString& um = art.um()[0].get(UMART_UM);
set(S_UM,um);
row.add(um,S_UM);
on_art_select();
}
else
if (e==fe_init)
on_art_select();
break;
default:break;
}
return true;
}
TContratti_msk::TContratti_msk():TAutomask("lv0400a")
{
}
class TContratti_app: public TRelation_application
{
TContratti_msk* _msk;
TRelation* _rel;
bool _unicont;
private:
void save_rows(const TMask& m);
void build_query(const TMask& m,TString& query) const;
int find_art(TSheet_field& s,const TString& art) const;
protected:
virtual TMask* get_mask (int mode) {return _msk; }
virtual TRelation* get_relation() const {return _rel;}
virtual bool user_create();
virtual bool user_destroy();
virtual void on_config_change();
virtual bool get_next_key(TToken_string& key);
virtual int read(TMask& m);
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual bool remove();
};
bool TContratti_app:: user_create()
{
_rel=new TRelation (LF_LVCONDV);
_msk= new TContratti_msk;
return true;
}
bool TContratti_app:: user_destroy()
{
delete _msk;
delete _rel;
return true;
}
void TContratti_app:: on_config_change()
{
TConfig ini(CONFIG_DITTA);
_unicont=ini.get_bool("UniCont");
}
bool TContratti_app:: get_next_key(TToken_string& key)
{
const long cliente=_msk->get_long(F_CODCF);
if (cliente<=0) return false;
key.add(F_CODCF);
key.add(cliente);
key.add(F_CODCONT);
long codcont=0;
if (_unicont)
{
TISAM_recordset recset ("USE LVCONDV");
for (bool ok=recset.move_first(); ok; ok=recset.move_next())
{
const long codice=recset.get("CODCONT").as_int();
if (codice>codcont)
codcont=codice;
}
}
else
{
TString query;
query<<"USE LVCONDV \n"
<<"FROM CODCF=#CLIENTE\n"
<<"TO CODCF=#CLIENTE\n";
TISAM_recordset recset (query);
recset.set_var("#CLIENTE",cliente);
if (recset.move_last())
codcont=recset.get("CODCONT").as_int();
}
codcont++;
key.add(codcont);
return true;
}
void TContratti_app:: build_query(const TMask& m,TString& query) const
{
query="";
query << "USE LVRCONDV\n"
<< "FROM CODCF="<<m.get(F_CODCF)<<" CODCONT="<<m.get(F_CODCONT)<<"\n"
<< "TO CODCF="<<m.get(F_CODCF)<<" CODCONT="<<m.get(F_CODCONT);
}
int TContratti_app:: read(TMask& m)
{
int err=TRelation_application::read(m);
if(err==NOERR)
{
TString query;
build_query(m,query);
TISAM_recordset righeset(query);
const TRectype& rec=righeset.cursor()->curr();
TSheet_field& righe=m.sfield(F_RIGHE);
TMask& msk=righe.sheet_mask();
righe.destroy();
for (bool ok=righeset.move_first(); ok; ok=righeset.move_next())
{
TToken_string& row=righe.row(-1);
FOR_EACH_MASK_FIELD(msk,i,f)
{
const TFieldref*fr=f->field();
if (fr!= NULL)
row.add(fr->read(rec),righe.cid2index(f->dlg()));
}
righe.check_row(righe.items()-1,3);
}
righe.force_update();
}
return err;
}
int TContratti_app::find_art(TSheet_field& s,const TString& art) const
{
int r=-1;
for (r=s.items()-1;r>=0;r--)
{
const char* codart= s.row(r).get(0);
if (art==codart)
break;
}
return r;
}
void TContratti_app::save_rows(const TMask& m)
{
TString query;
TSheet_field& righe=m.sfield(F_RIGHE);
build_query(m,query);
TISAM_recordset righeset(query);
TLocalisamfile& file=righeset.cursor()->file();
for (bool ok=righeset.move_first(); ok; ok=righeset.move_next())
{
const TString& art=righeset.get("CODART").as_string();
if (find_art(righe,art)<0)
file.remove();
}
TMask& msk=righe.sheet_mask();
FOR_EACH_SHEET_ROW(righe,r,row)
{
file.zero();
file.put("CODCF",m.get(F_CODCF));
file.put("CODCONT",m.get(F_CODCONT));
FOR_EACH_MASK_FIELD(msk,i,f)
{
const TFieldref*fr=f->field();
if (fr!= NULL)
{
const int pos=righe.cid2index(f->dlg());
fr->write(row->get(pos),file.curr());
}
}
file.rewrite_write();
}
}
int TContratti_app::write(const TMask& m)
{
int err=TRelation_application::write(m);
if(err==NOERR) save_rows(m);
return err;
}
int TContratti_app::rewrite(const TMask& m)
{
int err=TRelation_application::rewrite(m);
if(err==NOERR) save_rows(m);
return err;
}
bool TContratti_app::remove()
{
bool ok=TRelation_application::remove();
if(ok)
{
TString query;
build_query(*_msk,query);
TISAM_recordset righeset(query);
TLocalisamfile& file=righeset.cursor()->file();
for (bool ok=righeset.move_first(); ok; ok=righeset.move_next())
{
file.remove();
}
}
return ok;
}
int lv0400(int argc, char* argv[])
{
TContratti_app app;
app.run (argc,argv,TR("Gestione contratti"));
return 0;
}