Patch level :10.0

Files correlati     :ca0.exe,ca0900a.msk,ca3.exe,camenu.men
Ricompilazione Demo : [ ]
Commento            :
programma anti-angcas funzionante per il bilancio di commessa; da installare e provare a dinamica


git-svn-id: svn://10.65.10.50/branches/R_10_00@21381 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-12-29 14:38:38 +00:00
parent 0ac2834697
commit deca4a96c3
9 changed files with 332 additions and 122 deletions

View File

@ -5,7 +5,6 @@
#include "calib01.h"
#include "calibmsk.h"
#include "catbauc.h"
////////////////////////////////////////////////////////////////////////
//MASCHERA GENERICA DI TABELLA NON GERARCHICA
@ -176,7 +175,7 @@ void TTab_app_ca::common_mode(TMask& m, const bool mode_insert)
//Solo per tabella %AUC
//in ricerca semplice la ricerca viene fatta sulla tabella %AUC (quindi usa il campo F_AUC_CODICE)
//in inserimento la ricerca va fatta sul file USER (quindi usa il campo F_AUC_CODICE1)
if (get_tabname() == "%AUC")
/*if (get_tabname() == "%AUC")
{
if (mode_insert)
{
@ -188,7 +187,7 @@ void TTab_app_ca::common_mode(TMask& m, const bool mode_insert)
m.hide(F_AUC_CODICE1);
m.show(F_AUC_CODICE);
}
}
}*/
}
void TTab_app_ca::init_query_mode(TMask& m)

View File

@ -2,6 +2,7 @@
#include <automask.h>
#include <config.h>
#include <defmask.h>
#include <dongle.h>
#include <prefix.h>
#include <utility.h>
@ -45,9 +46,9 @@ void TGestione_permessi_CA_mask::ini2mask(const TString& username)
TConfig config(fileconf, username);
//filtri principali
set(F_CODCMS, config.get("Codcms"));
set(F_CDC, config.get("CdC"));
set(F_FASE, config.get("Fase"));
set(F_CODCMS, config.get("Cms"));
set(F_CDC, config.get("Cdc"));
set(F_FASE, config.get("Fas"));
//filtri secondari per programma
TSheet_field& sf_righe = sfield(F_RIGHE);
for (int i = 0; config.exist("Prog", NULL, i); i++)
@ -67,9 +68,9 @@ void TGestione_permessi_CA_mask::mask2ini()
TConfig config(fileconf, username);
//filtri principali
config.set("Codcms", get(F_CODCMS));
config.set("CdC", get(F_CDC));
config.set("Fase", get(F_FASE));
config.set("Cms", get(F_CODCMS));
config.set("Cdc", get(F_CDC));
config.set("Fas", get(F_FASE));
//filtri secondari per programma
TSheet_field& sf_righe = sfield(F_RIGHE);
FOR_EACH_SHEET_ROW(sf_righe, r, riga)
@ -140,7 +141,16 @@ void TGestione_permessi_CA::main_loop()
bool TGestione_permessi_CA::create()
{
return TSkeleton_application::create();
const TString& utente = user();
if (utente.compare(::dongle().administrator()) != 0)
{
TString msg;
msg << "Utente " << utente << " non autorizzato all'uso di questo programma!";
return error_box(msg);
}
return TSkeleton_application::create();
}
int ca0900 (int argc, char* argv[])

View File

@ -58,6 +58,7 @@ BEGIN
ITEM "Commesse@50"
ITEM "Cdc@50"
ITEM "Fasi@50"
FLAGS "|"
END
ENDPAGE
@ -76,32 +77,47 @@ END
TEXT -1
BEGIN
PROMPT 0 3 "Esempi"
PROMPT 0 3 "La variabile va indicata come $(CMS), $(CDC), $(FAS). Il valore va tra apici."
END
TEXT -1
BEGIN
PROMPT 0 4 "CODCMS=codicecommessa, CODCMS=cod*, CODCMS?=cod"
PROMPT 0 4 "Esempi"
END
TEXT -1
BEGIN
PROMPT 0 5 "CODCOSTO=codicecdc, CODCOSTO=cod*, CODCOSTO?=cod"
PROMPT 0 5 " ($(CMS)='codicecommessa')||($(CMS)?='cod*')"
END
TEXT -1
BEGIN
PROMPT 0 6 "CODFASE=codicefase, CODFASE=cod*, CODFASE?=cod"
PROMPT 0 6 " $(CDC)?='cod*'"
END
TEXT -1
BEGIN
PROMPT 0 7 "Nota: il filtro sulle fasi è applicabile solo se le fasi NON sono collegate a"
PROMPT 0 7 " ($(FAS)='codicefase1')&&($(FAS)='codicefase2')"
END
TEXT -1
BEGIN
PROMPT 0 8 "commesse e CdC in configurazione contabilità analitica"
PROMPT 0 8 "I valori sulla maschera principale si applicano a tutti i programmi che gestiscono Cms/CdC/Fasi"
END
TEXT -1
BEGIN
PROMPT 0 9 "I valori sullo sheet si applicano al solo programma indicato nel primo campo della riga: es. ca3 -7"
END
TEXT -1
BEGIN
PROMPT 0 10 "Nota: il filtro sulle fasi è applicabile solo se le fasi NON sono collegate a"
END
TEXT -1
BEGIN
PROMPT 0 11 "commesse e CdC in configurazione contabilità analitica!!!"
END
ENDPAGE

View File

@ -172,6 +172,12 @@ TPrint_bilancio_cms_mask::TPrint_bilancio_cms_mask()
} //for(int i=0..
} //if(levels>=2..
} //if(use_pdcc..
//filtro sui permessi utente (centro di costo e fase)
if (ca_create_user_select_clause(LF_CDC).full())
efield(F_CDC).browse()->cursor()->set_filterfunction(ca_filter_function);
if (ca_create_user_select_clause(LF_FASI).full())
efield(F_FASE).browse()->cursor()->set_filterfunction(ca_filter_function);
//***ACHTUNG!!!***
//Questa chiamata serve per generare i campi fase/commessa esattamente come strutturati nella configurazione..
@ -307,7 +313,15 @@ void TPrint_bilancio_cms::print_or_preview(const bool stampa)
//stampa tutte le fasi distinte in modo riassuntivo (crpa dedicate)
TString_array lista_fasi;
//crea un TString_array con tutte le fasi distinte non ripetute
TISAM_recordset file_fasi("USE FASI");
TString query;
query = "USE FASI";
const TString& select = ca_create_user_select_clause(LF_FASI);
if (select.full())
query << "\nSELECT " << select;
TISAM_recordset file_fasi(query);
for (TRecnotype j = 0; file_fasi.move_to(j); j++)
{
const TString16 curr_fase = file_fasi.get(FASI_CODFASE).as_string();
@ -340,7 +354,15 @@ void TPrint_bilancio_cms::print_or_preview(const bool stampa)
//stampa tutte le fasi distinte in modo riassuntivo (crpa dedicate)
TString_array lista_cdc;
//crea un TString_array con tutte le fasi distinte non ripetute
TISAM_recordset file_cdc("USE CDC");
TString query;
query = "USE CDC";
//filtra per utente se l'utente ha limitazioni sui CDC
const TString& select = ca_create_user_select_clause(LF_CDC);
if (select.full())
query << "\nSELECT " << select;
TISAM_recordset file_cdc(query);
for (TRecnotype j = 0; file_cdc.move_to(j); j++)
{
const TString& curr_cdc = file_cdc.get(CDC_CODCOSTO).as_string();

View File

@ -547,41 +547,66 @@ const TDate TPrint_saldana_recordset::calcola_min_datacomp(const TDate& datainie
}
//crea la query base per la scansione dei SALDANA; si usa nelle parse_saldana e parse_saldana_futuri
TString TPrint_saldana_recordset::crea_query_saldana()
const TString& TPrint_saldana_recordset::crea_select(const int logicnum)
{
TString query;
query = "USE SALDANA";
TString select = ca_create_user_select_clause(logicnum);
//void ca_append_and(TString& query, const TString& clause)
switch (_tipostampa)
{
case 0: break;
case 1:
case 4:
if (_fase.full())
query << " SELECT FASE=\"" << _fase << "\"";
{
TString clause;
clause << ca_dollar2fieldname(logicnum, "$(FAS)") << "=\"" << _fase << "\"";
ca_append_and(select, clause);
}
break;
case 2:
case 8:
if (_cdc.full())
query << " SELECT COSTO=\"" << _cdc << "\"";
{
TString clause;
clause << ca_dollar2fieldname(logicnum, "$(CDC)") << "=\"" << _cdc << "\"";
ca_append_and(select, clause);
}
break;
case 3:
if (_fase.full() || _cdc.full())
{
TString clause;
if (_fase.full() && _cdc.full())
query << " SELECT (FASE=\"" << _fase << "\")&&(COSTO=\"" << _cdc << "\")";
clause << "(" << ca_dollar2fieldname(logicnum, "$(FAS)") << "=\"" << _fase
<< "\")&&(" << ca_dollar2fieldname(logicnum, "$(CDC)") << "=\"" << _cdc << "\")";
else
{
if (_fase.full())
query << " SELECT FASE=\"" << _fase << "\"";
clause << ca_dollar2fieldname(logicnum, "$(FAS)") << "=\"" << _fase << "\"";
else
query << " SELECT COSTO=\"" << _cdc << "\"";
clause << ca_dollar2fieldname(logicnum, "$(CDC)") << "=\"" << _cdc << "\"";
}
ca_append_and(select, clause);
}
break;
}
return query;
return get_tmp_string() = select;
}
//crea la query base per la scansione dei SALDANA; si usa nelle parse_saldana e parse_saldana_futuri
const TString& TPrint_saldana_recordset::crea_query_saldana()
{
const TString& select = crea_select(LF_SALDANA);
TString query;
query = "USE SALDANA";
if (select.full())
query << " SELECT " << select;
return get_tmp_string() = query;
}
@ -615,7 +640,7 @@ void TPrint_saldana_recordset::parse_saldana(TAssoc_array* cms, const TDate& dat
if (_tipo == 9)
{
//non vanno considerati saldi di esercizi futuri a quello scelto!!!
query << "USE SALDANA";
query = "USE SALDANA";
}
TISAM_recordset saldana_set(query);
@ -974,37 +999,11 @@ void TPrint_saldana_recordset::parse_rmovana(TAssoc_array* cms, const TDate& dat
TString query;
query << "USE RMOVANA KEY 3\n";
switch (_tipostampa)
{
case 1:
case 4:
if (_fase.full())
query << "SELECT CODFASE=\"" << _fase << "\"\n";
break;
case 2:
case 8:
if (_cdc.full())
query << "SELECT CODCCOSTO=\"" << _cdc << "\"\n";
break;
case 3:
if (_fase.full() || _cdc.full())
{
if (_fase.full() && _cdc.full())
query << "SELECT (CODFASE=\"" << _fase << "\")&&(CODCCOSTO=\"" << _cdc << "\")\n";
else
{
if (_fase.full())
query << "SELECT CODFASE=\"" << _fase << "\"\n";
else
query << "SELECT CODCCOSTO=\"" << _cdc << "\"\n";
}
}
break;
default:
break;
}
const TString& select = crea_select(LF_RMOVANA);
if (select.full())
query << " SELECT " << select;
query << "JOIN MOVANA INTO NUMREG==NUMREG"
query << "\nJOIN MOVANA INTO NUMREG==NUMREG"
<< "\nFROM DATACOMP=#MINDATACOMP"
<< "\nTO DATACOMP=#DATACALCOLO";
TISAM_recordset recset(query);
@ -1066,36 +1065,12 @@ void TPrint_saldana_recordset::parse_rdoc_ordini(TAssoc_array* cms, const TDate&
query << "USE RDOC KEY 1\n";
query << "SELECT (BETWEEN(DOC.DATADOC,#DATAINIES,#DATACALCOLO))&&(RIGAEVASA!=\"X\")";
//filtro su cdc/cms/fasi (fatto come per saldi e rmovana; purtroppo non si può metodizzare perchè in tutti i files..
//..i nomi dei campi sono diversi!
switch (_tipostampa)
//filtro su cdc/cms/fasi (fatto come per saldi e rmovana; in tutti i files..
//..i nomi dei campi sono diversi! -> tentiamo con il metodo automaggico
const TString& select = crea_select(LF_RIGHEDOC);
if (select.full())
{
case 1:
case 4:
if (_fase.full())
query << "&&(FASCMS=\"" << _fase << "\")";
break;
case 2:
case 8:
if (_cdc.full())
query << "&&(CODCOSTO=\"" << _cdc << "\")";
break;
case 3:
if (_fase.full() || _cdc.full())
{
if (_fase.full() && _cdc.full())
query << "&&(FASCMS=\"" << _fase << "\")&&(CODCOSTO=\"" << _cdc << "\")";
else
{
if (_fase.full())
query << "&&(FASCMS=\"" << _fase << "\")";
else
query << "&&(CODCOSTO=\"" << _cdc << "\")";
}
}
break;
default:
break;
query << "&&(" << select << ")";
}
query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC"
@ -1339,6 +1314,10 @@ void TPrint_saldana_recordset::parse_rdoc_fatture(TAssoc_array* cms, const TDate
continue;
if (_fase.not_empty() && rmovana.get(RMOVANA_CODFASE) != _fase)
continue;
//ulteriore controllo in base ai permessi utente! se il record non rispetta i permessi viene saltato!
if (!ca_filter_record(rmovana))
continue;
//metodo per il calcolo importo riga riproporzionato
//metodo per generare i saldi alla data della riga analitica in base alla vita della riga
@ -1398,8 +1377,8 @@ void TPrint_saldana_recordset::create_lines_to_print()
// si fa solo se l'utente Adolfo lo ha deciso sulla maschera
if (_include_documenti)
{
parse_rdoc_ordini(cms, datainiesc, datafinesc);
parse_rdoc_fatture(cms, datainiesc, datafinesc);
parse_rdoc_ordini(cms, datainiesc, datafinesc);
parse_rdoc_fatture(cms, datainiesc, datafinesc);
}
} //if(_tipo==8)...

View File

@ -108,7 +108,8 @@ protected:
void parse_saldana_futuri();
void parse_rdoc_ordini(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc);
void parse_rdoc_fatture(TAssoc_array* cms, const TDate& datainiesc, const TDate& datafinesc);
TString crea_query_saldana();
const TString& crea_select(const int logicnum);
const TString& crea_query_saldana();
//per il solo ca3800
void aggiorna_importo(TAssoc_array& riga_array, const TString& livello, const int indbil,

View File

@ -1,3 +1,5 @@
#include <applicat.h>
#include <config.h>
#include <dongle.h>
#include <modaut.h>
#include <tree.h>
@ -6,12 +8,15 @@
#include <mov.h>
#include <pconti.h>
#include <doc.h>
#include <rdoc.h>
#include "calib01.h"
#include "calib02.h"
#include "calibmsk.h"
#include "../cg/cg2103.h"
#include "cdc.h"
#include "commesse.h"
#include "fasi.h"
#include "movana.h"
@ -20,6 +25,7 @@
#include "rrip.h"
#include "saldana.h"
///////////////////////////////////////////////////////////
// TConfig_anal
///////////////////////////////////////////////////////////
@ -357,38 +363,207 @@ bool ca_test_multilevel_field(TEdit_field& fld, int level)
// Utilities
///////////////////////////////////////////////////////////
static const TString & ca_create_user_select_clause(int logic)
const char* ca_dollar2fieldname(int logic, const char* dollar)
{
TString & select = get_tmp_string(128);
const char* fieldname = NULL;
switch (logic)
{
case LF_COMMESSE:
fieldname = "S0";
break;
case LF_CDC:
fieldname = "S1";
break;
case LF_FASI:
fieldname = "S2";
break;
default:
break;
}
if (fieldname != NULL)
{
const TString utente(user());
const TString gruppo(cache().get(LF_USER, utente,"GROUPNAME"));
if (gruppo.full())
select = cache().get("%AUC", gruppo, fieldname);
if (utente.full())
select = cache().get("%AUC", utente, fieldname);
}
return select;
CHECKS(dollar && *dollar == '$', "False dollar", dollar);
//cerca il nome del campo della variabile dollarata nel file logic in questione
if (xvt_str_compare_ignoring_case(dollar, "$(CDC)") == 0)
{
switch (logic)
{
case LF_DOC: return DOC_CODCOSTO;
case LF_RIGHEDOC: return RDOC_CODCOSTO;
case LF_RMOVANA: return RMOVANA_CODCCOSTO;
case LF_SALDANA: return SALDANA_COSTO;
default : return CDC_CODCOSTO;
}
}
if (xvt_str_compare_ignoring_case(dollar, "$(CMS)") == 0)
{
switch (logic)
{
case LF_DOC: return DOC_CODCMS;
case LF_RIGHEDOC: return RDOC_CODCMS;
case LF_FASI: return FASI_CODCMSFAS;
case LF_RMOVANA: return RMOVANA_CODCMS;
case LF_SALDANA: return SALDANA_COMMESSA;
default : return COMMESSE_CODCOSTO;
}
}
if (xvt_str_compare_ignoring_case(dollar, "$(FAS)") == 0)
{
switch (logic)
{
case LF_DOC: return DOC_FASCMS;
case LF_RIGHEDOC: return RDOC_FASCMS;
case LF_RMOVANA: return RMOVANA_CODFASE;
case LF_SALDANA: return SALDANA_FASE;
default : return FASI_CODFASE;
}
}
return NULL;
}
void ca_append_and(TString& query, const TString& clause)
{
if (clause.full())
{
if (query.full())
{
query.insert("(");
query << ")&&(" << clause << ")";
}
else
query = clause;
}
}
static const TString& ca_get_user_permissions(const TString& utente, const int logic)
{
TString select;
const TString gruppo(cache().get(LF_USER, utente, "GROUPNAME"));
if (gruppo.full())
select = ca_get_user_permissions(gruppo, logic);
TFilename fileconf = firm2dir(-1); // Directory dati
fileconf.add("config"); // + Directory config
fileconf.add("ca0900conf.ini");
TConfig ini_permessi(fileconf);
if (ini_permessi.set_paragraph(utente))
{
const char* fieldname = NULL;
switch (logic)
{
case LF_COMMESSE: fieldname = "Cms"; break;
case LF_CDC: fieldname = "Cdc"; break;
case LF_FASI: fieldname = "Fas"; break;
default: break;
}
if (fieldname != NULL)
{
const TString& expr = ini_permessi.get(fieldname);
ca_append_and(select, expr);
//che programma sono che chiamo questa funzione?
const TFilename prog_name = main_app().argv(0);
TString8 key = prog_name.name_only();
key << " " << main_app().argv(1);
TToken_string row(80, SAFE_PIPE_CHR);
for (int r = 0;; r++)
{
row = ini_permessi.get("Prog", NULL, r);
if (row.blank())
break;
if (key == row.get(0))
{
int column = 0;
switch (logic)
{
case LF_COMMESSE: column = 1; break;
case LF_CDC: column = 2; break;
case LF_FASI: column = 3; break;
default: break;
}
const TString& prog_expr = row.get(column);
ca_append_and(select, prog_expr);
} //if (key == row.get(0))...
} //for (int r = 0;; r++)...
} //if (fieldname...
} //if (ini_permessi.set...
return select.full() ? (get_tmp_string() = select) : EMPTY_STRING;
}
static const TString& ca_get_user_permissions_or_empty(const TString& utente, const int logic)
{
const TString& perm = ca_get_user_permissions(utente, logic);
if (perm.full())
{
TString& subclause = get_tmp_string();
subclause << "(" << perm << ")||($(";
switch (logic)
{
case LF_CDC: subclause << "CDC"; break;
case LF_COMMESSE: subclause << "CMS"; break;
case LF_FASI: subclause << "FAS"; break;
default: break;
}
subclause << ")==\"\")";
return subclause;
}
return EMPTY_STRING;
}
const TString& ca_create_user_select_clause(int logic)
{
static TArray clauses;
TString* clause = (TString*)clauses.objptr(logic);
if (clause == NULL)
{
clause = new TString;
switch (logic)
{
case LF_CDC:
case LF_COMMESSE:
case LF_FASI:
*clause = ca_get_user_permissions(user(), logic);
break;
case LF_DOC:
case LF_RIGHEDOC:
case LF_RMOVANA:
case LF_SALDANA:
ca_append_and(*clause, ca_get_user_permissions_or_empty(user(), LF_CDC));
ca_append_and(*clause, ca_get_user_permissions_or_empty(user(), LF_COMMESSE));
ca_append_and(*clause, ca_get_user_permissions_or_empty(user(), LF_FASI));
break;
default:
break;
}
for (int dollar = clause->find("$("); dollar >= 0; dollar = clause->find("$(", dollar))
{
const int closed = clause->find(')', dollar + 4);
const TString& before = clause->left(dollar);
const TString& field = clause->sub(dollar, closed + 1);
const TString& after = clause->mid(closed + 1);
clause->cut(0) << before << ca_dollar2fieldname(logic, field) << after;
}
clauses.add(clause, logic);
}
return *clause;
}
bool ca_filter_record(const TRectype& rec)
{
bool good = true;
const TString& filter = ca_create_user_select_clause(rec.num());
if (filter.full())
{
TExpression expr(filter, _strexpr);
for (int v = expr.numvar() - 1; v >= 0; v--)
{
const char* field = expr.varname(v);
expr.setvar(v, rec.get(field));
}
good = expr.as_bool();
}
return good;
}
bool ca_filter_function(const TRelation* rel)
{
return rel != NULL && ca_filter_record(rel->curr());
}
static void ca_append_select_clause(ostream& out, int level, int logic, bool upper_limit)
{
TString str;

View File

@ -68,6 +68,14 @@ public:
const TMultilevel_code_info& ca_multilevel_code_info(int logicnum);
const TMultilevel_code_info* ca_multilevel_code_info_by_index(int level);
bool ca_test_multilevel_field(TEdit_field& fld, int level);
//metodi di filtraggio avanzato anche in base ai permessi utente
const char* ca_dollar2fieldname(int logic, const char* dollar);
void ca_append_and(TString& query, const TString& clause);
const TString& ca_create_user_select_clause(int logic);
bool ca_filter_record(const TRectype& rec);
bool ca_filter_function(const TRelation* rel);
int ca_create_fields(TMask& msk, int page, int logicnum, int x, int y, short key_id, short des_id,
unsigned int mode = 0x0, const char* fieldname = NULL, int from = 0);
int ca_create_fields_compact(TMask& msk, int page, int logicnum, int x, int y,

View File

@ -36,7 +36,7 @@ Item_01 = "Piano dei conti", "ca0 -3", "SF"
Item_02 = "Centri di costo", "ca0 -4", "SF"
Item_03 = "Commesse", "ca0 -5", "SF"
Item_04 = "Fasi", "ca0 -6", "SF"
Item_05 = "Selezione archivi per Utente", "ca0 -0 %AUC", ""
Item_05 = "Selezione archivi per Utente", "ca0 -8", "P"
Item_06 = "Responsabili commessa", "ca0 -0 RSP", "F"
Item_07 = "Tipi Lavoro", "ca0 -0 TPL", "F"