campo-sirio/ve/velib06.cpp
alex a6067cf2cf Patch level : 10.0 870
Files correlati     : ef0.exe
Ricompilazione Demo : [ ]
Commento            :
Gestione CUP
Verificare che i profili persnalizzati continuino a funzionare
Nella gestione profili e documenti aggiunti i campi per gestire piu banche di appoggio e presentazione dei clienti/ fornitori
La ricerca e sulla tabella se il cliente / fornitore non ha banche altrimenti e sulle banche del cliente/fornitore.
Ai profili personalizzati vanno aggiunti-modificati e posizionati i campi :

NU 117 5
BE
PR 2 11 "Banca appoggio      : Cod. ABI "
FL "Z"
CH NORMAL
FI CODABIA
US %BAN SE CODTAB?="?????"
IN CODTAB[1,5] 117
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Denominazione@50" S0
OU 117 CODTAB[1,5]
OU 336 S0
OU 197 CODTAB[1,5]
ME CO,220
EN
NU 118 5
BE
PR 42 11 "Cod. CAB "
FL "Z"
CH NORMAL
FI CODCABA
US %BAN SE CODTAB?="??????????"
IN CODTAB[1,5] 117
IN CODTAB[6,10] 118
CO DI 117
OU 117 CODTAB[1,5]
OU 118 CODTAB[6,10]
OU 336 S0
OU 198 CODTAB[6,10]
ME CO,221
EN
NU 220 5
BE
PR 2 11 "Banca appoggio      : Cod. ABI "
FL "ZH"
CH NORMAL
FI CODABIA
US 98 KEY 2
JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB
IN TIPOCF 107 SE
IN CODCF 108 SE
IN TIPOBAN "V"
IN ABI 220
IN CAB 221
IN PROGPR ""
DI "Cod. Istit." ABI
DI "Cod. Fil." CAB
DI "IBAN@27" IBAN
DI "Denominazione@50" %BAN->S0
OU 220 ABI
OU 221 CAB
OU 336 %BAN->S0
OU 192 IBAN
OU 197 ABI
OU 198 CAB
EN
NU 221 5
BE
PR 42 11 "Cod. CAB "
FL "ZH"
CH NORMAL
FI CODCABA
CO US 220
CO IN 220
CO DI 220
CO OU 220
EN

per la banca di appoggio

NU 119 5
BE
PR 2 14 "Banca presentazione : Cod. ABI "
FL "Z"
CH NORMAL
FI CODABIP
CO US 117
IN CODTAB[1,5] 119
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Denominazione@50" S0
OU 119 CODTAB[1,5]
OU 338 S0
ME CO,222
EN
NU 120 5
BE
PR 42 14 "Cod. CAB "
FL "Z"
CH NORMAL
FI CODCABP
CO US 118
IN CODTAB[1,5] 119
IN CODTAB[6,10] 120
CO DI 119
OU 119 CODTAB[1,5]
OU 120 CODTAB[6,10]
OU 338 S0
ME CO,223
EN
NU 214 2
BE
PR 60 14 "Progressivo "
FL "Z"
FI PROGBNP
US BNP
JOIN %BAN ALIAS 100 INTO CODTAB=CODTAB[1,10]
IN CODTAB[1,5] 119
IN CODTAB[6,10] 120
IN CODTAB[11,12] 214
DI "Cod. Istit." CODTAB[1,5]
DI "Cod. Fil." CODTAB[6,10]
DI "Progr." CODTAB[11,12]
DI "IBAN@27" S3
DI "Denominazione@50" 100@->S0
OU 119 CODTAB[1,5]
OU 120 CODTAB[6,10]
OU 214 CODTAB[11,12]
OU 338 100@->S0
ME CO,224
EN
NU 222 5
BE
PR 2 14 "Banca presentazione : Cod. ABI "
FL "ZH"
CH NORMAL
FI CODABIP
US 98 KEY 2
JOIN %BAN INTO CODTAB[1,5]==ABI CODTAB[6,10]==CAB
IN TIPOCF 107 SE
IN CODCF 108 SE
IN TIPOBAN "N"
IN ABI 222
IN CAB 223
IN PROGPR 224
DI "Cod. Istit." ABI
DI "Cod. Fil." CAB
DI "Progr." PROGPR
DI "IBAN@27" IBAN
DI "Denominazione@50" %BAN->S0
OU 222 ABI
OU 223 CAB
OU 224 PROGPR
OU 338 %BAN->S0
OU 192 IBAN
EN
NU 223 5
BE
PR 42 14 "Cod. CAB "
FL "ZH"
CH NORMAL
FI CODCABP
CO US 222
CO IN 222
CO DI 222
CO OU 222
EN
NU 224 2
BE
PR 60 14 "Progressivo "
FL "ZH"
CH NORMAL
FI PROGBNP
CO US 222
CO IN 222
CO DI 222
CO OU 222
EN

per la banca di presentazione.

Sono stati aggiunti campi CUP e CIG che hanno la ricerca sulla tabella ne caso normale e la ricerca sul file
commesse clienti nel caso sia presente l'analitica
Vanno aggiunti e posizionati ai profili personalizzati nel caso servano:

ST 215 15
BE
PR 2 11 "Cod.Unico Prog."
FL "U"
CH NORMAL
FI CUP
US %CUP
IN CODTAB 215
DI "Codice@15" CODTAB
DI "Descrizione@50" S0
OU 215 CODTAB
OU 216 S0
HE "Inserisci il Codice Unico di Progetto"
WA "Codice Unico di Progetto non trovato"
CH NORMAL
EN
ST 216 50
BE
PR 35 11 ""
FL ""
CH NORMAL
US %CUP KEY 2
IN S0 216
DI "Descrizione@50" S0
DI "Codice@15" CODTAB
CO OU 215
EN
ST 217 15
BE
PR 2 12 "Cod.Ident.Gara "
FL "U"
CH NORMAL
FI CIG
US %CIG
IN CODTAB 217
DI "Codice@15" CODTAB
DI "Descrizione@50" S0
OU 217 CODTAB
OU 218 S0
HE "Inserisci il Codice Identificativo Gara"
WA "Codice Identificativo Gara non trovato"
CH NORMAL
EN
ST 218 50
BE
PR 35 12 ""
FL ""
CH NORMAL
US %CIG KEY 2
IN S0 218
DI "Descrizione@50" S0
DI "Codice@15" CODTAB
CO OU 217
EN
ST 219 20
BE
PR 2 13 ""
FL "H"
FI CODCMS
EN

La generazione effetti scrive il CUP e il CIG sull'effetto.
La contabilizzazione scrive il CUP e il CIG sulle righe contabili.


git-svn-id: svn://10.65.10.50/branches/R_10_00@21374 c028cbd2-c16b-5b4b-a496-9718f37d4682
2010-12-28 08:28:47 +00:00

4204 lines
106 KiB
C++
Executable File
Raw Blame History

#include <colmask.h>
#include <dongle.h>
#include <execp.h>
#include <modaut.h>
#include <postman.h>
#include <recset.h>
#include <smartcard.h>
#include <treectrl.h>
#include <urldefid.h>
#include <utility.h>
#include "../db/dblib.h"
#include "velib04.h"
#include "vepriv.h"
#include "verig.h"
#include "ve0100.h"
#include "ve0100b1.h"
#include "ve0100c.h"
#include "ve0100o.h"
#include "veuml.h"
#include "veuml1.h"
#include "veini.h"
#include <multirel.h>
#include "../cg/cfban.h"
#include "../ca/cfcms.h"
#include <occas.h>
#include "rcondv.h"
#include "sconti.h"
///////////////////////////////////////////////////////////
// TOriginal_row_mask
///////////////////////////////////////////////////////////
class TOriginal_row_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
virtual bool on_key(KEY key);
public:
TOriginal_row_mask() : TAutomask("ve0100c") { }
};
bool TOriginal_row_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
return true;
}
bool TOriginal_row_mask::on_key(KEY key)
{
if (key == K_SHIFT + K_F12)
enable(-1);
return TAutomask::on_key(key);
}
///////////////////////////////////////////////////////////
// TColor_rule
///////////////////////////////////////////////////////////
TColor_rule::TColor_rule(const char* desc, const char* expr, TTypeexp type, COLOR back, COLOR fore)
: TExpr_documento(expr, type), _back(back), _fore(fore), _def_back(back), _def_fore(fore)
{
_desc = dictionary_translate(desc);
_key = desc; _key.trim(); _key.strip_double_spaces();
_key.replace(' ', '_');
}
///////////////////////////////////////////////////////////
// Gestione campi CONAI su maschera righe
///////////////////////////////////////////////////////////
short conai_peso_id(TCONAI_class type)
{ return type >= CONAI_FIRST && type <= CONAI_LAST ? FR_PUNACC + 2 * type : DLG_NULL; }
short conai_sottocat_id(TCONAI_class type)
{ return type >= CONAI_FIRST && type <= CONAI_LAST ? FR_SCAACC + 2*type : DLG_NULL; }
TCONAI_class conai_id2class(short id)
{
const TCONAI_class t = TCONAI_class((id-FR_SCAACC) / 2);
return t >= CONAI_FIRST && t <= CONAI_LAST ? t : CONAI_NONE;
}
///////////////////////////////////////////////////////////
// TDocumento_mask
///////////////////////////////////////////////////////////
TDocumento_mask::TDocumento_mask(const char* td)
: TVariable_mask(), _progs_page(-1), _condv(NULL), _smartcard(NULL),
_cms_start(-1), _cms_end(-1), _cms_start_sh(-1), _cms_end_sh(-1),
_cdc_start(-1), _cdc_end(-1), _cdc_start_sh(-1), _cdc_end_sh(-1)
{
CHECK(td && *td && strlen(td) <= 4, "TDocumento_mask(TipoDocumento) not (MaskName)");
{
TMagazzini m;
_ges_mag = m.gestmag();
_ges_dep = m.gestdep();
_std_mag = m.standardmag();
_std_dep = m.standarddep();
}
TDocumento& d = doc();
d.set_tipo(td);
const TString16 mname = d.tipo().mask_name();
read_mask(mname, 0, MAX_PAGES);
_sheet = &sfield(F_SHEET);
_sheet->set_handler( ss_handler );
_sheet->set_notify( ss_notify );
_sheet->set_append(FALSE);
TList_field& listbox = lfield(F_LBTIPORIGA);
const TTipo_documento& tdoc = d.tipo();
const TToken_string& keys = tdoc.keys_descrs().row(0);
const TToken_string& desc = tdoc.keys_descrs().row(1);
listbox.replace_items(keys, desc);
// Controlla se deve generare la pagina di analitica
_ges_ca = dongle().active(CAAUT) || dongle().active(CMAUT);
if (_ges_ca)
{
TConfig& caini = ca_config();
_ges_ca = caini.get("Level", NULL, 1).full();
if (_ges_ca)
insert_anal_page();
}
configura_sheet(*_sheet);
((TVariable_sheet_field*)_sheet)->set_getmask( ss_getmask );
if (_doc.tipo().clifo_optional())
{
field(F_CODCF).check_type(CHECK_NORMAL);
field(F_RAGSOC).check_type(CHECK_NORMAL);
}
int i;
for (i = fields() - 1; i >= 0; i--)
{
TMask_field & f = fld(i);
if (f.is_operable())
f.set_handler(universal_handler);
}
set_field_handler( F_OCCASEDIT, occas_handler );
set_field_handler( F_CODCF, clifo_handler );
set_field_handler( F_CODPAG, condpag_hndl );
set_field_handler( F_DATAINSC, condpag_hndl );
set_field_handler( F_CODNOTE, note_hndl );
set_field_handler( F_DATADOC, data_hndl );
set_field_handler( F_CODLIST, codlist_handler );
set_field_handler( F_CODCONT, codcont_handler );
set_field_handler( F_CODCAMP, codcamp_handler );
set_field_handler( F_CODVAL, codval_handler );
set_field_handler( F_CODVAL1, codval_handler );
set_field_handler( F_NUMDOCRIF, datadocrif_handler);
set_field_handler( F_DATADOCRIF, datadocrif_handler);
set_handler( DLG_ELABORA, elabora_handler );
set_handler( DLG_PRINT, print_handler );
set_handler( DLG_PREVIEW, print_handler );
set_handler( DLG_EMAIL, print_handler );
set_handler( DLG_CONFERMA, confirm_handler );
const TString_array& handlers = tdoc.handlers();
FOR_EACH_ARRAY_ROW(handlers, r, riga)
user_set_handler( riga->get_int(0), riga->get_int(1) );
_livelli_giac = new TCodgiac_livelli;
for (i = 4; i > 0; i--)
{
const short pos = _sheet->cid2index(FR_LIV1 + i -1);
if (_livelli_giac->enabled(i))
{
const TString & header = _livelli_giac->name(i);
const int len = header.len() + 1;
const int f_len = _livelli_giac->code_length(i);
_sheet->set_column_header(pos, header);
_sheet->set_column_width(pos, (len > f_len ? len : f_len) * 8);
}
else
{
_sheet->sheet_mask().hide(FR_LIV1 + i -1);
_sheet->delete_column(pos);
}
}
// configurazione campi
TConfig cfg(CONFIG_DITTA, "ve");
const bool gesval = cfg.get_bool("GESVAL");
const bool gescambi = cfg.get_bool("GESVALAC");
if (gesval)
{
const bool enable_controeuro = cfg.get_bool("CONTROEURO");
enable(F_CONTROEURO, enable_controeuro);
show(F_CODVAL, !gescambi);
show(F_DATACAMBIO, !gescambi);
show(F_NOMEVAL, !gescambi);
show(F_CODVAL1, gescambi);
show(F_DATACAMBIO1, gescambi);
show(F_NOMEVAL1, gescambi);
show(F_CAMBIO);
}
else
{
disable(F_CODVAL);
disable(F_DATACAMBIO);
disable(F_CONTROEURO);
disable(F_NOMEVAL);
hide(F_CODVAL1);
hide(F_DATACAMBIO1);
hide(F_NOMEVAL1);
disable(F_CAMBIO);
}
const bool geslin = cfg.get_bool("GESLIN");
enable(F_CODLIN, geslin);
enable(F_DESLIN, geslin);
const bool geslis = cfg.get_bool("GES", NULL, 1);
show(F_CODLIST, geslis);
show(F_DESLIST, geslis);
enable(F_CODLIST, geslis);
enable(F_DESLIST, geslis);
hide(203);
disable(203);
hide(204);
disable(204);
if (cfg.get_bool("GESLISCV"))
{
TBrowse * b = efield(F_CODLIST).browse();
if (b != NULL)
{
b->remove_input_field();
b->add_input_field("\"L\"", RCONDV_TIPO);
b->add_input_field(TOSTRING(F_CATVEN), DOC_CATVEN, -1, true);
b->add_input_field("\"\"", DOC_TIPOCF);
b->add_input_field("\"\"", DOC_CODCF);
b->add_input_field(TOSTRING(F_CODLIST), RCONDV_COD);
}
b = efield(F_DESLIST).browse();
if (b != NULL)
{
TString filter;
filter << DOC_CATVEN << "==#" << F_CATVEN;
b->set_filter(filter);
}
}
const bool gescontr = cfg.get_bool("GES", "ve", 2);
show(F_CODCONT, gescontr);
show(F_DESCONT, gescontr);
enable(F_CODCONT, gescontr);
enable(F_DESCONT, gescontr);
if (cfg.get_bool("GESCONCC"))
{
TBrowse * b = efield(F_CODCONT).browse();
if (b != NULL)
{
b->remove_input_field();
b->add_input_field("\"C\"", RCONDV_TIPO);
b->add_input_field("\"\"", RCONDV_CATVEN);
b->add_input_field(TOSTRING(F_TIPOCF), RCONDV_TIPOCF, -1, true);
b->add_input_field(TOSTRING(F_CODCF), RCONDV_CODCF, -1, true);
b->add_input_field(TOSTRING(F_CODCONT), RCONDV_COD);
}
b = efield(F_DESCONT).browse();
if (b != NULL)
{
TString filter;
filter << "(" << DOC_TIPOCF << "==#" << F_TIPOCF << ")&&(" << DOC_CODCF << "==#" << F_CODCF << ")";
b->set_filter(filter);
}
}
if (main_app().has_module(CUAUT))
{
if (_ges_ca && id2pos(F_CUP) > 0)
{
TBrowse * bp = efield(F_CUP).browse();
TRelation * rp = new TRelation(LF_CFCMS);
rp->add("%CUP", "CODTAB==" CFCMS_CUP);
rp->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF");
bp->set_cursor(new TCursor(rp, "", 2));
bp->remove_input_field();
bp->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true);
bp->add_input_field(TOSTRING(F_CUP), CFCMS_CUP);
bp->remove_display_field();
bp->add_display_field("Codice CUP@15", CFCMS_CUP);
bp->add_display_field("Descrizione@50", "%CUP->S0");
bp->add_display_field("Codice Cliente", CFCMS_CODCF);
bp->add_display_field("Ragione Sociale@50", TOSTRING(LF_CLIFO) "->" CLI_RAGSOC);
bp->remove_output_field();
bp->add_output_field(TOSTRING(F_CUP), CFCMS_CUP);
bp->add_output_field(TOSTRING(F_CIG), CFCMS_CIG);
bp->add_output_field(TOSTRING(F_DESCRCUP), "%CUP->S0");
TBrowse * bpd = efield(F_DESCRCUP).browse();
bpd->set_cursor(new TSorted_cursor(rp, CFCMS_COMMESSA "|%CUP->S0"));
bpd->remove_input_field();
bpd->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true);
bpd->add_input_field(TOSTRING(F_DESCRCUP), "%CUP->S0");
bpd->remove_display_field();
bpd->add_display_field("Descrizione@50", "%CUP->S0");
bpd->add_display_field("Codice CUP@15", CFCMS_CUP);
bpd->add_display_field("Codice Cliente", CFCMS_CODCF);
bpd->add_display_field("Ragione Sociale@50", TOSTRING(LF_CLIFO) "->" CLI_RAGSOC);
bpd->copy_output(bp);
TBrowse * bg = efield(F_CIG).browse();
TRelation * rg = new TRelation(LF_CFCMS);
rg->add("%CIG", "CODTAB==" CFCMS_CIG);
rg->add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF");
bg->set_cursor(new TCursor(rg, "", 3));
bg->remove_input_field();
bg->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true);
bg->add_input_field(TOSTRING(F_CIG), CFCMS_CIG);
bg->remove_display_field();
bg->add_display_field("Codice CIG@15", CFCMS_CIG);
bg->add_display_field("Descrizione@50", "%CIG->S0");
bg->add_display_field("Codice Cliente", CFCMS_CODCF);
bg->add_display_field("Ragione Sociale@50", TOSTRING(LF_CLIFO) "->" CLI_RAGSOC);
bg->remove_output_field();
bg->add_output_field(TOSTRING(F_CIG), CFCMS_CIG);
bg->add_output_field(TOSTRING(F_CUP), CFCMS_CUP);
bg->add_output_field(TOSTRING(F_DESCRCIG), "%CIG->S0");
TBrowse * bgd = efield(F_DESCRCIG).browse();
bgd->set_cursor(new TSorted_cursor(rg, CFCMS_COMMESSA "|%CIG->S0"));
bgd->remove_input_field();
bgd->add_input_field(TOSTRING(F_CMSH), CFCMS_COMMESSA, -1, true);
bgd->add_input_field(TOSTRING(F_DESCRCIG), "%CIG->S0");
bgd->remove_display_field();
bgd->add_display_field("Descrizione@50", "%CIG->S0");
bgd->add_display_field("Codice CIG@15", CFCMS_CIG);
bgd->add_display_field("Codice Cliente", CFCMS_CODCF);
bgd->add_display_field("Ragione Sociale@50", TOSTRING(LF_CLIFO) "->" CLI_RAGSOC);
bgd->copy_output(bg);
}
}
else
{
hide(F_CUP);
hide(F_DESCRCUP);
hide(F_CIG);
hide(F_DESCRCIG);
}
const bool gesoff = cfg.get_bool("GES", "ve", 3);
enable(F_CODCAMP, gesoff);
enable(F_DESCAMP, gesoff);
const bool gessco = cfg.get_char("GESSCO") != 'N';
enable(F_SCONTOPERC, gessco);
const bool gesage = cfg.get_bool("GESAGE");
enable(F_CODAG, gesage);
enable(F_DESAG, gesage);
enable(F_CODAGVIS, gesage);
enable(F_DESAGVIS, gesage);
const bool has_movmag = dongle().active(MGAUT) && _doc.tipo().mov_mag();
int pos = id2pos(F_CAUSMAG);
if (pos >= 0)
fld(pos).show(has_movmag);
pos = id2pos(F_DESCRMAG);
if (pos >= 0)
fld(pos).show(has_movmag);
pos = id2pos(F_CAUSMAGC);
if (pos >= 0)
fld(pos).show(has_movmag);
pos = id2pos(F_DESCRMAGC);
if (pos >= 0)
fld(pos).show(has_movmag);
pos = id2pos(F_CURGIAC);
if (pos >= 0)
fld(pos).show(has_movmag);
pos = id2pos(F_CURDISP);
if (pos >= 0)
fld(pos).show(has_movmag);
FOR_EACH_MASK_FIELD((*this), j, f)
{
if (f->dlg() > BASE_PIEDE)
_calculated_pages.set(f->page());
}
TFilename pn; d.tipo().profile_name(pn);
TConfig prof(pn, "Colors");
prof.write_protect(true);
COLOR back = prof.get_color("BgCol", NULL, 0, COLOR_YELLOW); // FOCUS_BACK_COLOR
COLOR fore = prof.get_color("FgCol", NULL, 0, COLOR_BLACK); // FOCUS_COLOR
color_rules().add(new TColor_rule("Righe collegate a documento", "", _numexpr, back, fore));
for (int i = 1; ; i++)
{
const TString& name = prof.get("RuleName", NULL, i);
if (name.full())
{
const TString& expr = prof.get("Rule", NULL, i);
const TTypeexp type = prof.get_char("RuleType", NULL, i, 'N') == 'S' ? _strexpr : _numexpr ;
back = prof.get_color("BgCol", NULL, i, NORMAL_BACK_COLOR);
fore = prof.get_color("FgCol", NULL, i, NORMAL_COLOR);
color_rules().add(new TColor_rule(name, expr, type, back, fore));
}
else
break;
}
_sh_y = prof.get_int("SHEET_LINE", "MAIN");
// Legge i colori personalizzati dal .ini gestito dalla TSelect_color_mask
TString tmp; tmp << doc().tipo().mask_name() << "_0"; tmp.lower();
TConfig conf(CONFIG_GUI, tmp);
conf.write_protect();
FOR_EACH_ARRAY_ITEM(color_rules(), j, o)
{
TColor_rule& c = *(TColor_rule*)o;
tmp = c.key();
COLOR fore = conf.get_color(tmp);
tmp << "_Bg";
COLOR back = conf.get_color(tmp);
if (back != fore)
c.set_colors(back, fore);
}
}
TDocumento_mask::~TDocumento_mask()
{
if (_condv)
delete _condv;
if (_livelli_giac)
delete _livelli_giac;
if (_smartcard)
delete _smartcard;
}
int TDocumento_mask::insert_anal_fields(TMask& m, int page, int lf, int& y,
short& dlg, short& dlgd, bool required)
{
const int h = ca_create_fields(m, page, lf, 2, y, dlg, dlgd);
const bool main_mask = m.id2pos(F_SHEET) > 0;
for (int i = 0; i < h; i++)
{
TEdit_field& fld = m.efield(dlg+i);
int logic = lf;
if (logic == LF_FASI)
{
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
if (fasinfo.parent() != 0)
{
const TMultilevel_code_info& parinfo = ca_multilevel_code_info(fasinfo.parent());
if (i < parinfo.levels())
logic = fasinfo.parent();
}
}
const char* fieldname = NULL;
switch(logic)
{
case LF_COMMESSE: fieldname = DOC_CODCMS; break;
case LF_FASI : fieldname = DOC_FASCMS; break;
default : fieldname = DOC_CODCOSTO; break;
}
TFieldref* f = (TFieldref*)fld.field();
f->set_name(fieldname);
fld.check_type(required ? CHECK_REQUIRED : CHECK_NORMAL);
TEdit_field& dfld = m.efield(dlgd+i);
dfld.set_field(EMPTY_STRING); // Toglie campi che fan saltare gli output!
if (main_mask)
{
TSheet_field& sf = sfield(F_SHEET);
const TString head = fld.prompt();
const int colid = FR_CDC1+(fld.dlg()-F_CDC1);
sf.set_column_header(colid, head);
if (fld.size() > head.len())
sf.set_column_width(colid, fld.size()*8); // XI_FU_MULTIPLE
TMask& sm = sf.sheet_mask();
TString80 str; str << *fld.field();
sm.efield(colid).set_field(str); // Ricopia il campo nella maschera di riga per poterlo salvare!
}
}
y += h+1;
dlg += h; dlgd += h;
return h;
}
void TDocumento_mask::insert_anal_page()
{
if (id2pos(F_CDC1) >= 0)
return;
int newpage = win2page(_sheet->parent());
if (newpage == 0)
newpage++;
create_page("Analitica", newpage); // Inserisce una pagina vuota con un titolo a caso
add_groupbox(DLG_NULL, newpage, "", 1, 0, 78, 6);
add_string(DLG_NULL, newpage, TR("Cod. num. "), 2, 1, 4, "D").set_group(2);
add_string(DLG_NULL, newpage, "", 24, 1, 50, "D").set_group(3);
add_string(DLG_NULL, newpage, TR("Tipo doc. "), 2, 2, 4, "D").set_group(4);
add_string(DLG_NULL, newpage, "", 24, 2, 50, "D").set_group(5);
add_number(DLG_NULL, newpage, TR("Esercizio "), 2, 3, 4, "D").set_group(9);
add_number(DLG_NULL, newpage, TR("Numero doc. "), 24, 3, 6, "D").set_group(6);
add_date(DLG_NULL, newpage, TR("Data "), 46, 3, "D").set_group(7);
add_string(DLG_NULL, newpage, TR("Stato "), 67, 3, 1, "D").set_group(8);
add_number(DLG_NULL, newpage, TR("Cliente "), 2, 4, 6, "D").set_group(10);
add_string(DLG_NULL, newpage, "", 24, 4, 50, "D").set_group(11);
add_groupbox(DLG_NULL, newpage, TR("Contabilita' Analitica"), 1, 6, 78, 14);
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
const bool use_fsc = fasinfo.levels() > 0;
TConfig& ini = ca_config();
const bool fsc_req = use_fsc && ini.get_bool("FscRequired");
int y = 7;
short dlg = F_CDC1; // id del primo campo da generare
short dlgd = F_DESCDC1;
for (int i = 0; i < 2; i++)
{
const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2
if (level == "CDC") // Crea centro di costo
{
_cdc_start = dlg;
_cdc_end = dlg + ca_multilevel_code_info(LF_CDC).levels()-1;
if (use_fsc && fasinfo.parent() == LF_CDC)
insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req);
else
{
const bool cdc_req = ini.get_bool("CdcRequired");
insert_anal_fields(*this, newpage, LF_CDC, y, dlg, dlgd, cdc_req);
}
} else
if (level == "CMS") // Crea commessa
{
_cms_start = dlg;
_cms_end = dlg + ca_multilevel_code_info(LF_COMMESSE).levels()-1;
if (use_fsc && fasinfo.parent() == LF_COMMESSE)
insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req);
else
{
const bool cms_req = ini.get_bool("CmsRequired");
insert_anal_fields(*this, newpage, LF_COMMESSE, y, dlg, dlgd, cms_req);
}
}
}
if (_cms_start > 0)
set_field_handler(_cms_end, codcms_handler);
if (use_fsc && fasinfo.parent() <= 0)
insert_anal_fields(*this, newpage, LF_FASI, y, dlg, dlgd, fsc_req);
//aggiunge campi per date di competenza (inizio e fine)
add_groupbox(DLG_NULL, newpage, TR("Date di competenza"), 1, 20, 78, 3);
TString16 f_datacomp = DOC_DATACOMP;
add_date(F_DATACOMP, newpage, "Inizio ", 2, 21).set_field(f_datacomp);
TString16 f_datafcomp = DOC_DATAFCOMP;
add_date(F_DATAFCOMP, newpage, "Fine ", 25, 21).set_field(f_datafcomp);
set_field_handler(F_DATACOMP, datacomp_handler); //gestore del campo inizio competenza..
set_field_handler(F_DATAFCOMP, datafcomp_handler); //..e della fine competenza
}
void TDocumento_mask::configura_sheet(TSheet_field& sheet)
{
TBit_array to_delete(MAX_COLUMNS);
to_delete.set();
const TTipo_documento& tdoc = _doc.tipo();
const TString_array& sheet_columns = tdoc.sheet_columns();
const int ncols = sheet_columns.items();
TToken_string colonne;
int i;
colonne = "0";
for (i = 0; i < ncols; i ++ )
{
TToken_string& sheet_col = (TToken_string&)sheet_columns.row(i);
const int field_id = sheet_col.get_int(0);
const int coltomove = sheet.cid2index(field_id);
to_delete.reset(coltomove);
const TString80 descr(sheet_col.get(1));
if (descr.not_empty() )
sheet.set_column_header( field_id, descr);
const int size = sheet_col.get_int(2) * 8; // XI_FU_MULTIPLE
if (size != 0)
sheet.set_column_width( field_id, size);
if (field_id != FR_LORDO)
colonne.add(field_id);
if (field_id == FR_CODIVA && tdoc.is_costo())
{
const int col = sheet.cid2index(FR_TIPODET);
to_delete.reset(col);
colonne.add(col);
}
}
to_delete.set(0L);
to_delete.reset(1);
FOR_EACH_CONAI_CLASS(ct)
{
const short posc = conai_sottocat_id(ct);
const short posp = conai_peso_id(ct);
const int colc = sheet.cid2index(posc);
const int colp = sheet.cid2index(posp);
if (conai_configured_class(ct))
{
to_delete.reset(colc);
if (colonne.find(format("%d", posc)) < 0)
colonne.add(posc);
to_delete.reset(colp);
if (colonne.find(format("%d", posp)) < 0)
colonne.add(posp);
}
else
{
to_delete.set(colc);
int p = colonne.find(format("%d", posc));
if (p > 0)
p--;
if (p >= 0)
{
int p1 = p;
while (isdigit(colonne[p1]))
p1++;
if (colonne[p1] == '|')
p1++;
else
if (colonne[p] == '|')
p--;
const TString c(colonne.mid(p1));
colonne.cut(p);
colonne << c;
}
to_delete.set(colp);
p = colonne.find(format("%d", posp));
if (p > 0)
p--;
if (p >= 0)
{
int p1 = p;
while (isdigit(colonne[p1]))
p1++;
if (colonne[p1] == '|')
p1++;
else
if (colonne[p] == '|')
p--;
const TString c(colonne.mid(p1));
colonne.cut(p);
colonne << c;
}
}
}
if (!to_delete[sheet.cid2index(FR_CODDEP)])
sheet.enable_column(FR_CODDEP, _ges_dep && _ges_mag);
if (!to_delete[sheet.cid2index(FR_CODMAG)])
sheet.enable_column(FR_CODMAG, _ges_mag);
if (!to_delete[sheet.cid2index(FR_CODDEPC)])
sheet.enable_column(FR_CODDEPC, _ges_dep && _ges_mag);
if (!to_delete[sheet.cid2index(FR_CODMAGC)])
sheet.enable_column(FR_CODMAGC, _ges_mag);
to_delete.set(sheet.cid2index(FR_CODARTMAG));
to_delete.set(sheet.cid2index(FR_CHECKED));
if (_ges_ca)
{
const TMultilevel_code_info& cdc = ca_multilevel_code_info(LF_CDC);
const TMultilevel_code_info& cms = ca_multilevel_code_info(LF_COMMESSE);
const TMultilevel_code_info& fas = ca_multilevel_code_info(LF_FASI);
const int levels = cdc.levels() + cms.levels() + fas.levels();
for (short cid = FR_CDC1; cid <= FR_CDC12; cid++)
{
const int level = cid-FR_CDC1;
to_delete.set(sheet.cid2index(cid), level >= levels);
if (level < levels)
colonne.add(cid);
}
}
for ( i = MAX_COLUMNS - 1; i >= 0; i-- )
{
if( to_delete[i] )
{
sheet.enable_column( i + FIRST_FIELD, false);
sheet.delete_column( i + FIRST_FIELD);
}
}
if (!sheet.user_saved_columns_order())
sheet.set_columns_order(&colonne);
}
TCond_vendita& TDocumento_mask::condv() const
{
if (_condv == NULL)
{
TDocumento_mask* myself = (TDocumento_mask*)this;
myself->_condv = new TCond_vendita(myself, NULL);
}
return *_condv;
}
void TDocumento_mask::update_progs(bool stop_run)
{
static bool updating_progs = false;
if (!updating_progs)
{
updating_progs = true;
TWait_cursor hourglass;
const int page = curr_page();
const int last_field = fields() - 1;
for (int f = last_field; f >= 0; f--)
{
const TMask_field & mf = fld(f);
const int id = mf.dlg();
const int field_page = mf.page();
if ((page == field_page || stop_run) && id > BASE_PIEDE)
{
const TFieldref* recfld = mf.field();
if (recfld != NULL)
{
const TString & name = recfld->name();
const TString& val = doc().get(name);
set(id, val, true);
}
}
}
updating_progs = false;
}
}
void TDocumento_mask::next_page(int p)
{
TMask::next_page(p);
if (is_calculated_page(curr_page()))
update_progs();
}
void TDocumento_mask::start_run()
{
TSmart_card * s = smartcard();
if (s != NULL)
{
if (edit_mode() && s->with_card(*this))
disable(DLG_SAVEREC);
if (s->card_connected())
{
disable(F_CODCF);
disable(F_RAGSOC);
s->disable_prot_fields(*this);
if (s->with_card(*this))
enable(DLG_SAVEREC);
smartcard_error err = s->read();
if (err == no_smarterror)
s->card2mask(*this);
else
s->display_error(err);
}
}
TVariable_mask::start_run();
}
bool TDocumento_mask::stop_run(KEY key)
{
if (key != K_ESC && key != K_QUIT)
update_progs(true);
else
if (key == K_ESC)
{
TSmart_card * s = smartcard();
if (s != NULL)
{
if (s->card_connected())
{
s->disconnect_card();
enable(F_CODCF);
enable(F_RAGSOC);
}
}
}
return TVariable_mask::stop_run(key);
}
bool TDocumento_mask::on_key(KEY key)
{
if (key == K_SHIFT + K_F12)
{
TRelation r(LF_DOC);
r.curr()=doc();
bool can_save = !doc().bloccato() && !doc().chiuso();
if (can_save && ::user_can_write(&r))
{
TMask_field& stato = field(F_STATO);
stato.enable();
enable(DLG_SAVEREC);
enable(DLG_DELREC);
TSmart_card * s = smartcard();
xvtil_statbar_set(TR("Modifica"));
if (s != NULL && s->card_connected())
s->enable_prot_fields(*this);
}
else
warning_box("L'utente %s non puo' modificare questo documento",
(const char*)user());
return TRUE;
}
else
if (key == K_F7)
{
const TSheet_field & sf = sfield(F_SHEET);
TDocumento & d = doc();
TRiga_documento & riga = d[sf.selected() + 1];
TOriginal_row_mask sm;
const TRectype * or_row = riga.find_original_rdoc();
if (or_row != NULL)
{
sm.set(F_DACODNUM, or_row->get(RDOC_CODNUM));
sm.set(F_DAANNO, or_row->get(RDOC_ANNO));
sm.set(F_DAPROVV, or_row->get(RDOC_PROVV));
sm.set(F_DANDOC, or_row->get(RDOC_NDOC));
sm.set(F_DANRIGA, or_row->get(RDOC_NRIGA));
sm.disable(-1);
}
if (sm.run() == K_ENTER && sm.field(F_DACODNUM).enabled())
{
TToken_string key(sm.get(F_DACODNUM));
key.add(sm.get(F_DAANNO));
key.add(sm.get(F_DAPROVV));
key.add(sm.get(F_DANDOC));
key.add(sm.get(F_DANRIGA));
const TRectype & or_row_mod = cache().get(LF_RIGHEDOC, key);
if (or_row_mod.empty())
riga.reset_original_rdoc_key();
else
riga.set_original_rdoc_key(or_row_mod);
}
return true;
}
return TVariable_mask::on_key(key);
}
void TDocumento_mask::occ2mask()
{
const TOccasionale& o = doc().occas();
reset(F_COFI);
reset(F_PAIVA);
set(F_OCFPI, o.get(OCC_CFPI));
const TString & ragsoc = o.get(OCC_RAGSOC);
set(F_RAGSOC, ragsoc);
set(F_RAGSOCSP, ragsoc);
const TString & indir = o.get(OCC_INDIR);
set(F_INDCF, indir);
set(F_INDSP, indir);
const TString & civ = o.get(OCC_CIV);
set(F_CIVCF, civ);
set(F_CIVSP, civ);
const TString & cap = o.get(OCC_CAP);
set(F_CAPCF, cap);
set(F_CAPSP, cap);
const TString & com = o.get(OCC_COM);
set(F_COMCF, com);
set( F_COMSP, com);
const TString & stato = o.get(OCC_STATO);
set(F_STATOCF, stato);
set( F_STATOSP, stato);
if (id2pos(F_CODINDSP) >= 0)
reset(F_CODINDSP);
// Sugli occasionali non c'<27> la localit<69>
const TString & localita = o.get(OCC_LOCALITA);
set(F_LOCALITACF, localita);
set(F_LOCALITASP, localita);
check_field(F_COMSP);
check_field(F_STATOSP);
}
void TDocumento_mask::cli2mask(bool force_load)
{
TCli_for& c = doc().clifor();
const bool onload = !is_running();
// Setta i campi che appartengono al file LF_CLIFO
const bool occas = c.occasionale();
show(F_OCCASEDIT, occas);
if (!occas)
reset(F_OCFPI);
show(F_OCFPI, occas);
// In forse per l'Occasionale, sicuri per il Normale
show(F_COFI, !occas);
show(F_STATOPAIVA, !occas);
show(F_PAIVA, !occas);
set(F_RAGSOC, c.get(CLI_RAGSOC));
enable(F_RAGSOC, !occas);
const TRectype & ven_rec = c.vendite();
if(force_load || !onload)
{
short pos = id2pos(F_CODVAL);
const TString4 codval = c.get(CLI_CODVAL); // Attenzione: Non usare TString& qui!
if (pos >= 0)
set(F_CODVAL, codval, TRUE);
pos = id2pos(F_CODVAL1);
if (pos >= 0)
set(F_CODVAL1, codval, TRUE);
pos = id2pos(F_CODLIN);
if (pos >= 0 && fld(pos).active())
fld(pos).set(c.get(CLI_CODLIN));
set(F_CODPAG, c.get(CLI_CODPAG));
TToken_string key;
key.add(c.get(CLI_TIPOCF));
key.add(c.get(CLI_CODCF));
key.add("V");
key.add("1");
const TRectype & cfban = cache().get(LF_CFBAN, key);
if (cfban.empty())
{
show(F_CODABIA);
show(F_CODCABA);
enable(F_CODABIA);
enable(F_CODCABA);
hide(F_CODABIA1);
hide(F_CODCABA1);
disable(F_CODABIA1);
disable(F_CODCABA1);
set(F_CODABIA, c.get(CLI_CODABI), 0x3);
set(F_CODCABA, c.get(CLI_CODCAB), 0x3);
if (id2pos(F_IBAN_STATO) > 0)
{
const TString80 iban = c.get(CLI_IBAN);
set(F_IBAN, iban);
efield(F_IBAN_STATO).validate(K_TAB);
if (iban.not_empty())
{
set(F_IBAN_STATO, iban.left(2));
set(F_IBAN_CHECK, iban.mid(2,2));
set(F_BBAN , iban.mid(4));
set(F_BBAN_CIN , iban.mid(4,1));
set(F_BBAN_ABI , iban.mid(5,5));
set(F_BBAN_CAB , iban.mid(10,5));
set(F_BBAN_CONTO, iban.mid(15,12));
}
}
}
else
{
if (id2pos(F_CODABIA1) > 0)
{
show(F_CODABIA1);
show(F_CODCABA1);
enable(F_CODABIA1);
enable(F_CODCABA1);
hide(F_CODABIA);
hide(F_CODCABA);
disable(F_CODABIA);
disable(F_CODCABA);
set(F_CODABIA1, cfban.get(CFBAN_ABI), 0x3);
set(F_CODCABA1, cfban.get(CFBAN_CAB), 0x3);
}
else
{
set(F_CODABIA, cfban.get(CFBAN_ABI), 0x3);
set(F_CODCABA, cfban.get(CFBAN_CAB), 0x3);
}
if (id2pos(F_IBAN_STATO) > 0)
{
const TString80 iban = cfban.get(CFBAN_IBAN);
set(F_IBAN, iban);
efield(F_IBAN_STATO).validate(K_TAB);
if (iban.not_empty())
{
set(F_IBAN_STATO, iban.left(2));
set(F_IBAN_CHECK, iban.mid(2,2));
set(F_BBAN , iban.mid(4));
set(F_BBAN_CIN , iban.mid(4,1));
set(F_BBAN_ABI , iban.mid(5,5));
set(F_BBAN_CAB , iban.mid(10,5));
set(F_BBAN_CONTO, iban.mid(15,12));
}
}
}
key.cut(0);
key.add(c.get(CLI_TIPOCF));
key.add(c.get(CLI_CODCF));
key.add("N");
key.add("1");
const TRectype & cfbanpr = cache().get(LF_CFBAN, key);
// Setta i campi che appartengono al file LF_CFVEN
if (cfbanpr.empty())
{
show(F_CODABIP);
show(F_CODCABP);
show(F_PROGBNP);
enable(F_CODABIP);
enable(F_CODCABP);
enable(F_PROGBNP);
hide(F_CODABIP1);
hide(F_CODCABP1);
hide(F_PROGBNP1);
disable(F_CODABIP1);
disable(F_CODCABP1);
disable(F_PROGBNP1);
set(F_CODABIP, ven_rec.get(CFV_CODABIPR), 0x3);
set(F_CODCABP, ven_rec.get(CFV_CODCABPR), 0x3);
}
else
{
if (id2pos(F_CODABIP1) > 0)
{
show(F_CODABIP1);
show(F_CODCABP1);
show(F_PROGBNP1);
enable(F_CODABIP1);
enable(F_CODCABP1);
enable(F_PROGBNP1);
hide(F_CODABIP);
hide(F_CODCABP);
hide(F_PROGBNP);
disable(F_CODABIP);
disable(F_CODCABP);
disable(F_PROGBNP);
set(F_CODABIP1, cfbanpr.get(CFBAN_ABI), 0x3);
set(F_CODCABP1, cfbanpr.get(CFBAN_CAB), 0x3);
set(F_PROGBNP1, cfbanpr.get(CFBAN_PROGPR), 0x3);
}
else
{
set(F_CODABIP, cfbanpr.get(CFBAN_ABI), 0x3);
set(F_CODCABP, cfbanpr.get(CFBAN_CAB), 0x3);
set(F_PROGBNP, cfbanpr.get(CFBAN_PROGPR), 0x3);
}
}
set(F_RAGGR, ven_rec.get(CFV_RAGGDOC));
set(F_RAGGREFF, ven_rec.get(CFV_RAGGEFF));
set(F_CODINDSP, ven_rec.get(CFV_CODINDSP));
set(F_CODAG, ven_rec.get(CFV_CODAG));
set(F_CODAGVIS, ven_rec.get(CFV_CODAG1));
set(F_CODSPMEZZO, ven_rec.get(CFV_CODSPMEZZO));
set(F_CODPORTO, ven_rec.get(CFV_CODPORTO));
set(F_CODNOTESP1, ven_rec.get(CFV_CODNOTESP1));
set(F_CODNOTESP2, ven_rec.get(CFV_CODNOTESP2));
set(F_CODNOTE, ven_rec.get(CFV_CODNOTE));
set(F_CODVETT1, ven_rec.get(CFV_CODVETT1));
set(F_CODVETT2, ven_rec.get(CFV_CODVETT2));
set(F_CODVETT3, ven_rec.get(CFV_CODVETT3));
set(F_SPESEINC, ven_rec.get(CFV_PERCSPINC));
set(F_ADDBOLLI, ven_rec.get(CFV_ADDBOLLI));
set(F_CATVEN, ven_rec.get(CFV_CATVEN));
set(F_LIQDIFF, c.get_int(CLI_ALLEG) == 7 && ven_rec.get_bool(CFV_FATTSOSP) ? "X" : "");
pos = id2pos(F_CODLIST);
const TString8 codlist = ven_rec.get(CFV_CODLIST); //ATTENZIONE: su file il CODLIST <20> 5 caratteri
if (pos >= 0 && fld(pos).active())
{
TEdit_field & f = (TEdit_field&) fld(pos);
f.set(codlist);
f.check();
f.on_hit();
}
/* pos = id2pos(F_CODAG);
if (pos >= 0 && fld(pos).active())
fld(pos).set(ven_rec.get(CFV_CODAG)); */
set(F_CODZON, ven_rec.get(CFV_CODZONA), 0x3);
set(F_RAGGR, ven_rec.get(CFV_RAGGDOC));
sconto_testa2mask();
spese2mask();
}
else
if (onload)
{
TToken_string key;
key.add(c.get(CLI_TIPOCF));
key.add(c.get(CLI_CODCF));
key.add("V");
key.add("1");
const TRectype & cfban = cache().get(LF_CFBAN, key);
if (cfban.empty())
{
show(F_CODABIA);
show(F_CODCABA);
enable(F_CODABIA);
enable(F_CODCABA);
hide(F_CODABIA1);
hide(F_CODCABA1);
disable(F_CODABIA1);
disable(F_CODCABA1);
}
else
{
if (id2pos(F_CODABIA1) > 0)
{
show(F_CODABIA1);
show(F_CODCABA1);
enable(F_CODABIA1);
enable(F_CODCABA1);
hide(F_CODABIA);
hide(F_CODCABA);
disable(F_CODABIA);
disable(F_CODCABA);
}
}
key.cut(0);
key.add(c.get(CLI_TIPOCF));
key.add(c.get(CLI_CODCF));
key.add("N");
key.add("1");
const TRectype & cfbanpr = cache().get(LF_CFBAN, key);
if (cfbanpr.empty())
{
show(F_CODABIP);
show(F_CODCABP);
show(F_PROGBNP);
enable(F_CODABIP);
enable(F_CODCABP);
enable(F_PROGBNP);
hide(F_CODABIP1);
hide(F_CODCABP1);
hide(F_PROGBNP1);
disable(F_CODABIP1);
disable(F_CODCABP1);
disable(F_PROGBNP1);
}
else
{
if (id2pos(F_CODABIP1) > 0)
{
show(F_CODABIP1);
show(F_CODCABP1);
show(F_PROGBNP1);
enable(F_CODABIP1);
enable(F_CODCABP1);
enable(F_PROGBNP1);
hide(F_CODABIP);
hide(F_CODCABP);
hide(F_PROGBNP);
disable(F_CODABIP);
disable(F_CODCABP);
disable(F_PROGBNP);
}
}
}
enable( F_CODINDSP , !occas);
if (occas)
occ2mask();
else
{
set(F_COFI, c.get(CLI_COFI));
set(F_INDCF, c.get(CLI_INDCF));
set(F_CIVCF, c.get(CLI_CIVCF));
set(F_STATOPAIVA, c.get(CLI_STATOPAIV));
set(F_PAIVA, c.get(CLI_PAIV));
set(F_LOCALITACF, c.get(CLI_LOCCF));
set(F_CAPCF, c.get(CLI_CAPCF));
set(F_COMCF, c.get(CLI_COMCF));
set(F_STATOCF, c.get(CLI_STATOCF));
check_field( F_CODINDSP );
}
const TString4 newcodval(get(F_CODVAL));
short pos = id2pos(F_CAMBIO);
if ((pos >= 0) && newcodval.empty())
fld(pos).reset();
pos = id2pos(F_CODVAL);
if (pos >= 0 && fld(pos).active())
fld(pos).check(STARTING_CHECK);
pos = id2pos(F_CODVAL1);
if (pos >= 0 && fld(pos).active())
fld(pos).check(STARTING_CHECK);
check_field(F_COMCF);
check_field(F_STATOCF);
check_field( F_CODPAG );
pos = id2pos(F_CODLIN);
if (pos >= 0 && fld(pos).active())
fld(pos).check();
pos = id2pos(F_CODLIST);
if (pos >= 0 && fld(pos).active())
fld(pos).check();
pos = id2pos(F_CODAG);
if (pos >= 0 && fld(pos).active())
fld(pos).check();
pos = id2pos(F_CODAGVIS);
if (pos >= 0 && fld(pos).active())
fld(pos).check();
check_field( F_CODSPMEZZO );
check_field( F_CODPORTO );
check_field( F_CODNOTESP1 );
check_field( F_CODNOTESP2 );
check_field( F_CODNOTE );
check_field( F_CODVETT1 );
check_field( F_CODVETT2 );
check_field( F_CODVETT3 );
check_field( F_CATVEN );
check_field( F_CODZON );
//gestione contratti
bool gescontr = ven_rec.get_bool(CFV_GESTCONTR) && ini_get_bool(CONFIG_DITTA, "ve", "GES", false, 2);
enable(F_CODCONT, gescontr);
enable(F_DESCONT, gescontr);
}
void TDocumento_mask::sconto_testa2mask()
{
const TCli_for& c = doc().clifor();
TConfig ditta(CONFIG_DITTA, "ve");
const char tipogestione = ditta.get("GESSCO")[ 0 ];
switch( tipogestione )
{
case 'N': // Sconti non gestiti: pussa via!
break;
case 'P': // Percentuale su anagrafica cliente
set( F_SCONTOPERC, c.vendite().get(CFV_SCONTO));
break;
case 'T': // Gestione tabella sconti
{
const TString16 codsconto(c.vendite().get(CFV_CODSCC));
if (codsconto.not_empty())
{
TTable sconti("%SCC");
sconti.setkey(1);
sconti.zero();
sconti.put("CODTAB", codsconto);
if (sconti.read( ) == NOERR)
set(F_SCONTOPERC, sconti.get("S1"));
}
}
break;
case 'A': // Gestione archivio sconti
{
TString16 cod;
const TRectype & ven_rec = c.vendite();
TLocalisamfile sconti(LF_SCONTI );
sconti.setkey(1);
sconti.zero();
sconti.put("TIPO", "I");
if(ditta.get_bool("SCOKEY", "ve", 1))
sconti.put("CODCAT", ven_rec.get(CFV_CATVEN));
if(ditta.get_bool("SCOKEY", "ve", 2))
cod.format("%-2s", (const char *)ven_rec.get(CFV_CODSCC));
else
cod = " ";
if( ditta.get_bool("SCOKEY", "ve", 3))
{
TString8 cz; cz.format("%-2s", (const char*)ven_rec.get(CFV_CODZONA));
cod << cz;
}
else
cod << " ";
if( ditta.get_bool("SCOKEY", "ve", 4))
cod << c.get(CLI_CODPAG);
sconti.put("CODART", cod);
if(sconti.read() == NOERR)
set(F_SCONTOPERC, sconti.get( "SCONTO"));
}
break;
default:
break;
}
return;
}
void TDocumento_mask::spese2mask()
{
TSheet_field & sh = (TSheet_field &) field(F_SHEET);
TCli_for & c = doc().clifor();
TString16 name("CODSP0");
TString_array spese;
const TRectype & ven_rec = c.vendite();
for (int i = 1; i <= 4; i++)
{
name.rtrim(1); name << i;
const TString16 s(ven_rec.get(name));
if (s.not_empty())
spese.add(s);
}
doc().put(DOC_SPESEUPD, false);
doc().put(DOC_CODVAL, get(F_CODVAL));
doc().put(DOC_CAMBIO, get(F_CAMBIO));
doc().put(DOC_CONTROEURO, get(F_CONTROEURO));
doc().update_spese_aut(spese, false, &sh);
sh.force_update();
}
void TDocumento_mask::reset_masks(const TString& tipo_doc)
{
static TString16 last_tipo_doc;
if (tipo_doc != last_tipo_doc)
{
FOR_EACH_ASSOC_OBJECT(_maskriga, h, k, o)
{
TMask* m = (TMask*)o;
m->enable_default();
if (!_sheet->exist_column(FR_PREZZO))
m->hide(FR_PREZZO);
}
last_tipo_doc = tipo_doc;
}
}
void TDocumento_mask::doc2mask(bool reload_clifo, bool force_load, bool update)
{
for (int p = fields()-1; p >= 0; p--)
{
TMask_field& f = fld(p);
const TFieldref* fr = f.field();
if (fr)
{
f.set(fr->read(doc()));
if (f.ghost() && !f.active())
f.on_hit(); // Forza il MESSAGE COPY dei campi di testata come DOC_STATO
}
// else
// f.reset(); // Perch<63> non lascio stare questi campi?
}
if (reload_clifo)
cli2mask(force_load);
else
{
if (force_load)
{
check_field(F_CODCF);
check_field(F_CODINDSP);
}
if (id2pos(F_IBAN_STATO) > 0)
{
const TString80 iban = doc().get(DOC_IBAN);
set(F_IBAN, iban);
efield(F_IBAN_STATO).validate(K_TAB);
if (iban.not_empty())
{
set(F_IBAN_STATO, iban.left(2));
set(F_IBAN_CHECK, iban.mid(2,2));
set(F_BBAN , iban.mid(4));
set(F_BBAN_CIN , iban.mid(4,1));
set(F_BBAN_ABI , iban.mid(5,5));
set(F_BBAN_CAB , iban.mid(10,5));
set(F_BBAN_CONTO, iban.mid(15,12));
}
}
}
TSheet_field& s = sfield(F_SHEET);
s.destroy();
const int righe = doc().physical_rows();
for (int i = 0; i < righe; i++)
{
TRiga_documento & r = doc()[i + 1];
doc()[i+1].autoload(s);
s.check_row(i, 0x3);
if (r.tipo().tipo() == RIGA_PRESTAZIONI)
{
const TSpesa_prest & spesa = r.spesa();
if (spesa.tipo() == 'V')
s.disable_cell(i, s.cid2index(FR_QTA));
}
}
reset_masks(get(F_TIPODOC));
//aggiorna i colori delle righe e forza l'update dello sheet
if (update)
highlight();
}
void TDocumento_mask::mask2doc()
{
for (int p = fields()-1; p >= 0; p--)
{
TMask_field& f = fld(p);
const TFieldref* fr = f.field();
if (fr)
fr->write(f.get(), doc());
}
}
bool TDocumento_mask::new_mask(int numriga) const
{
const TRiga_documento& riga = doc()[numriga + 1];
const TTipo_riga_documento& tiporiga = riga.tipo();
TString16 name; tiporiga.mask_name(name);
return _maskriga.objptr(name) == NULL;
}
static bool descr_filter_handler(TMask_field& f, KEY k)
{
if (k == K_SPACE)
{
TString expr;
if (!f.get().empty()) // Filtro attivato!
{
const short id = f.dlg()-500;
TString e = f.mask().get(id); // Espressione regolare
e.strip("\"'"); // Tolgo caratteri che potrebbero dare problemi
if (!e.blank())
expr << "(DESCR+DESCRAGG)" << "?=\"" << e << '"';
if (expr.empty())
f.reset();
}
((TBrowse_sheet&) f.mask()).add_custom_filter(expr);
}
return true;
}
TVariable_mask* TDocumento_mask::riga_mask(int numriga)
{
const TRiga_documento& riga = doc()[numriga + 1];
const TTipo_riga_documento& tiporiga = riga.tipo();
TString16 name; tiporiga.mask_name(name);
TVariable_mask* m = (TVariable_mask*)_maskriga.objptr(name);
if (m == NULL)
{
m = new TVariable_mask(name);
m->set_handler(FR_TIPORIGA, tipo_riga_handler);
m->set_handler( FR_QTA, qta_handler );
m->set_handler( FR_UMQTA, um_handler );
m->set_handler( FR_DATACONS, dcons_handler);
_maskriga.add(name, m);
TList_field & htr = lfield(F_LBTIPORIGA);
const TString codes(htr.get_codes());
const TString values(htr.get_values());
m->lfield(FR_TIPORIGA).replace_items(codes, values);
int pos = m->id2pos(FR_CODART);
if (pos >= 0)
{
const TMask_field & f = m->fld(pos);
if (f.is_edit())
{
TBrowse * browse = ((TEdit_field &) f).browse();
const char tipo_r = tiporiga.tipo();
if (browse )
{
const TCursor * cur = browse->cursor();
if (cur)
{
const int num = cur->file().num();
if (num == LF_ANAMAG || num == LF_CODCORR)
{
m->set_handler( FR_CODMAG, codmag_handler );
m->set_handler( FR_CODMAGC, codmag_coll_handler );
m->set_handler( FR_CODART, codart_handler );
m->set_handler( FR_LIV1, liv_handler );
m->set_handler( FR_LIV2, liv_handler );
m->set_handler( FR_LIV3, liv_handler );
m->set_handler( FR_LIV4, liv_handler );
m->set_handler( FR_UMQTA, umart_handler );
m->set_handler( FR_CODARTMAG, codartmag_handler );
m->set_handler( FR_DESCR, descr_handler );
m->set_handler( FR_QTA, qtaart_handler );
if (livelli().autoinsert(1))
m->field(FR_LIV1).check_type(CHECK_NONE);
if (livelli().autoinsert(2))
m->field(FR_LIV2).check_type(CHECK_NONE);
if (livelli().autoinsert(3))
m->field(FR_LIV3).check_type(CHECK_NONE);
if (livelli().autoinsert(4))
m->field(FR_LIV4).check_type(CHECK_NONE);
}
else
if (tipo_r == RIGA_SPESEDOC || tipo_r == RIGA_PRESTAZIONI ||
tipo_r == RIGA_RISORSE || tipo_r == RIGA_ATTREZZATURE)
m->set_handler( FR_CODART, sppr_handler );
}
}
}
}
if (tiporiga.extended_desc_search())
{
pos = m->id2pos(FR_DESCRART);
if (pos >= 0)
{
const TMask_field & f = m->fld(pos);
if (f.is_edit())
{
TBrowse * browse = ((TEdit_field &) f).browse();
if (browse )
{
TRelation * r = new TRelation(LF_ANAMAG);
TSorted_cursor * c = new TSorted_cursor(r,ANAMAG_DESCR "|" ANAMAG_DESCRAGG, "", 2);
browse->set_cursor(c);
browse->set_custom_filter_handler(descr_filter_handler);
}
}
}
}
m->set_handler(FR_QTAEVASA, qta_evasa_handler);
m->set_handler(FR_CAUS, causmag_handler);
if (m->id2pos(FR_CODIVA) >= 0)
{
m->set_handler(FR_CODIVA, iva_handler);
const TString& tipiva = doc().tipo().tipi_iva_validi();
if (tipiva.not_empty())
{
TBrowse& browse = *(m->efield(FR_CODIVA)).browse();
TString filter = browse.get_filter();
bool close_filter = FALSE;
if (filter.not_empty())
{
filter.insert("(");
filter << ")&&(";
close_filter = TRUE;
}
bool firstor = TRUE;
for (int i = tipiva.len()-1; i >= 0; i--) if (tipiva[i] != ' ')
{
if (firstor)
firstor = FALSE;
else
filter << "||";
filter << "(S1==\"";
switch(i)
{
case 1: filter << "VE"; break;
case 2: filter << "ES"; break;
case 3: filter << "NI"; break;
case 4: filter << "NS"; break;
default: break;
}
filter << "\")";
}
if (close_filter) filter << ')';
browse.set_filter(filter);
}
}
m->set_handler(DLG_USER, link_handler);
// Quasi qualsiasi cosa analitica va bene
const bool ca_active = _ges_ca && !(riga.is_descrizione() || riga.is_sconto() /*|| riga.is_omaggio()*/);
if (ca_active)
{
const int page = m->win2page(m->fld(m->fields()-1).parent()); // Calcolo bastardo dell'ultima pagina
TConfig& ini = ca_config();
const TMultilevel_code_info& fasinfo = ca_multilevel_code_info(LF_FASI);
const bool use_fsc = fasinfo.levels() > 0;
int y = 1;
int i;
short dlg = FR_CDC1; // id del primo campo da generare
short dlgd = FR_DESCDC1;
_cdc_start_sh = _cdc_end_sh = -1 ;
_cms_start_sh = _cms_end_sh = -1 ;
for (i = 0; i < 2; i++)
{
const TString& level = ini.get("Level", NULL, i+1); // Legge il livello 1 o 2
if (level == "CDC") // Crea centro di costo
{
if (_cdc_start_sh < 0)
{
_cdc_start_sh = dlg;
_cdc_end_sh = dlg + ca_multilevel_code_info(LF_CDC).levels()-1;
}
if (use_fsc && fasinfo.parent() == LF_CDC)
insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false);
else
insert_anal_fields(*m, page, LF_CDC, y, dlg, dlgd, false);
m->set_handler( _cdc_end_sh, cdc_mag_handler);
} else
if (level == "CMS") // Crea commessa
{
if (_cms_start_sh < 0)
{
_cms_start_sh = dlg;
_cms_end_sh = dlg + ca_multilevel_code_info(LF_COMMESSE).levels()-1;
}
if (use_fsc && fasinfo.parent() == LF_COMMESSE)
insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false);
else
{
insert_anal_fields(*m, page, LF_COMMESSE, y, dlg, dlgd, false);
}
m->set_handler(_cms_end_sh, cms_mag_handler);
}
}
if (use_fsc && fasinfo.parent() <= 0)
insert_anal_fields(*m, page, LF_FASI, y, dlg, dlgd, false);
}
TFilename proname; tiporiga.profile_name(proname);
TConfig pro( proname, "HANDLERS" );
TAssoc_array& handlers = pro.list_variables();
FOR_EACH_ASSOC_STRING(handlers, obj, key, str)
{
int id = 0, hd = 0;
if (*key == 'H' && strchr(str, '|') == NULL) // Provo a gestire il caso Handler(105) = 3
{
const TFixed_string k(key);
id = atoi(k.after('('));
hd = atoi(str);
}
else // Provo a gestire il caso 1 = 105|3
{
const TToken_string riga = str;
riga.get(0, id);
riga.get(1, hd);
}
if (id >= DLG_USER && hd > 0)
user_set_row_handler(*m, id, hd);
}
if (m->id2pos(FR_PREZZO) >= 0)
{
TEditable_field& f = (TEditable_field&)m->efield(FR_PREZZO);
f.reset_driver(F_CODVAL);
f.add_driver(-F_CODVAL);
}
if (m->id2pos(FR_IMPFISSO) >= 0)
{
TEditable_field& f = m->efield(FR_IMPFISSO);
f.reset_driver(); // Perche' qui non c'e' scritto f.reset_driver(F_CODVAL) ?
f.add_driver(-F_CODVAL);
}
FOR_EACH_CONAI_CLASS(type)
{
const short posc = conai_sottocat_id(type);
const short posp = conai_peso_id(type);
if (conai_configured_class(type))
{
m->show(posc);
m->set_handler(posc, sottocat_conai_handler);
m->show(posp);
m->set_handler(posp, peso_conai_handler);
}
else
{
m->hide(posc);
m->hide(posp);
}
}
// Impostiamo gli eventuali drivers
FOR_EACH_MASK_FIELD((*m), i, f) if (f->is_edit())
((TEdit_field*)f)->test_drivers();
}
m->set_sheet(&sfield(F_SHEET));
return m;
}
void TDocumento_mask::update_giacenza()
{
if (id2pos(F_CURGIAC)<0 || !is_running())
return;
TSheet_field& sf = sfield(F_SHEET);
TToken_string& row = sf.row(sf.selected());
TString80 codart = row.get(sf.cid2index(FR_CODARTMAG));
if (codart.blank())
{
reset(F_CURGIAC);
reset(F_CURDISP);
return;
}
TString16 livello;
const int db_liv = doc().tipo().dbliv();
for (int i = 0; i < 4; i++)
{
const char* liv = row.get(sf.cid2index(FR_LIV1+i));
if (*liv > ' ')
livello << liv;
else
break;
}
TString16 causmag = row.get(sf.cid2index(FR_CAUS));
if (causmag.blank())
causmag = get(F_CAUSMAG);
if ( causmag.full())
{
const TCausale_magazzino& c = cached_causale_magazzino(causmag);
_fconv_qta = UNO;
if (c.scarica_alternativi())
{
const TString& alt = cached_article(codart).get(ANAMAG_CODARTALT);
if (alt.full())
codart = alt;
}
if (db_liv > 0)
{
const int expl_row = doc().tipo().dbrow()-1; // Sul file .ini l'indice parte da 1!
if (expl_row >= 0) // Evito esplosioni inutili in primis
{
TDistinta_tree db;
TArray components;
db.set_root(codart, "", 1, livello);
const int items = db.explode(components, false, RAGGR_EXP_NONE, db_liv);
if (items > 0 && expl_row < items) // Controllo se la riga esplosione desiderata e' valida
{
const TRiga_esplosione& r = (const TRiga_esplosione &)components[expl_row];
codart = r.articolo(); // Cambio il codice articola da elaborare
_fconv_qta = r.val();
}
}
}
}
real giac, disp;
TString8 codmag = row.get(sf.cid2index(FR_CODMAG));
if (codmag.full())
{
const TString4 coddep = row.get(sf.cid2index(FR_CODDEP));
if (coddep.full())
codmag << coddep;
}
else
{ // Cerca di determinare il magazzino di default, se manca sulla riga
if (causmag.full())
{
const TCausale_magazzino& c = cached_causale_magazzino(causmag);
if (c.has_default_mag())
{
codmag = c.default_mag();
if (c.has_default_dep())
codmag << c.default_dep();
}
}
}
const TString& annoes = get(F_ANNO);
TArticolo_giacenza& art = cached_article_balances(codart);
giac = art.disponibilita(annoes, codmag, livello, TRUE);
disp = art.disponibilita(annoes, codmag, livello, FALSE);
if (db_liv == 0)
{
const TString4 um = row.get(sf.cid2index(FR_UMQTA));
art.convert_to_um(giac, um);
art.convert_to_um(disp, um);
}
set(F_CURGIAC, giac.string());
set(F_CURDISP, disp.string());
}
///////////////////////////////////////////////////////////
// Handlers and notifiers
///////////////////////////////////////////////////////////
bool TDocumento_mask::ss_handler(TMask_field& f, KEY key)
{
bool ok = TRUE;
if (key == K_ENTER && f.mask().insert_mode())
{
TSheet_field& ss = (TSheet_field&)f;
if (!app().is_transaction() && ss.empty())
ok = yesno_box(TR("Il documento e' privo di righe:\n"
"Si desidera continuare ugualmente?"));
}
return ok;
}
bool TDocumento_mask::ss_notify( TSheet_field& ss, int r, KEY key )
{
static bool selecting = false;
TDocumento_mask& m = (TDocumento_mask&)ss.mask();
TDocumento& doc = m.doc();
switch (key)
{
case K_ENTER: // modifica
{
TRiga_documento& riga = doc[r + 1];
riga.autosave(ss);
if (m.is_calculated_page(m.curr_page()))
m.update_progs();
m.highlight_row(r);
}
break;
case K_CTRL + K_ENTER: // inizio modifica
{
TRiga_documento& riga = doc[r + 1];
m.codcms_sh() = riga.get(RDOC_CODCMS);
}
case K_DEL: // Cancellazione
{
doc.destroy_row(r + 1, TRUE);
if (r < doc.rows())
{
TRiga_documento & riga = doc[r + 1];
if (riga.is_omaggio() && riga.is_generata())
{
ss.destroy(r + 1);
doc.destroy_row(r + 1, true);
}
}
doc.dirty_fields();
if (m.is_calculated_page(ss.page()))
m.update_progs();
}
break;
case K_INS: // Inserimento
{
if (r < doc.rows())
{
TRiga_documento & riga = doc[r + 1];
if (riga.is_omaggio() && riga.is_generata())
{
const bool enabled = ss.cell_enabled(r, 0);
if (!enabled) ss.enable_row(r);
ss.force_update(r);
ss.select(r);
m.send_key(K_CTRL + '+', 0);
if (!enabled) ss.disable_row(r);
ss.force_update(r);
return false;
}
}
doc.insert_row(r + 1, m.get( F_LBTIPORIGA ));
}
break;
case K_CTRL + K_INS:
{
TRiga_documento & riga = doc[r + 1];
TRectype & ven_rec = doc.clifor().vendite();
TString8 s(ven_rec.get(CFV_CODMAG));
const TTipo_riga_documento & t = riga.tipo();
if (s.full())
{
s.left_just(3);
s << ven_rec.get(CFV_CODDEP);
}
else
{
s = m.get(F_CAUSMAG);
if (s.full())
{
const TCausale_magazzino & c = cached_causale_magazzino(s);
if (!c.empty() && c.get_char("S10") > ' ') // Ignora magazzini non validi
s = c.get("S10");
else
{
s = m._std_mag;
s.left_just(3);
s << m._std_dep;
}
}
}
if (s.full())
riga.put(RDOC_CODMAG, s);
riga.autoload(ss);
ss.check_row(r);
t.set_defaults(ss, r + 1);
m.highlight_row(r);
}
break;
case K_TAB: // ingresso nella riga
if (!selecting && m.is_running())
{
const TRiga_documento& rdoc = doc[r + 1];
TMask & riga_mask = ss.sheet_mask();
if (r < doc.physical_rows())
{
m.update_giacenza();
const TRectype& rdoc = doc[r + 1];
set_curr_um(rdoc.get(RDOC_UMQTA));
const bool on = rdoc.get(RDOC_DACODNUM).full();
riga_mask.enable(DLG_USER, on);
}
const bool merce = TRiga_documento::tipo(riga_mask.get(FR_TIPORIGA)).is_merce();
const bool artmag = merce && riga_mask.get(FR_CODARTMAG).full();
riga_mask.show(FR_UMQTA, artmag);
riga_mask.show(FR_UMQTA2, !artmag);
if (rdoc.get(RDOC_CODART).empty() && rdoc.get(RDOC_DESCR).empty())
{
selecting = true; // semaforo per impedire l'evento di selezione doppio
ss.select(r, 1, false);
selecting = false;
}
}
break;
case K_CTRL + K_TAB: // uscita dalla riga
{
static const bool checkgiac = ini_get_bool(CONFIG_DITTA, "ve", "LIVPERART");
bool ok = true;
if (checkgiac)
{
TString livello;
TToken_string & row = ss.row(r);
for (int l = 0; l<4 ; l++)
doc.livelli().pack_grpcode(livello, row.get(ss.cid2index(FR_LIV1+l)), l+1);
if (livello.full())
{
const TString80 codart(row.get(ss.cid2index(FR_CODART)));
const TRectype & rec = cache().get(LF_ANAMAG, codart);
const bool check_art = rec.get_bool(ANAMAG_LIVPERART);
if (check_art)
{
TLocalisamfile fl(LF_MULTIREL);
TRectype & r = fl.curr();
r.put(MULTI_COD, "ARTLV");
r.put(MULTI_FIRST, codart);
r.put(MULTI_SECOND, livello);
TRectype new_rec(r);
if (fl.read() != NOERR)
{
ok = yesno_box("Il codice di giacenza %s non e' legato all' articolo. Devo legarlo", (const char *)livello);
if (ok)
{
r = new_rec;
const int err = new_rec.write(fl);
if (err != NOERR)
return error_box("Non sono riuscito a legare il codice di giacenza. Errore %d", err);
}
else
return false;
}
}
}
}
}
break;
default:
break;
}
return true;
}
// Funzione che dato il profilo di riga ottiene la maschera
// Serve per ottenere una maschera diversa per ogni riga
TMask* TDocumento_mask::ss_getmask(int numriga, TMask& fullmask)
{
TSheet_field* sf = fullmask.get_sheet();
TDocumento_mask& m = (TDocumento_mask&)sf->mask();
const TDocumento& doc = m.doc();
if (numriga < doc.physical_rows())
return m.riga_mask(numriga);
else
return &fullmask;
}
bool TDocumento_mask::occas_code_handler(TMask_field& f, KEY key)
{
TMask& m = f.mask();
if (key == K_TAB && (f.dirty() || !m.is_running()))
{
const TString& code = f.get();
if (code.full())
{
TRelation occas(LF_OCCAS);
occas.curr().put(OCC_CFPI, code);
if (occas.read(_isequal) == NOERR)
{
m.autoload(occas);
m.send_key(K_TAB, O_COMUNE); // Forza decodifica comuni
m.send_key(K_TAB, O_COMUNENAS);
}
}
}
return true;
}
bool TDocumento_mask::occas_cfpi_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER)
{
const TMask& om = f.mask();
if (om.field(O_COFI).empty() && om.field(O_PAIV).empty())
return f.error_box(TR("E' necessario specificare il codice fiscale o la partita IVA"));
}
return true;
}
bool TDocumento_mask::occas_handler( TMask_field& f, KEY key )
{
TDocumento_mask & m = (TDocumento_mask &)f.mask();
if ( key == K_SPACE && m.is_running( ) )
{
TDocumento& doc = m.doc();
TOccasionale& occ = doc.occas();
TMask occas_mask("ve0100o");
occas_mask.set_handler(O_CODICE, occas_code_handler );
occas_mask.set_handler(O_COFI, occas_cfpi_handler );
occas_mask.set_handler(O_PAIV, occas_cfpi_handler );
for (int i = occas_mask.fields() - 1; i >= 0; i--)
{
TMask_field & f = occas_mask.fld(i);
const TFieldref * c = f.field();
if (c)
f.set(c->read(occ));
}
if (occas_mask.run() != K_ESC)
{
const TString ocfpi(occas_mask.get(O_CODICE));
doc.put("OCFPI", ocfpi);
m.set(F_OCFPI, ocfpi);
for (int i = occas_mask.fields() - 1; i >= 0; i--)
{
const TMask_field& f = occas_mask.fld(i);
const TFieldref* c = f.field();
if (c)
{
const char* val = f.get();
c->write(val, occ);
}
}
m.occ2mask();
}
f.set_focus( );
}
return TRUE;
}
bool TDocumento_mask::clifo_handler( TMask_field& f, KEY key )
{
if (key != K_ENTER && f.to_check(key, true))
{
TDocumento_mask& m = (TDocumento_mask&)f.mask();
TDocumento& d = m.doc();
TTipo_documento& tdoc = (TTipo_documento&)d.tipo();
d.put(DOC_TIPOCF, tdoc.tipocf());
d.put(DOC_CODCF, f.get());
TCli_for& cli_for = d.clifor(true); // force reload
if ( cli_for.get_bool(CLI_SOSPESO) )
return f.error_box( "Il codice '%ld' e' sospeso e non puo' essere utilizzato", atol(f.get()));
m.cli2mask();
if (m.id2pos(F_CODCONT) >= 0)
{
TEdit_field & e = m.efield(F_CODCONT);
if (e.active())
{
e.set_dirty();
e.check();
e.on_hit();
}
}
if (cli_for.occasionale())
{
const TOccasionale& occas = d.occas();
if(m.id2pos(F_OCCASEDIT) > 0 && f.to_check(key) && occas.codice().blank())
m.send_key( K_SPACE, F_OCCASEDIT ); // Lancia maschera occasionali
}
else
d.zero(DOC_OCFPI);
}
return true;
}
void TDocumento_mask::highlight_row(int row, COLOR back, COLOR fore, bool dirty, bool update)
{
TRiga_documento& rigadoc = doc()[row + 1];
TSheet_field& sf = sfield(F_SHEET);
// COLOR back = COLOR_INVALID, fore = COLOR_INVALID;
FOR_EACH_ARRAY_ITEM_BACK(color_rules(), rule, o)
{
TColor_rule& expr = *(TColor_rule*)o;
bool on = false;
if (rule == 0)
on = rigadoc.linked(); // Regola standard
else
{
expr.set_row(&rigadoc);
// SET VARS
const int vars = expr.numvar();
TString name;
for (int i = 0; i < vars; i++)
{
name = expr.varname(i);
if (name.starts_with("DIRTY"))
expr.setvar(i, dirty ? UNO : ZERO);
else
if (name.starts_with("#"))
{
const short id = atoi(name.mid(1));
if (id > 0)
{
TToken_string& sheet_row = sf.row(row);
expr.setvar(i, sheet_row.get(sf.cid2index(id)));
}
else
expr.setvar(i, get(-id));
}
else
if (name.starts_with("33.") || name.starts_with("DOC."))
{
const TString& fldname = name.after('.');
expr.setvar(i, doc().get(fldname));
}
else
{
const TString& fldname = name.find('.') > 0 ? name.after('.') : name;
expr.setvar(i, rigadoc.get(fldname));
}
}
on = expr.as_bool();
}
if (on)
{
expr.colors(back, fore);
break;
}
}
sf.set_back_and_fore_color(back, fore, row);
if (update)
sf.force_update(row);
}
void TDocumento_mask::highlight()
{
TSheet_field& sf = sfield(F_SHEET);
FOR_EACH_SHEET_ROW(sf, i, r)
highlight_row(i, COLOR_INVALID, COLOR_INVALID, false, false);
sf.force_update();
}
///////////////////////////////////////////////////////////
// TLista_elaborazioni
///////////////////////////////////////////////////////////
class TLista_elaborazioni : public TObject // velib04
{
TAssoc_array * _elab;
protected:
void read();
public:
TElaborazione & operator [](const char * key) const;
int select(TString_array & result, const char * tipo_iniziale = NULL, const char * stato_iniziale = NULL, const char * tipo_finale = NULL, const char * stato_finale = NULL);
void update();
TLista_elaborazioni() : _elab(NULL) {}
virtual ~TLista_elaborazioni();
};
void TLista_elaborazioni::read()
{
if (_elab == NULL)
{
_elab = new TAssoc_array();
TTable eld("%ELD");
for (int err = eld.first(); err == NOERR; err = eld.next())
{
TElaborazione * el = NULL;
switch (eld.curr().get_int("I0"))
{
case _esterna :
el = new TElaborazione_esterna(eld.curr());
break;
case _consegna_ordini:
el = new TConsegna_ordini(eld.curr());
break;
case _fatturazione_bolle :
el = new TFatturazione_bolle(eld.curr());
break;
case _contabilizzazione :
el = new TContabilizzazione(eld.curr());
break;
case _copia_documento :
el = new TCopia_documento(eld.curr());
break;
case _generazione_effetti :
el = new TGenerazione_effetti(eld.curr());
break;
case _consuntivazione_produzione :
el = new TConsuntivazione_produzione(eld.curr());
break;
case _contabilizzazione_analitica :
el = new TContabilizzazione_analitica(eld.curr());
break;
default :
break;
}
_elab->add(el->codice(), el);
}
}
}
int TLista_elaborazioni::select(TString_array & result, const char * tipo_iniziale, const char * stato_iniziale, const char * tipo_finale, const char * stato_finale)
{
read();
_elab->restart();
result.destroy();
for (TElaborazione* el = (TElaborazione*)_elab->get(); el != NULL; el = (TElaborazione*)_elab->get())
{
bool ok = false;
TString ti;
if ((tipo_iniziale && *tipo_iniziale) && (stato_iniziale && *stato_iniziale))
for (int i = 0; !ok && i < TElaborazione::_max_tipi_doc_elab; i++)
{
ti = el->tipo_iniziale(i);
const char si = el->stato_iniziale(i);
ok |= ti == tipo_iniziale &&
si == *stato_iniziale;
}
else
ok = true;
if ((tipo_finale && *tipo_finale) && (stato_finale && *stato_finale))
ok &= el->tipo_finale() == tipo_finale &&
el->stato_finale() == stato_finale;
if (ok)
result.add(el->codice());
}
return result.items();
}
TElaborazione & TLista_elaborazioni::operator [](const char * key) const
{
((TLista_elaborazioni *)this)->read();
return (TElaborazione &) (*_elab)[key];
}
void TLista_elaborazioni::update()
{
delete _elab; _elab = NULL;
read();
}
TLista_elaborazioni::~TLista_elaborazioni()
{
if (_elab)
delete _elab;
}
///////////////////////////////////////////////////////////
// TDocument_tree
///////////////////////////////////////////////////////////
class TDocument_tree : public TBidirectional_tree
{
TRelation* _relation;
TCursor* _cursor;
TToken_string _curnode;
bool _multiple_selection;
TAssoc_array _selected_docs;
TString _selected;
protected:
virtual void node2id(const TObject* node, TString& id) const;
bool on_head() const;
bool on_row() const;
void format_field(const TRectype& rec, const TString& field, TString& str) const;
void append_custom_fields(const TTipo_documento& tipo, const TRectype& rec, TString& str) const;
public:
void multiple_selection(bool on);
bool multiple_selection() const { return _multiple_selection;}
bool node_selected(const TObject* node = NULL) const;
void select_node(const TObject* node = NULL, bool on = true);
real select_doc(long numdoc);
void build_doc_list(TLista_documenti & docs);
void unselect_node(const TObject* node) { select_node(node, false);}
virtual bool goto_root();
virtual bool goto_firstson();
virtual bool goto_rbrother();
virtual bool goto_node(const TString &id);
virtual bool has_son() const;
virtual bool has_rbrother() const;
virtual bool has_father() const;
virtual bool has_lbrother() const;
virtual bool goto_father();
virtual bool goto_lbrother();
virtual TObject* curr_node() const { return &(TToken_string&)_curnode; }
virtual bool get_description(TString& str) const;
virtual TImage* image(bool selected) const;
void select(TString & id) { _selected = id;}
const TString & selected() const { return _selected;}
const TRectype& testata() const;
const TRectype& riga() const;
const TRectype& record() const;
const real totale_doc() const { TDocumento d(testata()); return d.totale_doc();}
void set_cursor(char tipocf, long codcf, int anno, const char* filter, FILTERFUNCTION ff = NULL);
TCursor* get_cursor() { return _cursor; }
TDocument_tree();
~TDocument_tree();
};
const TRectype& TDocument_tree::testata() const
{
TDocument_tree& me = (TDocument_tree&)*this;
const TRecnotype pos = me._curnode.get_long(0);
if (_cursor->pos() != pos || _relation->curr(LF_RIGHEDOC).empty())
*me._cursor = pos;
return _relation->curr();
}
const TRectype& TDocument_tree::riga() const
{
TDocument_tree& me = (TDocument_tree&)*this;
const TRectype& rec = _relation->curr(LF_RIGHEDOC);
const TRecnotype pos = me._curnode.get_long(0);
const int nriga = me._curnode.get_int(1);
if (_cursor->pos() != pos || rec.get_int(RDOC_NRIGA) > nriga)
*me._cursor = pos;
for (int i = rec.get_int(RDOC_NRIGA); i < nriga; i++)
_relation->next_match(LF_RIGHEDOC);
return rec;
}
const TRectype& TDocument_tree::record() const
{
return on_row() ? riga() : testata();
}
void TDocument_tree::node2id(const TObject* node, TString& id) const
{
id = *(TString*)node;
}
bool TDocument_tree::on_head() const
{
TDocument_tree& me = (TDocument_tree&)*this;
return me._curnode.get_int(1) == 0;
}
bool TDocument_tree::on_row() const
{
TDocument_tree& me = (TDocument_tree&)*this;
return me._curnode.get_int(1) > 0;
}
void TDocument_tree::multiple_selection(bool on)
{
_multiple_selection = on;
if (!_multiple_selection)
_selected_docs.destroy();
}
bool TDocument_tree::node_selected(const TObject* node) const
{
TToken_string id;
if (node == NULL)
node = curr_node();
node2id(node, id);
id = id.get(0);
return _selected_docs.is_key(id);
}
void TDocument_tree::select_node(const TObject* node, bool on)
{
TToken_string id;
if (node == NULL)
node = curr_node();
node2id(node, id);
id = id.get(0);
if (on)
_selected_docs.add(id);
else
_selected_docs.remove(id);
select(id);
}
bool find_doc(TTree& tree, void* jolly, word flags)
{
TDocument_tree & t = (TDocument_tree &) tree;
if (!t.node_selected() && t.testata().get_long(DOC_NDOC) == *((long *) jolly))
{
t.select_node();
return true;
}
return false;
}
real TDocument_tree::select_doc(long numdoc)
{
real val;
if (goto_root())
if (scan_depth_first(find_doc, (void *) &numdoc, SCAN_PRE_ORDER | SCAN_IGNORING_LEAVES))
val = totale_doc();
return val;
}
bool add_to_list(TTree& tree, void* jolly, word flags)
{
TDocument_tree & t = (TDocument_tree &) tree;
if (t.node_selected())
{
TLista_documenti & docs = *((TLista_documenti *) jolly);
docs.add(new TDocumento(t.testata()));
}
return false;
}
void TDocument_tree::build_doc_list(TLista_documenti & docs)
{
if (goto_root())
scan_depth_first(add_to_list, (void *) &docs, SCAN_PRE_ORDER | SCAN_IGNORING_LEAVES);
}
bool TDocument_tree::goto_root()
{
const bool ok = _cursor != NULL && _cursor->items()>0;
_curnode = ok ? "0" : "";
*_cursor = 0;
return ok;
}
bool TDocument_tree::goto_firstson()
{
bool ok = has_son();
if (ok)
_curnode.add(1,1);
return ok;
}
bool TDocument_tree::goto_rbrother()
{
bool ok = has_rbrother();
if (ok)
{
if (on_head())
{
const long pos = _curnode.get_long(0);
_curnode.add(pos+1, 0);
}
else
{
const int nriga = _curnode.get_int(1);
_curnode.add(nriga+1, 1);
}
}
return ok;
}
bool TDocument_tree::goto_node(const TString &id)
{
_curnode = id;
return TRUE;
}
bool TDocument_tree::has_son() const
{
bool ok = on_head();
if (ok)
{
testata();
const TRectype& rec = _relation->curr(LF_RIGHEDOC);
ok = rec.get_int(RDOC_NRIGA) > 0;
}
return ok;
}
bool TDocument_tree::has_rbrother() const
{
bool ok = FALSE;
if (on_head())
{
TDocument_tree& me = (TDocument_tree&)*this;
const long pos = me._curnode.get_long(0);
ok = pos < _cursor->items()-1;
}
else
{
riga(); // Posizionati sulla riga corrente
ok = _relation->next_match(LF_RIGHEDOC);
}
return ok;
}
bool TDocument_tree::has_father() const
{
return on_row();
}
bool TDocument_tree::has_lbrother() const
{
bool ok = FALSE;
TDocument_tree& me = (TDocument_tree&)*this;
if (on_head())
{
const long pos = me._curnode.get_long(0);
ok = pos > 0L;
}
else
{
const int nriga = me._curnode.get_int(1);
ok = nriga > 1;
}
return ok;
}
bool TDocument_tree::goto_father()
{
bool ok = on_row();
if (ok)
_curnode.add(0, 1);
return ok;
}
bool TDocument_tree::goto_lbrother()
{
bool ok = has_lbrother();
if (ok)
{
if (on_head())
{
const long pos = _curnode.get_long(0);
_curnode.add(pos-1, 0);
}
else
{
const int nriga = _curnode.get_int(1);
_curnode.add(nriga-1, 1);
}
}
return ok;
}
void TDocument_tree::format_field(const TRectype& rec, const TString& field, TString& str) const
{
const TFieldref fld(field, rec.num());
const TString& value = fld.read(rec);
const TFieldtypes ft = rec.type(fld.name());
if (ft == _realfld)
{
const int len = rec.length(fld.name());
const int ndec = rec.ndec(fld.name());
TString8 pic; pic.format(".%d", ndec);
const real r(value);
str = r.string(pic);
str.right_just(len);
}
else
str = value;
}
void TDocument_tree::append_custom_fields(const TTipo_documento& tipo, const TRectype& rec, TString& str) const
{
const TString& format = rec.num() == LF_DOC ? tipo.stringa_descrizione_documento()
: tipo.stringa_descrizione_riga();
if (format.not_empty())
{
str << ' ';
int ch = -1;
TString tmp;
for (int ap = format.find('{'); ap >= 0; ap = format.find('{', ch+1))
{
str << format.sub(ch+1, ap);
ch = format.find('}', ap);
const TString16 field = format.sub(ap+1, ch);
if (!field.blank())
{
format_field(rec, field, tmp);
str << tmp;
}
}
str << format.mid(ch+1);
}
}
TImage* TDocument_tree::image(bool selected) const
{
if (on_row())
{
const TRectype& rec = riga();
if (rec.get_bool(RDOC_RIGAEVASA))
return get_res_icon(10203);
}
else
{
if (multiple_selection())
{
const bool sel = node_selected();
if (sel)
{
if (selected)
return get_res_image(BMP_DIRDNSEL);
else
return get_res_image(BMP_DIRSEL);
}
}
}
return TTree::image(selected);
}
bool TDocument_tree::get_description(TString& str) const
{
if (on_head())
{
const TRectype& rec = testata();
str = rec.get(DOC_ANNO);
str << ' ' << rec.get(DOC_CODNUM);
TString16 tmp;
tmp.format("%6ld", rec.get_long(DOC_NDOC));
str << ' ' << tmp << ' ' << rec.get(DOC_DATADOC);
const char tipocf = rec.get_char(DOC_TIPOCF);
const long codcf = rec.get_long(DOC_CODCF);
tmp.format(" %c%6ld ", tipocf, codcf);
str << tmp;
tmp.format("%c|%6ld", tipocf, codcf);
str << cache().get(LF_CLIFO, tmp, CLI_RAGSOC);
str.left_just(63);
const TString& tipodoc = rec.get(DOC_TIPODOC);
const TTipo_documento& tipo = cached_tipodoc(tipodoc);
append_custom_fields(tipo, rec, str);
}
else
{
const TRectype& rec = riga();
const TRectype& testata = _relation->curr();
const TString80 codart = rec.get(RDOC_CODART);
str = codart;
str.left_just(21);
str << rec.get(RDOC_DESCR).left(30);
str.left_just(52);
const TString& tipodoc = testata.get(DOC_TIPODOC);
const TTipo_documento& tipo = cached_tipodoc(tipodoc);
if (codart.not_empty())
{
const real qta = rec.get_real(tipo.field_qta());
str << qta.string("###.###.##@,@@@");
if (tipo.is_ordine())
{
const real qta_evasa = rec.get_real(tipo.field_qtaevasa());
const real residuo = qta_evasa < qta ? (qta-qta_evasa) : ZERO;
str << residuo.string("###.###.##@,@@@");
}
append_custom_fields(tipo, rec, str);
}
}
return TRUE;
}
void TDocument_tree::set_cursor(char tipocf, long codcf, int anno, const char* filter, FILTERFUNCTION ff)
{
if (_relation == NULL)
{
_relation = new TRelation(LF_DOC);
_relation->add(LF_RIGHEDOC, "PROVV==PROVV|ANNO==ANNO|CODNUM==CODNUM|NDOC==NDOC");
}
if (_cursor == NULL)
{
_cursor = new TCursor(_relation, "", 2);
}
TRectype& rec = _relation->curr();
rec.zero();
rec.put(DOC_TIPOCF, tipocf);
rec.put(DOC_CODCF, codcf);
rec.put(DOC_PROVV, "D");
rec.put(DOC_ANNO, anno);
_cursor->freeze(false);
_cursor->setfilter(""); // Force cursor rebuild
_cursor->setfilter(filter);
_cursor->setregion(rec, rec);
_cursor->set_filterfunction(ff);
const long items = _cursor->items();
_cursor->freeze(true);
goto_root();
if (items <= 3)
expand_all();
}
TDocument_tree::TDocument_tree()
: _relation(NULL), _cursor(NULL), _multiple_selection(false)
{
}
TDocument_tree::~TDocument_tree()
{
if (_cursor)
delete _cursor;
if (_relation)
delete _relation;
}
///////////////////////////////////////////////////////////
// TElabora_mask
///////////////////////////////////////////////////////////
class TElabora_mask : public TAutomask
{
TDocumento_mask* _main;
TLista_elaborazioni _elab;
TDocument_tree _tree;
int _check_fld;
TElaborazione* _last_elab;
// @access Protected Member
protected:
TString _art_filter, _liv_filter;
static TElabora_mask* _myself;
static bool article_filter(const TRelation* rel);
void add_valuta_filter(TString& filter) const;
void docrif_search();
int update_list();
void update_ndoc_filter(bool is_tipo_elaborazione = FALSE);
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
// @access Public Member
public:
bool elabora();
TElaborazione* curr_elab();
// @cmember Costruttore (crea la maschera leggendo la descrizione dal file .msk)
TElabora_mask(TDocumento_mask& main_mask);
// @cmember Distruttore
virtual ~TElabora_mask() {}
};
TElabora_mask* TElabora_mask::_myself = NULL;
bool TElabora_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case F_CODART:
case F_CODNUM_ELAB:
if (e == fe_modify)
update_ndoc_filter();
break;
case F_TYPE:
if (e == fe_init || e == fe_modify)
{
int ne = update_list();
if (e == fe_init && ne == 0) // Riprova a cambiare flag e ricostruire la lista
{
set(F_TYPE, "X");
ne = update_list();
if (ne == 0)
set(F_TYPE, "");
}
update_ndoc_filter(TRUE);
const bool add_to_doc = o.get().not_empty();
TElaborazione * e = curr_elab();
const bool external = e != NULL && e->tipo() == _esterna;
const bool is_search = o.get().empty() || field(F_CODCF_ELAB).empty() || external || add_to_doc;
o.mask().field(F_NDOC_ELAB).check_type(is_search ? CHECK_SEARCH : CHECK_NORMAL);
_tree.multiple_selection(add_to_doc);
bool check_tot = false;
if (add_to_doc)
{
if (_check_fld < -1)
{
_check_fld = -1;
const TString_array& handlers = _main->doc().tipo().handlers();
const int items = handlers.items();
for (int i = 0; i < items; i ++ )
{
TToken_string& riga = (TToken_string&) handlers[i];
if (riga.get_int(1) == 2)
_check_fld = riga.get_int(0);
}
}
check_tot = _check_fld >= 0;
}
if (!add_to_doc)
o.mask().set(F_TOTSEL, "");
o.mask().show(-GRP_CHK, check_tot);
if (check_tot)
o.mask().set(F_TOTVAL, _main->get(_check_fld));
}
break;
case F_STATODOC_ELAB:
case F_TIPODOC_ELAB:
if (e == fe_modify)
{
update_list();
update_ndoc_filter();
}
break;
case F_ELAB:
if (e == fe_modify)
update_ndoc_filter(TRUE);
break;
case F_ANNO_ELAB:
if (e == fe_modify)
update_ndoc_filter();
break;
case F_NUMDOCRIF_ELAB:
if (e == fe_button)
docrif_search();
break;
case F_NDOC_ELAB:
if ((e == fe_modify || e == fe_close) && o.check_type() == CHECK_SEARCH && !o.empty())
{
TToken_string key;
key.add("D"); key.add(get(F_ANNO_ELAB));
key.add(get(F_CODNUM_ELAB)); key.add(o.get());
const TRectype& rec = cache().get(LF_DOC, key);
bool ok = !rec.empty(); // Verifica esistenza documento
if (ok)
{
TCursor* c = _tree.get_cursor();
c->curr() = rec;
ok = c->test(_isequal) == NOERR; // Verifica compatibilit<69> documento
}
if (!ok)
return error_box(((TEdit_field&)o).get_warning());
}
if (e == fe_init || e == fe_modify)
{
const long ndoc = atol(o.get());
if (ndoc > 0L)
{
real val = _tree.select_doc(ndoc);
if (val != ZERO)
{
val += o.mask().get_real(F_TOTSEL);
o.mask().set(F_TOTSEL, val);
}
}
}
break;
case F_ROWS:
if (e == fe_modify && is_running())
{
TString id;
_tree.curr_id(id);
_tree.select(id);
if (is_running() && !_tree.multiple_selection())
{
TCursor* c = _tree.get_cursor();
if (c != NULL && c->items() > 0)
{
const TRectype& head = _tree.testata();
set(F_DATADOC_ELAB, head.get(DOC_DATADOC)); // Anch'essa nella chiave 2!
set(F_ANNO_ELAB, head.get(DOC_ANNO));
set(F_CODNUM_ELAB, head.get(DOC_CODNUM), 2); // Check but not hit
set(F_NDOC_ELAB, head.get(DOC_NDOC));
}
}
}
else
if (e == fe_button)
{
if (_tree.multiple_selection())
{
const bool on = !_tree.node_selected();
_tree.select_node(NULL, on);
if (_check_fld >= 0)
{
real val = get_real(F_TOTSEL);
if (on)
val += _tree.totale_doc();
else
{
val -= _tree.totale_doc();
if (_tree.testata().get_long(DOC_NDOC) == o.mask().get_long(F_NDOC_ELAB))
o.mask().set(F_NDOC_ELAB, "");
}
set(F_TOTSEL, val);
}
}
}
break;
case DLG_LINK:
if (e == fe_button)
{
_tree.goto_node(_tree.selected());
const TRectype & rec = _tree.testata();
if (!rec.empty())
{
TFilename tempfile;
tempfile.temp("ve0");
tempfile.ext("ini");
{
TConfig configfile(tempfile);
configfile.set("Action", "Modify", "Transaction");
configfile.set("NDOC", rec.get(DOC_NDOC), "33");
configfile.set(DOC_PROVV, rec.get(DOC_PROVV), "33");
configfile.set(DOC_ANNO, rec.get(DOC_ANNO), "33");
configfile.set(DOC_CODNUM, rec.get(DOC_CODNUM), "33");
}
TString commandline;
commandline.format("ve0 -0 /i%s",(const char*)tempfile);
TExternal_app ve(commandline);
ve.run();
remove_file(tempfile);
}
}
break;
default:
break;
}
return TRUE;
}
int TElabora_mask::update_list()
{
TString_array elabs;
const TString16 tipo(_main->get(F_TIPODOC));
const TString16 stato(_main->get(F_STATO));
const TString16 tipo_elab(get(F_TIPODOC_ELAB));
const TString16 stato_elab(get(F_STATODOC_ELAB));
const bool from_elab = !get_bool(F_TYPE);
int items = 0;
if (from_elab)
{
items = _elab.select(elabs, tipo, stato,"","") ;
field(F_ANNO_ELAB).check_type(CHECK_REQUIRED);
}
else
{
field(F_ANNO_ELAB).check_type(CHECK_NONE);
items = _elab.select(elabs, tipo_elab, stato_elab, tipo, stato);
}
TList_field & f = (TList_field &) field(F_ELAB);
TToken_string codes;
TToken_string descrs;
for (int i = 0; i < items; i++)
{
const TElaborazione& e = _elab[elabs.row(i)];
if (!from_elab)
{
// AO20123: Impedire contabilizzazione all'indietro!
if (e.tipo() == _contabilizzazione || e.tipo() == _generazione_effetti)
continue;
}
codes.add(e.codice());
descrs.add(e.descrizione());
}
items = codes.items(); // Conta elementi veramente aggiunti
const bool ok = items > 0;
enable(DLG_OK, ok);
enable(F_ELAB, ok);
if (codes != f.get_codes())
f.replace_items(codes, descrs);
const TElaborazione * e = curr_elab();
if (e != NULL && e->tipo() == _consegna_ordini)
show(-GRP_ART);
else
{
reset(-GRP_ART);
hide(-GRP_ART);
}
return items;
}
bool TElabora_mask::elabora()
{
bool update_mask = FALSE;
TLista_documenti in;
TLista_documenti out;
TDocumento& app_doc = ((TDocumento_mask *)_main)->doc();
const long numdoc = field(F_NDOC_ELAB).active() ? get_long(F_NDOC_ELAB) : app_doc.get_long(DOC_NDOC);
const bool update_header = get_bool(F_UPDATE_HEADER);
const bool from_elab = !get_bool(F_TYPE);
TElaborazione * e = curr_elab();
if (e == NULL)
return FALSE;
if (e->tipo() == _consegna_ordini)
{
TParametri_elaborazione& p = e->params();
p.set("ARTICOLO", get(F_CODART));
p.set("UM", get(F_UMQTA));
p.set("QUANTITA", get(F_QTA));
}
if (from_elab)
{
const char provv = get(F_PROVV_ELAB)[0];
const int anno = get_int(F_ANNO_ELAB);
const TString& codnum = get(F_CODNUM_ELAB);
const TString& tipo = get(F_TIPODOC_ELAB);
const TString& stato = get(F_STATODOC_ELAB);
if (anno <= 0 || codnum.blank() || tipo.blank() || stato.blank())
return false;
TDocumento* newdoc = new TDocumento(provv, anno, codnum, numdoc);
TDocumento& d = *newdoc;
if (numdoc <= 0)
{
TDocumento::copy_data(d.head(), app_doc.head());
d.put(DOC_TIPODOC, tipo);
d.put(DOC_STATO, stato);
const TDate datadoc = d.get_date(DOC_DATADOC);
const TDate datainsc = d.get_date(DOC_DATAINSC);
const bool equal = !datainsc.ok() || datadoc == datainsc;
d.put(DOC_DATADOC, get(F_DATADOC_ELAB));
if (equal)
d.zero(DOC_DATAINSC);
const TTipo_documento & t = d.tipo();
if (t.mov_mag())
d.put(DOC_CAUSMAG, t.caus_mov());
else
d.zero(DOC_CAUSMAG);
}
in.add(app_doc);
out.add(d);
if (e->elabora(in, out, TDate(TODAY), true))
{
if (out[0] != d)
out.rewrite();
if (app_doc != in[0])
{
in.rewrite();
app_doc = in[0];
update_mask = true;
}
}
delete newdoc;
}
else
{
_tree.build_doc_list(in);
if (in.items() == 0)
return false ;
char provv = get(F_PROVV_ELAB)[0];
int anno = get_int(F_ANNO_ELAB);
TString16 codnum(get(F_CODNUM_ELAB));
long ndoc = get_long(F_NDOC_ELAB);
if (ndoc > 0L && !in.find(provv, anno, codnum, ndoc))
{
TDocumento* d = new TDocumento(provv, anno, codnum, ndoc);
in.add(d);
}
if (update_header)
{
const TString4 tipo_doc(app_doc.get(DOC_TIPODOC));
const TString8 caus_mag(app_doc.get(DOC_CAUSMAG));
const long movmag = app_doc.get_long(DOC_MOVMAG);
const TDate datadoc = app_doc.get_date(DOC_DATADOC);
const TDate datainsc = app_doc.get_date(DOC_DATAINSC);
const TDate datapart = app_doc.get_date(DOC_DATAPART);
const TString8 orapart(app_doc.get(DOC_ORAPART));
const char stato = app_doc.stato();
TDocumento::copy_data(app_doc.head(), in[0].head());
app_doc.put(DOC_TIPODOC, tipo_doc);
app_doc.put(DOC_CAUSMAG, caus_mag);
app_doc.put(DOC_MOVMAG, movmag);
app_doc.put(DOC_DATADOC, datadoc);
app_doc.put(DOC_DATAINSC, datainsc);
app_doc.put(DOC_STATO, stato);
}
out.add(app_doc);
if (e->elabora(in, out, TDate(TODAY), true))
{
if (out[0] != app_doc)
{
out.rewrite();
app_doc.read(out[0].head());
update_mask = true;
}
in.rewrite();
}
const TString8 num_in = e->codice_numerazione_iniziale();
set(F_CODNUM_ELAB, num_in);
set(F_NDOC_ELAB, "");
set(F_NUMDOCRIF_ELAB, "");
((TDocumento_mask *)_main)->set_focus_field(F_SHEET);
}
if (e->tipo() == _consegna_ordini)
{
TParametri_elaborazione& p = e->params();
if (p.get("ARTICOLO").not_empty())
{
real qta = get_real(F_QTA);
if (qta > ZERO)
{
const real qta_evasa = p.get_real("QUANTITA");
qta -= qta_evasa;
set(F_QTA, qta);
}
}
}
// delete newdoc;
// Azzera l'anno in caso di ordini
if (in.items() > 0 && in[0].is_ordine())
{
reset(F_ANNO_ELAB);
update_mask = true;
}
if (update_mask)
update_ndoc_filter();
return update_mask;
}
TElaborazione * TElabora_mask::curr_elab()
{
const TString16 cod_elab(get(F_ELAB));
return cod_elab.not_empty() ? &_elab[cod_elab] : NULL;
}
bool TElabora_mask::article_filter(const TRelation* rel)
{
bool yes = false;
TElabora_mask& m = *_myself;
TLocalisamfile rdoc(LF_RIGHEDOC);
rdoc.put(RDOC_CODNUM, rel->curr().get(DOC_CODNUM));
rdoc.put(RDOC_ANNO, rel->curr().get(DOC_ANNO));
rdoc.put(RDOC_PROVV, rel->curr().get(DOC_PROVV));
rdoc.put(RDOC_NDOC, rel->curr().get(DOC_NDOC));
rdoc.put(RDOC_NRIGA, 1);
int next_riga = 1;
for (int err = rdoc.read(); err == NOERR; err = rdoc.next())
{
const int nriga = rdoc.get_int(RDOC_NRIGA);
if (nriga != next_riga)
break;
next_riga++;
const bool evasa= rdoc.get_bool(RDOC_RIGAEVASA);
const TString& codart = rdoc.get(RDOC_CODART);
if (!evasa && codart == m._art_filter)
{
yes = true;
break;
}
}
return yes;
}
void TElabora_mask::add_valuta_filter(TString& filter) const
{
TString16 valuta = get(F_CODVAL_ELAB);
if (::is_firm_value(valuta))
{
filter << "((CODVAL==\"" << valuta << "\")";
if (valuta.empty())
valuta = TCurrency::get_firm_val();
else
valuta.cut(0);
filter << "||(CODVAL==\"" << valuta << "\"))";
}
else
filter << "(CODVAL==\"" << valuta << "\")";
}
void TElabora_mask::update_ndoc_filter(bool is_tipo_elaborazione)
{
TString filter;
add_valuta_filter(filter);
TElaborazione * e = curr_elab();
const bool elab_changed = e != _last_elab;
_last_elab = e;
const bool aggiungi_doc_att = get_bool(F_TYPE);
enable(-1, aggiungi_doc_att);
if (!aggiungi_doc_att && is_tipo_elaborazione )
reset(-1);
const bool enable_group_doc = e != NULL && e->tipo() != _generazione_effetti && e->tipo() != _contabilizzazione;
show(-GRP_DOC, enable_group_doc);
if (e != NULL)
{
if (aggiungi_doc_att)
{
bool agg_test = e->aggiorna_testata_se_vuoto();
if (agg_test)
{
const int nrighe = _main->doc().physical_rows();
for (int i = 1;agg_test && i <= nrighe; i++)
if (!_main->doc()[i].is_generata())
agg_test = false;
}
set(F_UPDATE_HEADER, agg_test ? "X" : "");
const TString8 num_in = e->codice_numerazione_iniziale();
if (elab_changed)
{
const TString16 tipo_in(e->tipo_iniziale(0));
const char stato_in = e->stato_iniziale(0);
set(F_CODNUM_ELAB, num_in);
field(F_CODNUM_ELAB).check();
set(F_TIPODOC_ELAB , tipo_in);
field(F_TIPODOC_ELAB).check();
TString8 si; si << stato_in;
set(F_STATODOC_ELAB, si);
field(F_STATODOC_ELAB).check();
// Azzero anno di elaaborazione quando ho a che fare con degli ordini
const TTipo_documento& tipodocin = cached_tipodoc(tipo_in);
if (tipodocin.is_ordine())
reset(F_ANNO_ELAB);
}
if (!field(F_TIPODOC_ELAB).empty())
{
const TString16 tipo(get(F_TIPODOC_ELAB));
TString80 td; td.format("&&(TIPODOC==\"%s\")", (const char *)tipo);
filter << td;
const TString& stato = get(F_STATODOC_ELAB);
if (stato.not_empty())
{
filter << "&&(STATO==\"" << stato << "\")";
}
else
{
bool almost_one = FALSE;
for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++)
{
const TString16 tipo_in(e->tipo_iniziale(i));
const char stato_in = e->stato_iniziale(i);
if (tipo == tipo_in && stato_in > '0')
{
if (almost_one)
filter << "||";
else
filter << "&&(";
almost_one = TRUE;
filter << "(STATO==\"" << stato_in << "\")";
}
}
if (almost_one)
filter << ')';
}
}
else
{
bool almost_one = FALSE;
for (int i = 0; i < TElaborazione::_max_tipi_doc_elab; i++)
{
const TString16 tipo_in(e->tipo_iniziale(i));
if (tipo_in.not_empty())
{
if (almost_one)
filter << "||";
else
filter << "&&(";
almost_one = TRUE;
filter << "((TIPODOC==\"" << tipo_in << "\")";
const char stato_in[2] = { e->stato_iniziale(i), '\0' };
if (stato_in[0] > '0')
filter << "&&(STATO==\"" << stato_in << "\")";
filter << ')';
}
}
if (almost_one)
filter << ')';
}
}
else
{
const TString4 tipo_fin(e->tipo_finale());
const TString4 stato_fin(e->stato_finale());
set(F_UPDATE_HEADER, "");
filter << "&&";
if (stato_fin != "0")
filter << '(';
filter << "(TIPODOC==\"" << tipo_fin << "\")";
if (stato_fin != "0")
filter << "&&(STATO==\"" << stato_fin << "\"))";
if (is_tipo_elaborazione)
{
const TString4 num_fin(e->codice_numerazione_finale());
set(F_CODNUM_ELAB, num_fin);
field(F_CODNUM_ELAB).check();
set(F_TIPODOC_ELAB, tipo_fin);
field(F_TIPODOC_ELAB).check();
set(F_STATODOC_ELAB, stato_fin);
field(F_STATODOC_ELAB).check();
}
}
}
if (!field(F_CODNUM_ELAB).empty())
{
TString80 cn; cn.format("&&(CODNUM==\"%s\")", (const char*)get(F_CODNUM_ELAB));
filter << cn;
}
TBrowse& brew = *efield(F_NDOC_ELAB).browse();
brew.set_filter(filter);
_art_filter = get(F_CODART);
TCursor* cursor = brew.cursor();
if (_art_filter.not_empty() && aggiungi_doc_att)
cursor->set_filterfunction(article_filter);
else
cursor->set_filterfunction(NULL);
TTree_field& tf = tfield(F_ROWS);
if (!field(F_TIPODOC_ELAB).empty() && e != NULL)
{
if (aggiungi_doc_att && _art_filter.not_empty())
_tree.set_cursor(get(F_TIPOCF_ELAB)[0], get_long(F_CODCF_ELAB), get_int(F_ANNO_ELAB), filter, article_filter);
else
_tree.set_cursor(get(F_TIPOCF_ELAB)[0], get_long(F_CODCF_ELAB), get_int(F_ANNO_ELAB), filter);
tf.set_tree(&_tree);
TToken_string header(256, '\n');
header.add("Anno Num. N. Data Cli/For Ragione Sociale");
header.add(" Codice Articolo Descrizione Riga ");
if (aggiungi_doc_att && e->tipo() == _consegna_ordini)
header << "Da Evadere Residuo";
else
header << " Quantit<69>";
tf.set_header(header);
if (aggiungi_doc_att && _art_filter.full())
_tree.set_cursor(get(F_TIPOCF_ELAB)[0], get_long(F_CODCF_ELAB), get_int(F_ANNO_ELAB), filter, article_filter);
else
_tree.set_cursor(get(F_TIPOCF_ELAB)[0], get_long(F_CODCF_ELAB), get_int(F_ANNO_ELAB), filter);
if (aggiungi_doc_att) // GF20059
{
TCursor& cur = *_tree.get_cursor();
if (cur.items() == 1) // Propone l'unico documento possibile
{
cur = 0L;
const TRectype& curr = cur.curr();
set(F_ANNO_ELAB, curr.get(DOC_ANNO));
set(F_NDOC_ELAB, curr.get(DOC_NDOC));
set(F_CODNUM_ELAB, curr.get(DOC_CODNUM), 2); // Check but not hit
set(F_DATADOC_ELAB, curr.get(DOC_DATADOC));
}
}
}
else
tf.set_tree(NULL);
tf.win().force_update();
}
void TElabora_mask::docrif_search()
{
TRectype filtrec(LF_DOC);
filtrec.put(DOC_TIPOCF, get(F_TIPOCF_ELAB));
filtrec.put(DOC_CODCF, get(F_CODCF_ELAB));
filtrec.put(DOC_PROVV, get(F_PROVV_ELAB));
filtrec.put(DOC_ANNO, get(F_ANNO_ELAB));
TRelation rel(LF_DOC);
rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF");
TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec);
TString flt(256);
if (!field(F_CODNUM_ELAB).empty())
flt << "(CODNUM==\"" << get(F_CODNUM_ELAB) << "\")&&";
if (!field(F_TIPODOC_ELAB).empty())
flt << "(TIPODOC==\"" << get(F_TIPODOC_ELAB) << "\")&&";
if (!field(F_STATODOC_ELAB).empty())
flt << "(STATO==\"" << get(F_STATODOC_ELAB) << "\")&&";
add_valuta_filter(flt); flt << "&&";
TEdit_field& f = efield(F_NUMDOCRIF_ELAB);
if (!f.empty())
flt << "(NUMDOCRIF==\"" << f.get() << "\")&&";
flt.rtrim(2); // Togli gli ultimi &&
cur.setfilter(flt);
TToken_string fields = "ANNO|CODNUM|TIPODOC|NUMDOCRIF|STATO|DATADOCRIF|DOC1|DOC2|DOC3|NDOC|20->RAGSOC";
TCursor_sheet sheet(&cur, fields,
"Documento di riferimento",
"Anno|Num.|Tipo|Docum.Rif.|Stato|Data@10|Docum.Rif.1|Docum.Rif.2|Docum.Rif.3|Documento|Ragione Sociale@50",
0, 1);
if (sheet.run() == K_ENTER)
{
const int nrifpos = fields.get_pos("NUMDOCRIF");
const TString16 nrif = sheet.row(-1).get(nrifpos);
f.set(nrif);
const int ndocpos = fields.get_pos("NDOC");
const TString16 ndoc = sheet.row(-1).get(ndocpos);
set(F_NDOC_ELAB, ndoc);
const int codnumpos = fields.get_pos("CODNUM");
const TString16 codnum = sheet.row(-1).get(codnumpos);
set(F_CODNUM_ELAB, codnum, TRUE);
}
}
TElabora_mask::TElabora_mask(TDocumento_mask& main_mask)
: TAutomask("ve0100b"), _main(&main_mask), _last_elab(NULL), _check_fld(-883)
{
_myself = this;
const TDate oggi(TODAY);
set(F_ANNO_ELAB, oggi.year()); //anno della datadoc proposta (risolve bug 0000331)
set(F_TIPOCF_ELAB, _main->get(F_TIPOCF));
set(F_CODCF_ELAB, _main->get(F_CODCF));
set(F_CODVAL_ELAB, _main->get(F_CODVAL));
}
bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key )
{
if (key == K_SPACE)
{
TDocumento_mask& m = (TDocumento_mask&)f.mask();
m.update_progs();
if (m.check_fields()) // Check values
{
TElabora_mask* selection = new TElabora_mask(m); // No woman no stack
bool do_checks = false;
const char stato_iniziale = m.doc().stato();
m.update_father_rows();
while (selection->run() == K_ENTER) //NON riportare modifiche dalla 3.1!! Gi<47> sistemato
{
m.mask2doc();
const bool processed = selection->elabora();
do_checks |= processed;
if (m.doc().stato() != stato_iniziale)
break;
if (processed)
{
m.doc2mask(false);
TSheet_field& ss = m.sfield(F_SHEET);
for (int i = 0; i < ss.items(); i++)
{
m.ss_notify(ss,i,K_TAB);
m.ss_notify(ss,i,K_SPACE);
m.ss_notify(ss,i,K_ENTER);
}
}
if (!m.get_bool(F_TYPE)) // non aggiunge al documento attuale
break;
}
if (do_checks) //NON riportare modifiche dalla 3.1!! Gi<47> sistemato
{
m.doc2mask(false);
// Provoca decodifiche necessarie
const int tutti = m.fields();
int i;
for (i = 0; i < tutti; i++)
{
TMask_field& f = m.fld(i);
if (f.dlg() <= BASE_PIEDE)
f.check(STARTING_CHECK);
}
for (i = tutti-1; i >= 0; i--)
m.fld(i).set_dirty(FALSE);
}
m.update_father_rows(false);
delete selection;
}
}
return true;
}
///////////////////////////////////////////////////////////
// TDocumento_mask
///////////////////////////////////////////////////////////
bool TDocumento_mask::print_handler( TMask_field& f, KEY key )
{
if (key == K_SPACE)
{
switch (f.dlg())
{
case DLG_EMAIL :
app().mailto();
break;
case DLG_PREVIEW :
app().preview();
break;
default :
app().print();
break;
}
}
return true;
}
void TDocumento_mask::set_field_handler(short fieldid, CONTROL_HANDLER handler)
{
_handlers.add((TObject *)handler, fieldid);
}
void TDocumento_mask::user_set_handler(short fieldid, int index)
{
switch( index )
{
case 1:
set_field_handler(fieldid, ora_hndl);
break;
case 2:
set_field_handler(fieldid, totdoc_hndl);
break;
case 3:
set_field_handler(fieldid, numdocrif_hndl);
break;
case 4:
{
_smartcard = new TSmart_card();
if (_smartcard->type() != no_smartcard)
{
set_field_handler(fieldid, smart_hndl);
set_handler(fieldid, universal_handler);
}
else
{
disable(fieldid);
delete _smartcard;
_smartcard = NULL;
}
}
break;
case 5:
set_field_handler(fieldid, dummy_hndl);
break;
case 6:
set_field_handler(fieldid, fido_hndl);
break;
default:
break;
}
}
bool TDocumento_mask::call_handler( TMask_field& f, KEY key)
{
const short id = f.dlg();
CONTROL_HANDLER h = (CONTROL_HANDLER) _handlers.objptr(id);
if (h != NULL)
return h(f, key);
return true;
}
bool TDocumento_mask::universal_handler( TMask_field& f, KEY key)
{
TDocumento_mask& m = (TDocumento_mask&)f.mask();
bool ok = m.call_handler(f, key);
if (ok && key == K_TAB && f.focusdirty())
{
const TFieldref* fr = f.field();
if (fr != NULL && (fr->file() == 0 || fr->file() == LF_DOC))
fr->write(f.get(), m.doc());
const int page = f.page();
if (m.is_calculated_page(page))
m.update_progs();
}
return ok;
}
bool TDocumento_mask::anno_handler( TMask_field& f, KEY key)
{
if (key == K_TAB && f.to_check(key, TRUE))
app().update_navigation_bar();
return true;
}
TString16 __codnum;
bool tipodoc_ok(const TString & tipodoc)
{
const TString4 module(main_app().name().left(2));
const TTipo_documento& tipo = cached_tipodoc(tipodoc);
const TString & tipomod = tipo.module();
if (module == "ve" && tipomod.blank())
return true;
return tipomod == module;
}
bool tip_filter(const TRelation* r)
{
if (__codnum.blank())
return true;
const TCodice_numerazione & cod_num = cached_numerazione(__codnum);
const TString4 tipo = r->curr().get("CODTAB");
int last = cod_num.ntipi_doc();
for (int i = 0; i < last; i++ )
{
const TString & curtipo = cod_num.tipo_doc(i);
if (curtipo == tipo && tipodoc_ok(curtipo))
return true;
}
return false;
}
bool TDocumento_mask::num_handler( TMask_field& f, KEY key)
{
if (key == K_TAB && f.to_check(key, true))
{
// Ottengo la maschera
TMask& m = f.mask();
const TString & codnum = f.get();
TCursor * cur = m.efield(F_TIPODOC).browse()->cursor();
TCursor * descur = m.efield(F_DESTIPODOC).browse()->cursor();
__codnum = codnum;
if (codnum.full())
{
const TCodice_numerazione & cod_num = cached_numerazione(codnum);
m.set( F_DESNUM, cod_num.descrizione());
// Propone il primo tipo di documento come default
if (m.field(F_TIPODOC).empty() || f.focusdirty())
{
m.set( F_TIPODOC, cod_num.tipo_doc(0));
m.send_key( K_TAB, F_TIPODOC );
}
// Se per questa numerazione e' abilitata le numerazione provvisoria
if (cod_num.num_provv())
{
// Setta di default la numerazione provvisoria
m.set( F_PROVV, "P" );
// Abilita il campo per la selezione della numerazione
m.enable( F_PROVV );
}
else // Altrimenti ...
{
// Setta la numerazione a definitiva
m.set( F_PROVV, "D" );
// Disabilita il campo per la selezione della numerazione
m.disable( F_PROVV );
}
}
else
{
m.set( F_DESNUM, "" );
m.set( F_TIPODOC, "" );
}
cur->set_filterfunction(tip_filter);
descur->set_filterfunction(tip_filter);
app().update_navigation_bar();
}
return TRUE;
}
bool TDocumento_mask::codlist_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
TLocalisamfile & list = ((TEdit_field &) f).browse()->cursor()->file();
const TDate datadoc(f.mask().get(F_DATADOC));
const TDate datascad(list.get_date("VALFIN"));
if (datascad.ok() && datadoc > datascad)
{
const TString16 codsucc(list.get("CODLISSUCC"));
if (codsucc.empty())
return error_box("Listino scaduto il %s", datascad.string());
else
{
f.set(codsucc);
f.set_focusdirty();
((TEdit_field &)f).check();
}
}
}
return true;
}
bool TDocumento_mask::codcont_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
TDocumento_mask& m = (TDocumento_mask&)f.mask();
TLocalisamfile & cont = ((TEdit_field &) f).browse()->cursor()->file();
const TDate datadoc(f.mask().get(F_DATADOC));
const TDate datascad(cont.get_date("VALFIN"));
if (datascad.ok() && datadoc > datascad)
return error_box("Contratto scaduto il %s", datascad.string());
static bool __gesconcc = false;
static long __cntr_firm = -1L;
const long firm = prefix().get_codditta();
if (firm != __cntr_firm)
{
TConfig c(CONFIG_DITTA, "ve");
__gesconcc = c.get_bool("GESCONCC");
__cntr_firm = firm;
}
if (m.doc().tipo().load_cont() && f.get().full() && m.get_long(F_CODCF) > 0)
{
TSheet_field & s = m.sfield(F_SHEET);
if (s.items() == 0)
{
TString select("TIPO='C' CATVEN=''");
if(__gesconcc)
select << " " << RCONDV_TIPOCF<< "='" << m.get(F_TIPOCF) <<"' " << RCONDV_CODCF << "=" << m.get_long(F_CODCF);
select << " " << RCONDV_COD << "=" << f.get();
TString query("USE RCONDV SELECT ");
query << RCONDV_TIPORIGA << "=='A'";
query << "\nFROM " << select;
query << "\nTO " << select;
TISAM_recordset recset(query);
TString last_cod(20);
for (bool ok = recset.move_first(); ok ; ok = recset.move_next())
{
TRiga_documento & r = m.doc().new_row("01");
const TString & cod = recset.get(RCONDV_CODRIGA).as_string();
if (cod != last_cod)
{
r.put(RDOC_CODART, cod);
const int row = s.insert(-1, false);
s.row(row);
r.autoload(s);
s.check_row(row, 0x2);
r.autosave(s);
const TString & um = recset.get(RCONDV_UM).as_string();
if (um.full())
r.put(RDOC_UMQTA, um);
r.put(RDOC_PREZZO, recset.get(RCONDV_PREZZO).as_real());
r.put(RDOC_SCONTO, recset.get(RCONDV_SCONTO).as_string());
r.put(RDOC_PERCPROV, recset.get(RCONDV_PERCPROVV).as_real());
r.autoload(s);
last_cod = cod;
}
}
}
}
}
return TRUE;
}
bool TDocumento_mask::codcamp_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
TLocalisamfile & camp = ((TEdit_field &) f).browse()->cursor()->file();
const TDate datadoc(f.mask().get(F_DATADOC));
const TDate datascad(camp.get_date("VALFIN"));
if (datascad.ok() && datadoc > datascad)
return error_box("Offerta scaduta il %s", datascad.string());
}
return TRUE;
}
bool TDocumento_mask::datacambio_handler( TMask_field& f, KEY key )
{
TMask& m = f.mask();
if (key == K_TAB && m.field(F_CAMBIO).empty())
{
const TString& codval = m.get(F_CODVAL1);
if (is_true_value(codval))
{
const TRectype& rec = cache().get("%VAL", codval);
m.set(F_CAMBIO, rec.get("S4"));
}
}
return TRUE;
}
bool TDocumento_mask::codval_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty() && !f.empty())
{
TMask& m = f.mask();
// Cerco un cambio per la data specificata, se non lo trovo lo invento
TDate datacam = m.get_date(F_DATACAMBIO);
if (!datacam.ok())
{
datacam = m.get_date(F_DATADOC);
m.set(F_DATACAMBIO, datacam);
m.set(F_DATACAMBIO1, datacam);
}
TExchange exc(f.get());
exchange_type et;
real cambio = exc.get_change(et); // Determino il cambio standard ed il "Contro-Euro"
TString16 key;
key.format("%-3s%s", (const char*)f.get(), (const char*)datacam.string(ANSI));
const real giornaliero(cache().get("CAM", key, "S4"));
if (!giornaliero.is_zero())
cambio = giornaliero; // Ho trovato un cambio per il giorno!
m.set(F_CAMBIO, cambio);
m.set(F_CONTROEURO, et == _exchange_contro ? "X" : "");
m.sfield(F_SHEET).force_update(); // Aggiorna punti decimali degli importi
}
return TRUE;
}
void TDocumento_mask::update_father_rows(bool add)
{
if (_auto_reopen_nums.empty())
return;
const int rows = doc().physical_rows();
for (int i = 1; i <= rows; i++)
{
const TRiga_documento & r = doc()[i];
if (r.is_merce() || r.is_omaggio()|| r.is_prestazione())
{
TRiga_documento * original_row = (TRiga_documento *) r.find_original_rdoc();
if (original_row != NULL && _auto_reopen_nums.objptr(original_row->get(RDOC_CODNUM)) != NULL)
{
TToken_string key;
key.add(original_row->get(RDOC_PROVV));
key.add(original_row->get(RDOC_ANNO));
key.add(original_row->get(RDOC_CODNUM));
key.add(original_row->get(RDOC_NDOC));
key.add(original_row->get(RDOC_IDRIGA));
real * qta = (real *) _father_rows.objptr(key);
if (qta == NULL)
{
qta = new real;
_father_rows.add(key, qta);
}
real value = r.quantita();
if (r.is_articolo())
{
TArticolo & art = cached_article(r.get(RDOC_CODARTMAG));
value = art.convert_to_um(value, original_row->get(RDOC_UMQTA), r.get(RDOC_UMQTA));
}
if(add)
*qta += value;
else
*qta -= value;
if (*qta == ZERO)
_father_rows.remove(key);
}
}
}
}
TAssoc_array TDocumento_mask::_father_rows;
TAssoc_array TDocumento_mask::_auto_reopen_nums;
TAssoc_array TDocumento_mask::_tipidoc_rels;
void TDocumento_mask::save_father_rows()
{
if (_auto_reopen_nums.empty())
return;
TLocalisamfile rdoc(LF_RIGHEDOC);
TString_array rows;
TToken_string last_doc;
TToken_string curr_doc;
int nrows = 0;
FOR_EACH_ASSOC_OBJECT(_father_rows, h, k, o)
{
rows.add(k);
}
rows.sort();
rows.add("");
FOR_EACH_ARRAY_ROW(rows, i, r)
{
curr_doc = r->get(0);
curr_doc.add(r->get());
curr_doc.add(r->get());
curr_doc.add(r->get());
if (last_doc != curr_doc && nrows > 0)
{
TDocumento d;
d.read(last_doc.get_char(0), last_doc.get_int(1), last_doc.get(2), last_doc.get_long(3), _isequal, _lock);
for (int j = i - nrows; j < i; j++)
{
TToken_string & key = rows.row(j);
const long idriga = key.get_long(4);
const int nrows = d.physical_rows();
for (int k = 1; k <= nrows; k++)
{
TRiga_documento & rdoc_row = d[k];
if (idriga == rdoc_row.get_long(RDOC_IDRIGA))
{
const real * qta = (const real *) _father_rows.objptr(key);
const TString& name = rdoc_row.field_qtaevasa();
real qtaevasa = rdoc_row.get_real(name) + * qta;
if (qtaevasa < ZERO)
qtaevasa = ZERO;
rdoc_row.put(name, qtaevasa);
if (qtaevasa < rdoc_row.quantita())
rdoc_row.zero(RDOC_RIGAEVASA);
else
rdoc_row.put(RDOC_RIGAEVASA, "X");
break;
}
}
}
TToken_string key(d.tipo().codice());
key.add(doc().tipo().codice());
TStati * stati = (TStati *) _tipidoc_rels.objptr(key);
if (stati != NULL)
{
const int nrows = d.physical_rows();
bool evaso = true;
for (int k = 1; evaso && k <= nrows; k++)
evaso &= d[k].is_evasa();
d.stato(evaso ? stati->finale() : stati->iniziale());
}
d.rewrite();
nrows = 0;
}
last_doc = curr_doc;
nrows++;
}
}
static bool conf_num_handler(TMask_field& f, KEY key)
{
if (key == K_TAB && f.to_check(key, true))
{
TMask & m = f.mask();
__codnum = f.get();
TCursor * cur = m.efield(F_TIPODOC).browse()->cursor();
TCursor * descur = m.efield(F_DESTIPODOC).browse()->cursor();
cur->set_filterfunction(tip_filter);
descur->set_filterfunction(tip_filter);
}
return true;
}
bool TDocumento_mask::confirm_handler( TMask_field& f, KEY key )
{
bool ok = true;
if (key == K_SPACE)
{
TMask m("ve0100d");
TDocumento_mask & mask = (TDocumento_mask &) f.mask();
const TDocumento& src = mask.doc();
TCodice_numerazione num(src.numerazione());
TString4 codnum(num.codnumdef());
TString4 tipodoc(num.tipodocdef());
if (!num.newnumdef())
{
codnum = src.get(DOC_CODNUM);
tipodoc = src.get(DOC_TIPODOC);
}
else
{
codnum = num.get("S8");
tipodoc = num.get("S9");
}
bool ok = codnum.full() && tipodoc.full();
if (!ok)
{
TString saved_codnum = __codnum;
m.set(F_CODNUM, codnum);
m.enable(F_CODNUM, codnum.blank());
m.set_handler(F_CODNUM, ::conf_num_handler);
m.enable(F_DESNUM, codnum.blank());
m.set(F_TIPODOC, tipodoc);
m.enable(F_TIPODOC, tipodoc.blank());
m.enable(F_DESTIPODOC, tipodoc.blank());
ok = m.run() == K_ENTER;
if (ok)
{
codnum = m.get(F_CODNUM);
tipodoc = m.get(F_TIPODOC);
}
__codnum = saved_codnum;
}
ok = codnum.full() && tipodoc.full();
if (ok)
{
TDocumento dest(src);
dest.put(DOC_CODNUM, codnum);
dest.put(DOC_TIPODOC, tipodoc);
dest.put(DOC_PROVV, "D");
dest.zero(DOC_NDOC);
int err = dest.write();
if (err == NOERR)
{
err = src.remove();
if (err != NOERR)
warning_box("Errore %d nell'eliminazione del documento provvisorio", err);
mask.stop_run(K_ESC);
TMask & qmask = app().query_mask();
qmask.set(F_CODNUM, codnum);
qmask.set(F_PROVV, dest.get_char(DOC_PROVV));
qmask.set(F_ANNO, dest.get_int(DOC_ANNO));
qmask.set(F_NDOC, dest.get_long(DOC_NDOC));
qmask.field(F_NDOC).update_flags("RP");
}
else
return error_box("Errore %d nella generazione del documento definitivo", err);
}
}
return ok;
}
void TDocumento_mask::sel_color()
{
const TString& mn = doc().tipo().mask_name();
TSelect_color_mask sel(mn, "0");
FOR_EACH_ARRAY_ITEM(color_rules(), i, o)
{
const TColor_rule& col = *(const TColor_rule*)o;
COLOR a, b; col.colors(a, b);
COLOR c, d; col.default_colors(c, d);
sel.add_color(col.key(), col.description(), a, b, c, d);
}
if (sel.run() != K_ESC)
{
FOR_EACH_ARRAY_ITEM(color_rules(), i, o)
{
TColor_rule& col = *(TColor_rule*)o;
COLOR back, fore; sel.get_color(col.key(), back, fore);
col.set_colors(back, fore);
}
highlight();
}
}