campo-sirio/ps/ps1001300.cpp
luca 3702e7711b Patch level :
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :


git-svn-id: svn://10.65.10.50/trunk@20371 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-04-22 15:36:37 +00:00

378 lines
10 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include <config.h>
#include <defmask.h>
#include <progind.h>
#include <recarray.h>
#include <textset.h>
#include "../ca/calib01.h"
#include "../ca/calib02.h"
#include "../ca/commesse.h"
#include "../ca/movana.h"
#include "../ca/rmovana.h"
#include "ps1001.h"
#include "ps1001300a.h"
///////////////////////////////////////////////////////////
// TAutomask
///////////////////////////////////////////////////////////
class TVariazione_budget_mask : public TAutomask
{
bool _dirty;
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
int carica_rmovana();
bool one_checked() const; //(on_field) controlla se nella colonna dei check ce ne è almeno 1 checkato
void check_all(const bool checked); //(on_field) checka-dechecka la colonna dei check
void save_commessa(); //(on_field) salva i cambiamenti di date della commessa esaminata
public:
TVariazione_budget_mask();
~TVariazione_budget_mask();
};
TVariazione_budget_mask::TVariazione_budget_mask() :TAutomask ("ps1001300a")
{
//carica la causale che trova nel ditta.ini
TConfig ditta_ini(CONFIG_DITTA, "ps1001");
set(F_CODCAUS, ditta_ini.get("CodCaus"));
}
TVariazione_budget_mask::~TVariazione_budget_mask()
{
//salva nel ditta.ini la causale sulla maschera
TConfig ditta_ini(CONFIG_DITTA, "ps1001");
ditta_ini.set("CodCaus", get(F_CODCAUS));
}
bool TVariazione_budget_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_CODCMS:
if (e == fe_modify)
{
bool e = carica_rmovana() == 0;
o.enable(e);
enable(F_DESCRIZ, e);
}
break;
case F_DATAINICMS:
case F_DATAFINECMS:
_dirty = true;
break;
case S_DATACOMP:
case S_DATAFCOMP:
if (e == fe_modify)
{
const TDate datainicms = get_date(F_DATAINICMS);
TDate datafinecms = get_date(F_DATAPRORCMS);
if (!datafinecms.ok())
datafinecms = get_date(F_DATAFINECMS);
const TDate data = o.get();
if (data < datainicms || (datafinecms.ok() && data > datafinecms))
return error_box("Le date competenza devono rientrare nella durata della commessa!");
_dirty = true;
}
break;
case DLG_CANCEL:
if (e == fe_button)
{
if (_dirty)
{
//chiede se salvare
}
enable(F_CODCMS);
enable(F_DESCRIZ);
sfield(F_RIGHE).destroy();
_dirty = false;
return false;
}
break;
case DLG_CHECKALL:
if (e == fe_button)
{
check_all(!one_checked());
}
break;
case DLG_TODATAINI:
if (e == fe_button)
{
const TString& datainicms = get(F_DATAINICMS);
TSheet_field& sf_righe = sfield(F_RIGHE);
const int pos = sf_righe.cid2index(S_DATACOMP);
FOR_EACH_SHEET_ROW(sf_righe, i, riga) if (riga->get_char(0) > ' ') //solo le righe checked!!
riga->add(datainicms, pos);
sf_righe.force_update();
}
break;
case DLG_TODATAFIN:
if (e == fe_button)
{
TString datafinecms = get(F_DATAPRORCMS);
if (!datafinecms.ok())
datafinecms = get(F_DATAFINECMS);
TSheet_field& sf_righe = sfield(F_RIGHE);
const int pos = sf_righe.cid2index(S_DATAFCOMP);
FOR_EACH_SHEET_ROW(sf_righe, i, riga) if (riga->get_char(0) > ' ') //solo le righe checked!!
riga->add(datafinecms, pos);
sf_righe.force_update();
}
break;
case DLG_TOMATURATO:
if (e == fe_button)
{
TSheet_field& sf_righe = sfield(F_RIGHE);
const int pos_imp = sf_righe.cid2index(S_IMPORTO);
const int pos_mat = sf_righe.cid2index(S_MATURATO);
FOR_EACH_SHEET_ROW(sf_righe, i, riga) if (riga->get_char(0) > ' ') //solo le righe checked!!
riga->add(riga->get(pos_mat), pos_imp);
sf_righe.force_update();
}
break;
case DLG_SAVEREC:
if (e == fe_button && check_fields())
{
save_commessa();
}
break;
default:
break;
}
return true;
}
///////////////////////////////////
// Metodi della on_field_event
///////////////////////////////////
//salva la commessa con le eventuali modifiche effettuate sulle date
void TVariazione_budget_mask::save_commessa()
{
TLocalisamfile commesse(LF_COMMESSE);
commesse.put(COMMESSE_CODCMS, get(F_CODCMS));
int err = commesse.read(_isequal, _lock);
if (err == NOERR)
{
commesse.put(COMMESSE_DATAINIZIO, get_date(F_DATAINICMS));
commesse.put(COMMESSE_DATAFINE, get_date(F_DATAFINECMS));
commesse.put(COMMESSE_PROROGA, get_bool(F_PROROGATA));
commesse.put(COMMESSE_DATAPROR, get_date(F_DATAPRORCMS));
//solo la rewrite perchè la commessa ovviamente esiste già
commesse.rewrite();
}
}
//controlla sulla colonna delle spunte se almeno una è checkata
bool TVariazione_budget_mask::one_checked() const
{
TSheet_field& sf_righe = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sf_righe, i, riga)
{
if (riga->get_char(0) > ' ')
return true;
}
return false;
}
//checka-dechecka la colonna di spunte dello sheet
void TVariazione_budget_mask::check_all(const bool checked)
{
TSheet_field& sf_righe = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sf_righe, i, riga)
riga->add(checked ? "X" : "", 0);
sf_righe.force_update();
}
//ordina per numreg/numrig (long+int)
static int compare_by_numrig(TSheet_field & s, int r1, int r2)
{
TToken_string& s1 = s.row(r1);
TToken_string& s2 = s.row(r2);
//prima guarda il numreg..
long c10 = s1.get_long(11);
long c20 = s2.get_long(11);
int cmp = c10 - c20;
//..poi il numrig
if (cmp == 0)
{
int c11 = s1.get_int(12);
int c21 = s2.get_int(12);
cmp = c11 - c21;
}
return cmp;
}
//ordina le righe per sede/fase (string+string)
static int compare_by_fase(TSheet_field & s, int r1, int r2)
{
TToken_string& s1 = s.row(r1);
TToken_string& s2 = s.row(r2);
TToken_string c1;
c1.add(s1.get(1));
c1.add(s1.get(2));
TToken_string c2;
c2.add(s2.get(1));
c2.add(s2.get(2));
int cmp = c1.compare(c2);
if (cmp == 0)
cmp = compare_by_numrig(s, r1, r2);
return cmp;
}
int TVariazione_budget_mask::carica_rmovana()
{
TString query;
query << "USE RMOVANA KEY 4\n";
query << "SELECT ((MOVANA.TIPOMOV=\"P\")||(MOVANA.TIPOMOV=\"V\"))\n";
query << "JOIN MOVANA INTO NUMREG==NUMREG\n";
query << "FROM CODCMS=#CODCMS\n";
query << "TO CODCMS=#CODCMS\n";
//instanzio un TISAM_recordset sulle rmovana
TISAM_recordset rmovana(query);
const TString cms = get(F_CODCMS);
rmovana.set_var("#CODCMS", cms);
const long rmovana_items = rmovana.items();
TProgind pi(rmovana_items, "Generazione righe in corso...", true, true);
//recupero sheet e realtiva mashera di riga
TSheet_field& sf_righe = sfield(F_RIGHE);
TMask& msk = sf_righe.sheet_mask();
sf_righe.destroy();
//per ogni riga del recordset va ad aggiornare lo sheet sulla maschera (aggiunge la riga)
for (bool ok = rmovana.move_first(); ok; ok = rmovana.move_next())
{
if (!pi.addstatus(1))
break;
TToken_string& row = sf_righe.row(-1);
//chiave iniziale di riga
const TString& cdc = rmovana.get(RMOVANA_CODCCOSTO).as_string();
row.add(cdc, 1);
const TString& fase = rmovana.get(RMOVANA_CODFASE).as_string();
row.add(fase, 2);
const TString& conto = rmovana.get(RMOVANA_CODCONTO).as_string();
row.add(conto, 3);
//date competenza iniziale e finale
const TDate datacomp = rmovana.get("MOVANA."MOVANA_DATACOMP).as_date();
TDate datafcomp = rmovana.get("MOVANA."MOVANA_DATAFCOMP).as_date();
const bool autofcomp = rmovana.get("MOVANA."MOVANA_AUTOFCOMP).as_bool();
//caso cazzuto della scadenza con la fine della commessa (come nella stampa bilancio commessa)
if (autofcomp)
{
const TRectype& rec_commesse = cache().get(LF_COMMESSE, cms);
//data del cazzo che serve per non rovinare datacomp, che è la data sulla riga, non quella iniziale di cms
TDate datainicms;
ca_durata_commessa(rec_commesse, datainicms, datafcomp);
}
if (!datafcomp.ok())
datafcomp = datacomp;
row.add(datacomp, 4);
row.add(autofcomp ? "X" : "", 5);
row.add(datafcomp, 6);
//costo o ricavo? all'indbil l'ardua sentenza!
TAnal_bill bill(conto, cdc, cms, fase);
const int indbil = bill.indicatore_bilancio();
const char* str_indbil = indbil == 3 ? "C" : "R";
row.add(str_indbil, 7);
real valore = rmovana.get(RMOVANA_IMPORTO).as_real();
const char sezione = rmovana.get(RMOVANA_SEZIONE).as_string()[0];
TImporto importo(sezione, valore);
importo.normalize(indbil == 3 ? 'D' : 'A');
valore = importo.valore();
row.add(valore.string(), 8);
//recupera il saldo finale consuntivo! in base alla chiave cms/cdc/fase/conto e lo mette nel campo consuntivo
const TDate dataini, datafin;
const TSaldanal& saldanal = ca_saldo(bill, dataini, datafin, _saldanal_consuntivo | _saldanal_ultima_imm);
TImporto saldo_finale = saldanal._fin;
saldo_finale.normalize(indbil == 3 ? 'D' : 'A');
const real saldo_finale_valore = saldo_finale.valore();
row.add(saldo_finale_valore.string(), 9);
//completa la riga
row.add(rmovana.get(RMOVANA_DESCR).as_string(), 10);
row.add(rmovana.get(RMOVANA_NUMREG).as_int(), 11);
row.add(rmovana.get(RMOVANA_NUMRIG).as_int(), 12);
const TString& tipomov = rmovana.get("MOVANA."MOVANA_TIPOMOV).as_string();
row.add(tipomov, 13);
} //for(bool ok.move....
//prima di riempire lo sheet a video ordina le righe per sede/fase/numreg/numrig
sf_righe.sort(compare_by_fase);
//e poi aggiorna il video!
sf_righe.force_update();
return sf_righe.items();
}
///////////////////////////////////////
// TSkeleton_application
///////////////////////////////////////
class TVariazione_budget : public TSkeleton_application
{
virtual bool check_autorization() const { return false; }
virtual const char * extra_modules() const { return "ca"; }
TVariazione_budget_mask* _msk;
protected:
public:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
TVariazione_budget() {};
};
bool TVariazione_budget::create()
{
_msk = new TVariazione_budget_mask();
return TSkeleton_application::create();
}
bool TVariazione_budget::destroy()
{
delete _msk;
return TApplication::destroy();
}
void TVariazione_budget::main_loop()
{
KEY tasto;
tasto = _msk->run();
}
int ps1001300 (int argc, char* argv[])
{
TVariazione_budget main_app;
main_app.run(argc, argv, TR("Variazione budget"));
return true;
}