Patch level :2.2
Files correlati :troppi Ricompilazione Demo : [ ] Commento :conversione e amenita' varie git-svn-id: svn://10.65.10.50/trunk@12809 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
c1953da88f
commit
f478a273c8
@ -90,7 +90,8 @@ TMask_tabanal::TMask_tabanal(const char* c, const char* k, const char* d)
|
||||
// applicazione per la gestione delle tabelle di Contabilita' Analitica
|
||||
class Tab_app_ca : public Tab_application
|
||||
{
|
||||
|
||||
virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM
|
||||
|
||||
protected: // TRelation_application
|
||||
virtual bool user_destroy() ;
|
||||
virtual bool user_create() ;
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <automask.h>
|
||||
#include <confapp.h>
|
||||
|
||||
#include "calib01.h"
|
||||
#include "ca0.h"
|
||||
#include "ca0300a.h"
|
||||
|
||||
@ -74,6 +75,7 @@ bool TConf_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
class TConf_Analitica : public TConfig_application
|
||||
{
|
||||
TMask* _cm;
|
||||
virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM
|
||||
|
||||
protected:
|
||||
virtual TMask* create_mask(const TFilename& f);
|
||||
@ -117,8 +119,8 @@ bool TConf_Analitica::postprocess_config (TMask& mask, TConfig& config)
|
||||
|
||||
bool TConf_Analitica::user_create( )
|
||||
{
|
||||
TConfig config(CONFIG_DITTA, "ca");
|
||||
config.set( "EdMask", "ca0300a", "ca");
|
||||
TConfig_anal config;
|
||||
config.set( "EdMask", "ca0300a");
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ protected:
|
||||
|
||||
bool TAnalisi_app::create()
|
||||
{
|
||||
TConfig cfg(CONFIG_DITTA, "ca");
|
||||
TConfig_anal cfg;
|
||||
const bool use_cg0 = cfg.get_bool("UsePdcc");
|
||||
if (use_cg0)
|
||||
{
|
||||
|
@ -144,7 +144,7 @@ void TRiparti_msk::create_sheet()
|
||||
|
||||
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
|
||||
|
||||
TConfig ini(CONFIG_DITTA, "ca");
|
||||
TConfig_anal ini;
|
||||
|
||||
int y = 1;
|
||||
short dlg = 202;
|
||||
@ -195,7 +195,7 @@ void TRiparti_msk::create_sheet()
|
||||
|
||||
TRiparti_msk::TRiparti_msk() : TAutomask("ca0800a")
|
||||
{
|
||||
TConfig ini(CONFIG_DITTA, "ca");
|
||||
TConfig_anal ini;
|
||||
|
||||
// Crea gli eventuali campi per commessa e centro di costo
|
||||
|
||||
@ -241,6 +241,8 @@ class TRiparti_app : public TRelation_application
|
||||
TRelation* _rel;
|
||||
TRiparti_msk* _msk;
|
||||
|
||||
virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM
|
||||
|
||||
const TString& somma_campi(TToken_string& row, int first, bool pdc = false) const;
|
||||
void write_rows();
|
||||
|
||||
|
@ -60,6 +60,8 @@ class TMovanal_app : public TRelation_application
|
||||
TRelation* _rel;
|
||||
TMovanal_msk* _msk;
|
||||
|
||||
virtual const char * extra_modules() const {return "cm";} //deve funzionare anche per le commesse
|
||||
|
||||
protected:
|
||||
virtual bool user_create();
|
||||
virtual bool user_destroy();
|
||||
@ -567,7 +569,7 @@ void TMovanal_msk::create_sheet()
|
||||
|
||||
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
|
||||
|
||||
TConfig ini(CONFIG_DITTA, "ca");
|
||||
TConfig_anal ini;
|
||||
const bool fsc_req = ini.get_bool("FscRequired");
|
||||
|
||||
int y = 3;
|
||||
|
@ -57,43 +57,6 @@ TRipartizione::TRipartizione(TString16 codice) : TMultiple_rectype(LF_RIP)
|
||||
read();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// CLASSE PER RIPARTIZIONI RIGHE
|
||||
//--------------------------------------------------------------------
|
||||
class TCache_ripartizioni : public TCache
|
||||
{
|
||||
protected:
|
||||
virtual TObject* key2obj(const char* key);
|
||||
|
||||
public:
|
||||
const TRecord_array& righe(const char* costo, const char* commessa);
|
||||
};
|
||||
|
||||
TObject* TCache_ripartizioni::key2obj(const char* key)
|
||||
{
|
||||
TToken_string parametro(key);
|
||||
TLocalisamfile rip(LF_RIP);
|
||||
rip.setkey(4); //chiave 4 (tipo+codcosto+codcms)
|
||||
rip.put(RIP_TIPO, "B");
|
||||
rip.put(RIP_CODCOSTO, parametro.get(0));
|
||||
rip.put(RIP_CODCMS, parametro.get());
|
||||
|
||||
TString16 chiave;
|
||||
if (rip.read() == NOERR)
|
||||
chiave << "B|" << rip.get(RIP_CODICE);
|
||||
|
||||
TRecord_array* rows = new TRecord_array(chiave, LF_RRIP);
|
||||
|
||||
return (TObject*)rows;
|
||||
}
|
||||
|
||||
const TRecord_array& TCache_ripartizioni::righe(const char* costo, const char* commessa)
|
||||
{
|
||||
TToken_string parametro;
|
||||
parametro << costo << '|' << commessa;
|
||||
return *(const TRecord_array*)objptr(parametro);
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------
|
||||
// APPLICAZIONE
|
||||
//--------------------------------------------------------------------
|
||||
@ -234,7 +197,7 @@ bool TRib_movanal_app::explode_rows(const TRecord_array& input_rows, TRecord_arr
|
||||
// Calcolo tutte le percentuali da ripartire
|
||||
int i;
|
||||
for (i = 1; i <= rrip.rows(); i++)
|
||||
distrib.add(rrip[i].get_real("RIPARTO"));
|
||||
distrib.add(rrip[i].get_real(RRIP_RIPARTO));
|
||||
|
||||
for (i = 1; i <= rrip.rows(); i++)
|
||||
{
|
||||
|
365
ca/cacnv.cpp
365
ca/cacnv.cpp
@ -1,5 +1,7 @@
|
||||
#include <applicat.h>
|
||||
#include <assoc.h>
|
||||
#include <confapp.h>
|
||||
#include <execp.h>
|
||||
#include <progind.h>
|
||||
#include <relation.h>
|
||||
#include <tabutil.h>
|
||||
@ -13,11 +15,10 @@
|
||||
#include "../cg/cg2101.h"
|
||||
#include "calib01.h"
|
||||
|
||||
#include "cdc.h"
|
||||
//#include "cms.h"
|
||||
|
||||
#include "movana.h"
|
||||
#include "rmovana.h"
|
||||
#include "rip.h"
|
||||
#include "rrip.h"
|
||||
|
||||
#include "cacnva.h"
|
||||
|
||||
@ -35,10 +36,12 @@ public:
|
||||
};
|
||||
|
||||
//----------------------------------------------------------
|
||||
// MASCHERA COVERSIONE MOVIMENTI
|
||||
// MASCHERA COVERSIONE
|
||||
//----------------------------------------------------------
|
||||
class TConversione_anal_msk : public TAutomask
|
||||
{
|
||||
TConfig_anal _config_anal;
|
||||
|
||||
protected:
|
||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||
|
||||
@ -48,10 +51,30 @@ public:
|
||||
|
||||
bool TConversione_anal_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||
{
|
||||
// switch (o.dlg())
|
||||
// {
|
||||
// default: break;
|
||||
// }
|
||||
switch (o.dlg())
|
||||
{
|
||||
case F_DATAINI:
|
||||
if (e == fe_modify || e == fe_close)
|
||||
{
|
||||
//controllo sulla data attivazione Contabilita' analitica nel file di configurazione
|
||||
const TDate data_att = _config_anal.get("DtAttCa");
|
||||
if (data_att.ok())
|
||||
{
|
||||
const TDate& dataini = get_date(F_DATAINI);
|
||||
if (dataini < data_att)
|
||||
return error_box(TR("La data inizio non puo' essere antecedente la data di attivazione"));
|
||||
}
|
||||
}
|
||||
break;
|
||||
case F_TIPOCONV:
|
||||
if (e == fe_modify)
|
||||
{
|
||||
const TDate data_att = _config_anal.get("DtAttCa");
|
||||
set(F_DATAINI, data_att);
|
||||
}
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
//----------------------------------------------------------
|
||||
@ -60,48 +83,75 @@ bool TConversione_anal_msk::on_field_event(TOperable_field& o, TField_event e, l
|
||||
|
||||
class TConversione_cm2ca : public TSkeleton_application
|
||||
{
|
||||
int _nconv;
|
||||
virtual const char * extra_modules() const {return "cm";} //funziona anche con autorizzazione CM
|
||||
TCache_ripartizioni _cache_rip;
|
||||
TConfig_anal* _config_anal;
|
||||
|
||||
protected:
|
||||
virtual void main_loop();
|
||||
void create_new_movana(long numreg_cg, bool definitiva);
|
||||
void create_new_movana(long numreg_cg, bool definitiva, TAssoc_array& cg_lines_to_anal);
|
||||
bool test_configuration();
|
||||
void TConversione_cm2ca::ripartisci(TRectype& recpcon);
|
||||
|
||||
public:
|
||||
bool convert_clerks();
|
||||
bool convert_phases();
|
||||
bool set_anal();
|
||||
bool convert_movs();
|
||||
bool convert_movs(TConversione_anal_msk& mask);
|
||||
|
||||
TConversione_cm2ca() {}
|
||||
~TConversione_cm2ca() {}
|
||||
};
|
||||
|
||||
bool TConversione_cm2ca::test_configuration()
|
||||
{
|
||||
const TString& first_level = _config_anal->get("Level(1)");
|
||||
return first_level.not_empty();
|
||||
}
|
||||
|
||||
//gestione del menu (vari tipi di conversione)
|
||||
void TConversione_cm2ca::main_loop()
|
||||
{
|
||||
_nconv = abs(atoi(argv(1)));
|
||||
_config_anal = new TConfig_anal;
|
||||
|
||||
switch (_nconv)
|
||||
TConversione_anal_msk mask;
|
||||
while (mask.run() == K_ENTER)
|
||||
{
|
||||
case 0:
|
||||
if (mask.get_bool(F_TABELLE))
|
||||
{
|
||||
if (set_anal()) //setta il flag anal nel pcon
|
||||
if (set_anal()) //setta il flag anal nel pcon
|
||||
{
|
||||
convert_clerks(); //da tabella cms a commesse
|
||||
convert_phases(); //da tabella fsc a fasi
|
||||
}
|
||||
}
|
||||
|
||||
if (mask.get_bool(F_MOVIMENTI))
|
||||
{
|
||||
//controlla se compilata la configurazione della CA dul ditta.ini
|
||||
bool ok = test_configuration();
|
||||
if (!ok)
|
||||
{
|
||||
if (yesno_box(TR("Per procedere alla conversione e' necessario avere configurato\nla Contabilita' Analitica\nSi desidera procedere alla configurazione?")))
|
||||
{
|
||||
convert_clerks(); //da tabella cms a commesse
|
||||
convert_phases(); //da tabella fsc a fasi
|
||||
TExternal_app app("ca0 -2");
|
||||
app.run();
|
||||
ok = test_configuration();
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
convert_movs(); //converte i movimenti di contabilita' (da CG a CA)
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
//solo se e' stata fatta la configurazione minima e' possibile procedere alla conversione
|
||||
if (ok)
|
||||
convert_movs(mask); //converte i movimenti di contabilita' (da CG a CA)
|
||||
} //end get_bool(F_MOVIMENTI)
|
||||
} //end while
|
||||
|
||||
delete _config_anal;
|
||||
}
|
||||
|
||||
|
||||
//-------------------------------------------------
|
||||
// ** TRASFERIMENTO DATI COMMESSE/FASI **
|
||||
//-------------------------------------------------
|
||||
//------------------------------------------------------------------------------------------------
|
||||
// trasferisce i dati dalle tabelle Commesse e Fasi ai nuovi file di analitica (COMMESSE e FASI)
|
||||
//------------------------------------------------------------------------------------------------
|
||||
@ -156,6 +206,12 @@ bool TConversione_cm2ca::convert_clerks()
|
||||
|
||||
bool TConversione_cm2ca::convert_phases()
|
||||
{
|
||||
//se sono gia' state configurate le fasi nel ditta.ini non procede oltre!
|
||||
//fara' la conversione delle fasi nel trasferimento dei movimenti
|
||||
const TString& fathfasi = _config_anal->get( "FathFasi");
|
||||
if (fathfasi.not_empty())
|
||||
return false;
|
||||
|
||||
TLocalisamfile fasi(LF_FASI);
|
||||
const long items = fasi.items();
|
||||
if (items > 0)
|
||||
@ -183,37 +239,6 @@ bool TConversione_cm2ca::convert_phases()
|
||||
TRelation* relazione = NULL;
|
||||
TCursor* cursore = NULL;
|
||||
|
||||
//se sono gia' state configurate le fasi nel ditta.ini...
|
||||
/* TConfig config(CONFIG_DITTA, "ca");
|
||||
const TString& fathfasi = config.get( "FathFasi", "ca");
|
||||
|
||||
if (fathfasi == "CDC")
|
||||
{
|
||||
TLocalisamfile cdc(LF_CDC); //devono gia' essere stati creati i files dell'analitica
|
||||
if (cdc.first() == NOERR) //se il file del piano dei conti ha almeno un record...
|
||||
{
|
||||
relazione = new TRelation(LF_CDC);
|
||||
cursore = new TCursor(relazione);
|
||||
}
|
||||
}
|
||||
else if (fathfasi == "CMS")
|
||||
{
|
||||
TLocalisamfile cms(LF_COMMESSE); //devono gia' essere stati creati i files dell'analitica
|
||||
if (cms.first() == NOERR) //se il file del piano dei conti ha almeno un record...
|
||||
{
|
||||
relazione = new TRelation(LF_COMMESSE);
|
||||
cursore = new TCursor(relazione);
|
||||
}
|
||||
}
|
||||
|
||||
TRecnotype items = 0;
|
||||
if (cursore !=NULL)
|
||||
{
|
||||
items = cursore->items();
|
||||
cursore->freeze();
|
||||
}
|
||||
|
||||
*/
|
||||
for (curfsc = 0; curfsc.pos() < nrectab; ++curfsc)
|
||||
{
|
||||
pi.addstatus(1);
|
||||
@ -224,45 +249,57 @@ bool TConversione_cm2ca::convert_phases()
|
||||
fasi_rec.put("DESCRIZ", fsc.get("S0"));
|
||||
fasi.write();
|
||||
}
|
||||
/* else
|
||||
{
|
||||
TString80 codice;
|
||||
const TRectype& rec = cursore->curr();
|
||||
for (*cursore = 0; cursore->pos() < items; ++*cursore)
|
||||
{
|
||||
switch (rec.num())
|
||||
{
|
||||
case LF_CDC:
|
||||
codice = rec.get(CDC_CODCOSTO);
|
||||
break;
|
||||
case LF_CMS:
|
||||
codice = rec.get("CODCMS");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
fasi_rec.zero();
|
||||
fasi_rec.put("CODCMSFAS", codice);
|
||||
fasi_rec.put("CODFASE", fsc.get("CODTAB"));
|
||||
fasi_rec.put("DESCRIZ", fsc.get("S0"));
|
||||
fasi.write();
|
||||
}
|
||||
}*/
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------------------------
|
||||
// mette il flag di ANALITICA nei gr.co.stc. aventi codcms e/o codfsc
|
||||
//------------------------------------------------------------------------------------------------
|
||||
void TConversione_cm2ca::ripartisci(TRectype& recpcon)
|
||||
{
|
||||
const int gruppo = recpcon.get_int(PCN_GRUPPO);
|
||||
const int conto = recpcon.get_int(PCN_CONTO);
|
||||
const long sottoconto = recpcon.get_long(PCN_SOTTOCONTO);
|
||||
const TString80 codcms = recpcon.get(PCN_CODCMS);
|
||||
const TString16 fascms = recpcon.get(PCN_FASCMS);
|
||||
|
||||
//cerca nel file rip se esiste gia' un record con la medesima chiave (chiave 3!!)
|
||||
TLocalisamfile rip_file(LF_RIP);
|
||||
rip_file.setkey(3);
|
||||
|
||||
rip_file.put(RIP_TIPO, "I");
|
||||
rip_file.put(RIP_GRUPPO, gruppo);
|
||||
rip_file.put(RIP_CONTO, conto);
|
||||
rip_file.put(RIP_SOTTOCONTO, sottoconto);
|
||||
|
||||
if (rip_file.read() != NOERR)
|
||||
{
|
||||
TAnal_rip rip;
|
||||
|
||||
rip.head().put(RIP_TIPO, "I");
|
||||
rip.put(RIP_GRUPPO, gruppo);
|
||||
rip.put(RIP_CONTO, conto);
|
||||
rip.put(RIP_SOTTOCONTO, sottoconto);
|
||||
|
||||
|
||||
TRectype& rrip = rip.new_row();
|
||||
rrip.put(RRIP_RIPARTO, 100);
|
||||
rrip.put(RRIP_CODCMS, codcms);
|
||||
rrip.put(RRIP_CODFASE, fascms);
|
||||
|
||||
rip.write(); //scrive sia rip che rrip con nuova chiave 1 (TIPO+CODICE)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool TConversione_cm2ca::set_anal()
|
||||
{
|
||||
TRelation relpcon(LF_PCON);
|
||||
TCursor curpcon(&relpcon);
|
||||
TRectype& recpcon = relpcon.curr();
|
||||
|
||||
if (!recpcon.exist("ANALITICA")) //check se gia' avvenuta la conversione con aggiunta del campo ANAL
|
||||
if (!recpcon.exist(PCN_ANALITICA)) //check se gia' avvenuta la conversione con aggiunta del campo ANAL
|
||||
return error_box(TR("Prima del controllo e' necessario eseguire una conversione archivi"));
|
||||
else
|
||||
{
|
||||
@ -272,20 +309,26 @@ bool TConversione_cm2ca::set_anal()
|
||||
for (curpcon = 0; curpcon.pos() < nrecpcon; ++curpcon)
|
||||
{
|
||||
pi.addstatus(1);
|
||||
if (recpcon.get("CODCMS").not_empty() || recpcon.get("FASCMS").not_empty())
|
||||
if (recpcon.get(PCN_CODCMS).not_empty() || recpcon.get(PCN_FASCMS).not_empty())
|
||||
{
|
||||
recpcon.put("ANALITICA", "X");
|
||||
recpcon.put(PCN_ANALITICA, "X");
|
||||
relpcon.rewrite();
|
||||
//deve creare una testata e una riga di ripartizione (se non esistono con lo stesso gr/co/sott)
|
||||
ripartisci(recpcon);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
//----------------------------------------------------------
|
||||
// ** CONVERSIONE MOVIMENTI CONTABILI **
|
||||
//----------------------------------------------------------
|
||||
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
// trasferisce i movimenti e le righe relative (MOV,RMOV) nei nuovi file di analitica (MOVANA,RMOVANA)
|
||||
// ---------------------------------------------------------------------------------------------------
|
||||
void TConversione_cm2ca::create_new_movana(long numreg_cg, bool definitiva)
|
||||
void TConversione_cm2ca::create_new_movana(long numreg_cg, bool definitiva, TAssoc_array& cg_lines_to_anal)
|
||||
{
|
||||
TAnal_mov analmov;
|
||||
//riempie le righe di testata
|
||||
@ -303,13 +346,14 @@ void TConversione_cm2ca::create_new_movana(long numreg_cg, bool definitiva)
|
||||
analmov.put(MOVANA_TIPODOC, mov_head.get(MOV_TIPODOC));
|
||||
analmov.put(MOVANA_DESCR, mov_head.get(MOV_DESCR));
|
||||
analmov.put(MOVANA_CODCAUS, mov_head.get(MOV_CODCAUS));
|
||||
analmov.put(MOVANA_TIPOMOV, ""); //deve mettere sempre 0
|
||||
analmov.put(MOVANA_TIPOMOV, "T"); //deve mettere sempre "Temporaneo"
|
||||
//MOVANA_TOTDOC e' il totale di tutte le sue righe;ancora non si conosce
|
||||
|
||||
//deve scorrere tutte le righe del movimento e sommare gli importi di quelle che hanno la
|
||||
//stessa chiave CODCMS+CODFSC
|
||||
TAssoc_array righe_cms;
|
||||
TToken_string chiave;
|
||||
|
||||
//scansione righe movimentoPN
|
||||
for (int l = 0; l < mov.cg_items(); l++)
|
||||
{
|
||||
@ -317,11 +361,12 @@ void TConversione_cm2ca::create_new_movana(long numreg_cg, bool definitiva)
|
||||
chiave = "";
|
||||
chiave.add(rmov.get(RMV_CODCMS));
|
||||
chiave.add(rmov.get(RMV_FASCMS));
|
||||
|
||||
if (!chiave.empty_items() && rmov.get(RMV_ROWTYPE) != "T")
|
||||
{
|
||||
//alla chiave va aggiunto il vecchio gr/co/stc
|
||||
TString16 conto_cg;
|
||||
conto_cg.format("%03d%03d%06ld", rmov.get_int(RMV_GRUPPO), rmov.get_int(RMV_CONTO), rmov.get_long(RMV_SOTTOCONTO));
|
||||
conto_cg.format("%03d|%03d|%06ld", rmov.get_int(RMV_GRUPPO), rmov.get_int(RMV_CONTO), rmov.get_long(RMV_SOTTOCONTO));
|
||||
chiave.add(conto_cg);
|
||||
TImporto_descritto* importo = (TImporto_descritto*)righe_cms.objptr(chiave);
|
||||
if (importo == NULL) //la chiave non esisteva nell'assoc
|
||||
@ -332,31 +377,84 @@ void TConversione_cm2ca::create_new_movana(long numreg_cg, bool definitiva)
|
||||
const char sezione = rmov.get_char(RMV_SEZIONE);
|
||||
const real valore = rmov.get(RMV_IMPORTO);
|
||||
*importo += TImporto(sezione, valore); //crea un importo e lo somma a quello dell'array
|
||||
|
||||
//aggiunge gr/co/sottoc all'assoc_array dei conti da trasformare in analitici sul piano dei conti
|
||||
cg_lines_to_anal.add(conto_cg, NULL);
|
||||
}
|
||||
}
|
||||
//scansione dell Assoc_array che adesso contiene le nuove righe del movimento di analitica
|
||||
|
||||
TImporto importone;
|
||||
FOR_EACH_ASSOC_OBJECT(righe_cms, h, k, a)
|
||||
|
||||
FOR_EACH_ASSOC_OBJECT(righe_cms, m, n, a) //giro sull'assoc array delle righe movimento da trasferire
|
||||
{
|
||||
TRectype& analriga = analmov.new_row();
|
||||
analriga.put(RMOVANA_ANNOES, analmov.get(MOVANA_ANNOES));
|
||||
analriga.put(RMOVANA_DATAREG, analmov.get(MOVANA_DATAREG));
|
||||
|
||||
//deve prendere la sezione dell'importo di ogni riga
|
||||
TImporto_descritto* importo = (TImporto_descritto*)a;
|
||||
importo->normalize();
|
||||
analriga.put(RMOVANA_SEZIONE, importo->sezione());
|
||||
analriga.put(RMOVANA_IMPORTO, importo->valore());
|
||||
analriga.put(RMOVANA_DESCR, importo->descrizione());
|
||||
TImporto_descritto& importo = *(TImporto_descritto*)a;
|
||||
importo.normalize();
|
||||
importone += importo;
|
||||
|
||||
importone += *importo;
|
||||
|
||||
chiave = k;
|
||||
analriga.put(RMOVANA_CODCMS, chiave.get(0));
|
||||
analriga.put(RMOVANA_CODFASE, chiave.get(1));
|
||||
analriga.put(RMOVANA_CODCONTO, chiave.get(2));
|
||||
chiave = n; //chiave = commessa|fase|gruppo|conto|sottoconto
|
||||
const int gruppo = chiave.get_int(2);
|
||||
const int conto = chiave.get_int();
|
||||
const long sottoconto = chiave.get_long();
|
||||
//controlla se il gr/co/stc del movimento deve essere ripartito;in caso affermativo procede
|
||||
//alla ripartizione delle righe del movimento
|
||||
const TRecord_array& righe_ripartizione = _cache_rip.righe(gruppo, conto, sottoconto);
|
||||
|
||||
if (righe_ripartizione.rows() > 0) //ci sono righe ripartizione: da 1 riga mov CG a N righe mov CA
|
||||
{
|
||||
// Importo totale da distribuire arrotondato ai decimali della valuta di conto
|
||||
TGeneric_distrib distrib(importo.valore(), TCurrency::get_firm_dec());
|
||||
|
||||
// Calcolo tutte le percentuali da ripartire
|
||||
int i;
|
||||
for (i = 1; i <= righe_ripartizione.rows(); i++)
|
||||
distrib.add(righe_ripartizione[i].get_real(RRIP_RIPARTO));
|
||||
|
||||
for (i = 1; i <= righe_ripartizione.rows(); i++)
|
||||
{
|
||||
const TRectype& rrip = righe_ripartizione.row(i);
|
||||
|
||||
TRectype& analriga = analmov.new_row();
|
||||
const real imp = distrib.get(); // Legge la quota da distribuire
|
||||
analriga.put(RMOVANA_SEZIONE, importo.sezione());
|
||||
analriga.put(RMOVANA_IMPORTO, imp); //e la mette nella nuova riga
|
||||
analriga.put(RMOVANA_DESCR, importo.descrizione());
|
||||
|
||||
analriga.put(RMOVANA_ANNOES, analmov.get(MOVANA_ANNOES));
|
||||
analriga.put(RMOVANA_DATAREG, analmov.get(MOVANA_DATAREG));
|
||||
|
||||
//parametri da prendere dalle righe ripartizione!!
|
||||
analriga.put(RMOVANA_CODCCOSTO, rrip.get(RRIP_CODCOSTO));
|
||||
analriga.put(RMOVANA_CODCMS, rrip.get(RRIP_CODCMS));
|
||||
analriga.put(RMOVANA_CODFASE, rrip.get(RRIP_CODFASE));
|
||||
analriga.put(RMOVANA_CODCONTO, rrip.get(RRIP_CODCONTO));
|
||||
}
|
||||
}
|
||||
else //nessuna riga ripartizione -> da 1 riga movimento CG ad 1 riga movimento CA
|
||||
{
|
||||
if (_config_anal->get_bool("UsePdcc"))
|
||||
{
|
||||
TRectype& analriga = analmov.new_row();
|
||||
|
||||
analriga.put(RMOVANA_SEZIONE, importo.sezione());
|
||||
analriga.put(RMOVANA_IMPORTO, importo.valore());
|
||||
analriga.put(RMOVANA_DESCR, importo.descrizione());
|
||||
|
||||
analriga.put(RMOVANA_ANNOES, analmov.get(MOVANA_ANNOES));
|
||||
analriga.put(RMOVANA_DATAREG, analmov.get(MOVANA_DATAREG));
|
||||
|
||||
analriga.put(RMOVANA_CODCMS, chiave.get(0));
|
||||
analriga.put(RMOVANA_CODFASE, chiave.get(1));
|
||||
|
||||
TString16 codconto;
|
||||
codconto.format("%03d%03d%06ld", gruppo, conto, sottoconto);
|
||||
analriga.put(RMOVANA_CODCONTO, codconto);
|
||||
}
|
||||
else //qui va aggiunta la lista dei conti che non hanno ripartizione
|
||||
error_box(TR("Manca la ripartizione di un conto"));
|
||||
}
|
||||
}
|
||||
|
||||
//e alla fine riesce a mettere anche l'importone in testata
|
||||
importone.normalize(); //x evitare problemi di segno...
|
||||
analmov.put(MOVANA_SEZIONE, importone.sezione());
|
||||
@ -465,6 +563,7 @@ void TConversione_cm2ca::create_new_movana(long numreg_cg, bool definitiva)
|
||||
}
|
||||
}
|
||||
mov.destroy_iva_row(-1);
|
||||
|
||||
FOR_EACH_ARRAY_ITEM(iva_records, iva_i, iva_obj)
|
||||
{
|
||||
mov.iva(iva_i) = *(TRectype*)iva_obj;
|
||||
@ -475,25 +574,21 @@ void TConversione_cm2ca::create_new_movana(long numreg_cg, bool definitiva)
|
||||
}
|
||||
}
|
||||
|
||||
bool TConversione_cm2ca::convert_movs()
|
||||
bool TConversione_cm2ca::convert_movs(TConversione_anal_msk& mask)
|
||||
{
|
||||
TConversione_anal_msk msk;
|
||||
msk.run();
|
||||
//scandisce il file RMOV,alla ricerca dei record con codice fase o codice commessa compilato
|
||||
TRelation rel_rmov(LF_RMOV);
|
||||
const bool definitiva = msk.get_int(F_TIPOCONV) != 0;
|
||||
const bool definitiva = mask.get_int(F_TIPOCONV) != 0;
|
||||
//costruzione filtro con date (in caso di conversione provvisoria)
|
||||
TString filtro;
|
||||
filtro << "((CODCMS!='')||(FASCMS!=''))&&(ROWTYPE!='T')";
|
||||
if (!definitiva)
|
||||
{
|
||||
const TDate dataini = msk.get_date(F_DATAINI);
|
||||
if (dataini.ok())
|
||||
filtro << "&&(ANSI(DATAREG)>=" << dataini.string(ANSI) << ")";
|
||||
const TDate datafin = msk.get_date(F_DATAFIN);
|
||||
if (datafin.ok())
|
||||
filtro << "&&(ANSI(DATAREG)<=" << datafin.string(ANSI) << ")";
|
||||
}
|
||||
|
||||
const TDate dataini = mask.get_date(F_DATAINI);
|
||||
if (dataini.ok())
|
||||
filtro << "&&(ANSI(DATACOMP)>=" << dataini.string(ANSI) << ")";
|
||||
const TDate datafin = mask.get_date(F_DATAFIN);
|
||||
if (datafin.ok())
|
||||
filtro << "&&(ANSI(DATACOMP)<=" << datafin.string(ANSI) << ")";
|
||||
|
||||
TCursor cur_rmov(&rel_rmov, filtro);
|
||||
TRectype& rec_rmov = rel_rmov.curr();
|
||||
@ -504,6 +599,9 @@ bool TConversione_cm2ca::convert_movs()
|
||||
TProgind pi(rmov_items, "Trasferimento righe movimenti", false);
|
||||
|
||||
long last_numreg_cg = 0; //numero registrazione originaria
|
||||
|
||||
TAssoc_array cg_lines_to_anal; //record array da riempire con gr/co/sott delle righe trasferite
|
||||
|
||||
for (cur_rmov = 0; cur_rmov.pos() < rmov_items; ++cur_rmov)
|
||||
{
|
||||
pi.addstatus(1);
|
||||
@ -511,13 +609,36 @@ bool TConversione_cm2ca::convert_movs()
|
||||
if (curr_numreg_cg != last_numreg_cg)
|
||||
{
|
||||
//se il numreg di questa riga e' nuovo -> crea un nuovo movimento di analitica (testata)
|
||||
create_new_movana(curr_numreg_cg, definitiva);
|
||||
create_new_movana(curr_numreg_cg, definitiva, cg_lines_to_anal);
|
||||
last_numreg_cg = curr_numreg_cg;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//aggiorna il piano dei conti flaggando i conti "analitici"
|
||||
if (cg_lines_to_anal.items() > 0)
|
||||
{
|
||||
TLocalisamfile pcon(LF_PCON);
|
||||
|
||||
FOR_EACH_ASSOC_OBJECT(cg_lines_to_anal, h, k, object)
|
||||
{
|
||||
TToken_string tok = k;
|
||||
const int gruppo = tok.get_int(0);
|
||||
const int conto = tok.get_int(1);
|
||||
const long sottoconto = tok.get_long(2);
|
||||
//cerca il record con gr/co/sottoc sul file del piano dei conti...
|
||||
pcon.put(PCN_GRUPPO, gruppo);
|
||||
pcon.put(PCN_CONTO, conto);
|
||||
pcon.put(PCN_SOTTOCONTO, sottoconto);
|
||||
//..se lo trova e non e' gia' anale...
|
||||
if (pcon.read() == NOERR && !pcon.get_bool(PCN_ANALITICA))
|
||||
{
|
||||
pcon.put(PCN_ANALITICA, "X"); //..lo analizza!..
|
||||
pcon.rewrite(); //..e lo riscrive
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -1,4 +1,6 @@
|
||||
// campi maschera cacnva.uml
|
||||
#define F_TIPOCONV 101
|
||||
#define F_DATAINI 102
|
||||
#define F_DATAFIN 103
|
||||
#define F_TABELLE 101
|
||||
#define F_MOVIMENTI 102
|
||||
#define F_TIPOCONV 103
|
||||
#define F_DATAINI 104
|
||||
#define F_DATAFIN 105
|
||||
|
@ -14,26 +14,52 @@ END
|
||||
|
||||
ENDPAGE
|
||||
|
||||
PAGE "Conversione movimenti contabili" 0 0 64 12
|
||||
PAGE "Conversione CG/CA" 0 0 64 12
|
||||
|
||||
GROUPBOX DLG_NULL 78 4
|
||||
BEGIN
|
||||
PROMPT 1 1 "@bElementi da elaborare"
|
||||
END
|
||||
|
||||
BOOLEAN F_TABELLE
|
||||
BEGIN
|
||||
PROMPT 2 2 "Trasferimento tabelle commesse e fasi"
|
||||
END
|
||||
|
||||
BOOLEAN F_MOVIMENTI
|
||||
BEGIN
|
||||
PROMPT 2 3 "Conversione movimenti di contabilita'"
|
||||
MESSAGE FALSE HIDE,1@|CLEAR,1@
|
||||
MESSAGE TRUE SHOW,1@|ENABLE,1@
|
||||
END
|
||||
|
||||
GROUPBOX DLG_NULL 78 7
|
||||
BEGIN
|
||||
PROMPT 1 6 "@bConversione movimenti"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
RADIOBUTTON F_TIPOCONV 36
|
||||
BEGIN
|
||||
PROMPT 1 2 "@bTipo conversione"
|
||||
PROMPT 2 7 "Tipo conversione"
|
||||
ITEM "0|Provvisoria"
|
||||
MESSAGE ENABLE,F_DATAINI|ENABLE,F_DATAFIN
|
||||
ITEM "1|Definitiva"
|
||||
MESSAGE CLEAR,F_DATAINI|CLEAR,F_DATAFIN
|
||||
MESSAGE DISABLE,F_DATAINI|CLEAR,F_DATAFIN
|
||||
FLAGS "Z"
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
DATA F_DATAINI
|
||||
BEGIN
|
||||
PROMPT 2 6 "Da data "
|
||||
PROMPT 2 10 "Da data "
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
DATA F_DATAFIN
|
||||
BEGIN
|
||||
PROMPT 2 7 "A data "
|
||||
PROMPT 2 11 "A data "
|
||||
GROUP 1
|
||||
END
|
||||
|
||||
ENDPAGE
|
||||
|
@ -1,4 +1,6 @@
|
||||
#include <currency.h>
|
||||
#include <dongle.h>
|
||||
#include <modaut.h>
|
||||
#include <tree.h>
|
||||
#include <pconti.h>
|
||||
|
||||
@ -7,8 +9,46 @@
|
||||
|
||||
#include "movana.h"
|
||||
#include "rmovana.h"
|
||||
#include "rip.h"
|
||||
#include "rrip.h"
|
||||
#include "saldana.h"
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TConfig_anal
|
||||
///////////////////////////////////////////////////////////
|
||||
TConfig_anal::TConfig_anal() : TConfig(CONFIG_DITTA, "ca"), _has_ca(dongle().active(CAAUT))
|
||||
{
|
||||
}
|
||||
|
||||
const TString& TConfig_anal::get(const char* var, const char* section, int index, const char* def)
|
||||
{
|
||||
if (_has_ca)
|
||||
return TConfig::get(var, section, index, def);
|
||||
|
||||
//se il valore della variabile sul .ini e' vuoto controlla se e' possibile assegnarlo di default
|
||||
TString& tmp = get_tmp_string();
|
||||
if (var == "AttFasi")
|
||||
tmp = "X"; else
|
||||
if (var == "FathFasi")
|
||||
tmp = "CMS"; else
|
||||
if (var == "Level(1)")
|
||||
tmp = "CMS"; else
|
||||
if (var == "Cms(1)")
|
||||
tmp = "LLLLLLLLLLLLLLLLLLLL"; else
|
||||
if (var == "CmsDes(1)")
|
||||
tmp = "Commessa"; else
|
||||
if (var == "Fsc(1)")
|
||||
tmp = "LLLLLLLLLL"; else
|
||||
if (var == "FscDes(1)")
|
||||
tmp == "Fase"; else
|
||||
if (var == "EdMask")
|
||||
tmp = "ca0300a"; else
|
||||
if (var == "UsePdcc")
|
||||
tmp = "X";
|
||||
|
||||
return tmp;
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TMultilevel_code_info
|
||||
///////////////////////////////////////////////////////////
|
||||
@ -1186,5 +1226,62 @@ TAnal_mov::TAnal_mov(long numreg) : TMultiple_rectype(LF_MOVANA)
|
||||
read(numreg);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAnal_rip
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
TAnal_rip::TAnal_rip() : TMultiple_rectype(LF_RIP)
|
||||
{
|
||||
add_file(LF_RRIP, RRIP_NRIGA);
|
||||
}
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TCache_ripartizioni
|
||||
///////////////////////////////////////////////////////////
|
||||
TObject* TCache_ripartizioni::key2obj(const char* key)
|
||||
{
|
||||
TToken_string parametro(key);
|
||||
TLocalisamfile rip(LF_RIP);
|
||||
const int nkey = parametro.get_int(0);
|
||||
rip.setkey(nkey);
|
||||
rip.put(RIP_TIPO, "B");
|
||||
|
||||
switch (nkey)
|
||||
{
|
||||
case 3: //chiave 3 (tipo+gr/co/stc)
|
||||
rip.put(RIP_GRUPPO, parametro.get(1));
|
||||
rip.put(RIP_CONTO, parametro.get());
|
||||
rip.put(RIP_SOTTOCONTO, parametro.get());
|
||||
break;
|
||||
case 4: //chiave 4 (tipo+codcosto+codcms)
|
||||
rip.put(RIP_CODCOSTO, parametro.get(1));
|
||||
rip.put(RIP_CODCMS, parametro.get());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
TString80 chiave;
|
||||
if (rip.read() == NOERR)
|
||||
chiave << "B|" << rip.get(RIP_CODICE);
|
||||
|
||||
TRecord_array* rows = new TRecord_array(chiave, LF_RRIP);
|
||||
|
||||
return (TObject*)rows;
|
||||
}
|
||||
|
||||
const TRecord_array& TCache_ripartizioni::righe(const char* costo, const char* commessa)
|
||||
{
|
||||
TToken_string parametro;
|
||||
parametro <<"4|" << costo << '|' << commessa; //per chiave 4
|
||||
return *(const TRecord_array*)objptr(parametro);
|
||||
}
|
||||
|
||||
|
||||
const TRecord_array& TCache_ripartizioni::righe(const int gruppo, const int conto, const long sottoconto)
|
||||
{
|
||||
TToken_string parametro;
|
||||
parametro << "3|" << gruppo << '|' << conto << '|' << sottoconto; //per chiave 3
|
||||
return *(const TRecord_array*)objptr(parametro);
|
||||
}
|
||||
|
40
ca/calib01.h
40
ca/calib01.h
@ -135,4 +135,44 @@ public:
|
||||
TAnal_mov(long numreg = 0);
|
||||
};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TAnal_rip
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TAnal_rip : public TMultiple_rectype
|
||||
{
|
||||
|
||||
public:
|
||||
TAnal_rip();
|
||||
};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TCache_ripartizioni
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TCache_ripartizioni : public TCache
|
||||
{
|
||||
protected:
|
||||
virtual TObject* key2obj(const char* key);
|
||||
|
||||
public:
|
||||
const TRecord_array& righe(const char* costo, const char* commessa);
|
||||
const TRecord_array& righe(const int gruppo, const int conto, const long sottoconto);
|
||||
};
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////
|
||||
// TConfig_anal
|
||||
///////////////////////////////////////////////////////////
|
||||
|
||||
class TConfig_anal : public TConfig
|
||||
{
|
||||
bool _has_ca;
|
||||
public:
|
||||
virtual const TString& get(const char* var, const char* section = NULL, int index = -1, const char* def = "");
|
||||
TConfig_anal();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -1,3 +1,3 @@
|
||||
107
|
||||
0
|
||||
$movana|1|2|152|0|Movimenti di Analitica|||
|
||||
$movana|0|0|152|0|Movimenti di Analitica|||
|
||||
|
@ -10,7 +10,7 @@ NUMDOC|1|7|0|Numero documento
|
||||
TIPODOC|1|2|0|Tipo documento
|
||||
DESCR|1|50|0|Descrizione
|
||||
CODCAUS|1|3|0|Codice causale contabile
|
||||
TIPOMOV|1|1|0|Tipo movimento < >Normale, <P>reventivo, <V>ariazione preventivo
|
||||
TIPOMOV|1|1|0|Tipo movimento < >Normale, <P>reventivo, <V>ariazione preventivo, <T>Temporaneo
|
||||
CODVAL|1|3|0|Codice valuta
|
||||
DATACAM|5|8|0|Data del cambio
|
||||
CAMBIO|4|15|6|Cambio della valuta
|
||||
|
@ -8,7 +8,7 @@ SOTTOCONTO|3|6|0|Sottoconto
|
||||
CODCOSTO|1|20|0|Codice centro di costo
|
||||
CODCMS|1|20|0|Codice commessa
|
||||
DESCRIZ|1|50|0|Descrizione
|
||||
TIPORIP|1|1|0|Tipo ripartizione
|
||||
TIPORIP|1|1|0|Modalita' ripartizione (percentuale, quote, parti)
|
||||
4
|
||||
TIPO+CODICE|
|
||||
TIPO+DESCRIZ|X
|
||||
|
Loading…
x
Reference in New Issue
Block a user