Files correlati : ve0.exe ve6.exe Ricompilazione Demo : [ ] Commento : Bug 0001703: Fatturazione Bolle (ve6) Nella gestione dei riferimenti in testa non viene scritto il flagh descrizione lunga per cui non si vedono i riferimenti delle bolla dalla seconda in poi (seganalato da Servizi informatici (SIPAG)) Bug 0001702: Documenti interattivi (ve0) Agguingere una elaborazione al tipodocumento in modo da poter effettuare delle operazioni all' atto della registrazione. (HABA) Per utilizzarla correttamente chi la configura deve configurarei stati dell elaborazione perche' venga chiamata quand serve. Modificata anche la lettura dell stato attivo per le provvigioni, da verificare ka genreazioe dell provvigioni. git-svn-id: svn://10.65.10.50/branches/R_10_00@20959 c028cbd2-c16b-5b4b-a496-9718f37d4682
1109 lines
29 KiB
C++
Executable File
1109 lines
29 KiB
C++
Executable File
#include <colmask.h>
|
||
#include <execp.h>
|
||
#include <modaut.h>
|
||
#include <recset.h>
|
||
#include <tabutil.h>
|
||
#include <utility.h>
|
||
#include <urldefid.h>
|
||
|
||
#include "ve0100.h"
|
||
#include "veini.h"
|
||
|
||
#include "vepriv.h"
|
||
#include "veuml1.h"
|
||
#include "verig.h"
|
||
#include "velib04.h"
|
||
|
||
#include "sconti.h"
|
||
#include "../mg/anamag.h"
|
||
#include "../mg/mglib.h"
|
||
|
||
TCursor& TMotore_application::get_filtered_cursor() const
|
||
{
|
||
const TEdit_field& f = _msk->efield(F_NDOC);
|
||
return *f.browse()->cursor();
|
||
}
|
||
|
||
bool TMotore_application::save_and_new() const
|
||
{
|
||
bool new_doc = false;
|
||
|
||
TDocumento_mask & m = edit_mask();
|
||
if (m.insert_mode())
|
||
{
|
||
TDocumento& doc = m.doc();
|
||
new_doc = doc.codice_numerazione().save_and_new();
|
||
}
|
||
|
||
return new_doc;
|
||
}
|
||
|
||
void TMotore_application::init_query_mode( TMask& m )
|
||
{
|
||
disable_menu_item(M_FILE_PRINT);
|
||
disable_menu_item(M_FILE_PREVIEW);
|
||
disable_menu_item(MENU_ITEM_ID(1));
|
||
|
||
TEdit_field& cn = _msk->efield(F_CODNUM);
|
||
|
||
if (!lnflag() && cn.empty() && _codnum.full())
|
||
{
|
||
cn.set(_codnum);
|
||
if (_msk->field(F_TIPODOC).empty() && _tipodoc.full())
|
||
{
|
||
cn.set_focusdirty(TRUE);
|
||
cn.on_key(K_TAB);
|
||
cn.set_dirty(FALSE);
|
||
_msk->set(F_TIPODOC, _tipodoc, TRUE);
|
||
}
|
||
}
|
||
TEdit_field& n = m.efield(F_NDOC);
|
||
|
||
if (!n.empty())
|
||
{
|
||
if (find(0))
|
||
modify_mode();
|
||
}
|
||
}
|
||
|
||
void TMotore_application::init_insert_mode( TMask& m )
|
||
{
|
||
TDocumento_mask& dm = (TDocumento_mask&)m;
|
||
TString4 codnum(m.get(F_CODNUM));
|
||
|
||
enable_menu_item(MENU_ITEM_ID(1));
|
||
dm.reset_father_rows();
|
||
if (codnum.empty())
|
||
{
|
||
TMask * query_mask = get_mask(MODE_QUERY);
|
||
|
||
codnum = query_mask->get(F_CODNUM);
|
||
m.set(F_CODNUM, codnum);
|
||
m.set(F_TIPODOC, query_mask->get(F_TIPODOC));
|
||
m.set(F_ANNO, query_mask->get_int(F_ANNO));
|
||
m.set(F_PROVV, query_mask->get(F_PROVV));
|
||
}
|
||
|
||
const int anno = m.get_int(F_ANNO);
|
||
const char provv = m.get(F_PROVV)[0];
|
||
const long numdoc = m.get_long(F_NDOC);
|
||
|
||
TDocumento& curdo = dm.doc();
|
||
|
||
curdo.read(provv, anno, codnum, numdoc);
|
||
curdo.set_tipo(m.get(F_TIPODOC));
|
||
|
||
const TTipo_documento& tp = curdo.tipo();
|
||
|
||
const char stato = tp.stato_finale_inserimento();
|
||
curdo.stato(stato);
|
||
|
||
_codnum = codnum;
|
||
_tipodoc = m.get(F_TIPODOC);
|
||
|
||
m.field(F_CODNUM).set_focusdirty(TRUE);
|
||
m.field(F_CODNUM).on_key(K_TAB);
|
||
m.field(F_TIPODOC).set_focusdirty(TRUE);
|
||
m.field(F_TIPODOC).on_key(K_TAB);
|
||
|
||
m.set(F_ANNORIF, anno);
|
||
m.set(F_CODNUMRIF, codnum);
|
||
|
||
// Giro per supplire alla mancanza di una TMask::set(short id, char c);
|
||
char str_stato[2] = { stato, '\0' };
|
||
m.set(F_STATO, str_stato);
|
||
|
||
TDate data_doc(TODAY);
|
||
const bool magic_datadoc = m.field(F_DATADOC).automagic();
|
||
if (!magic_datadoc)
|
||
{
|
||
long ndoc = 0; // unused
|
||
last_doc(provv, anno, codnum, ndoc, data_doc);
|
||
}
|
||
m.set(F_DATADOC, data_doc, 0x1);
|
||
|
||
int pos = m.id2pos( F_DATACAMBIO1);
|
||
if (pos >= 0 && m.fld(pos).active() && !m.get(F_CODVAL).empty())
|
||
{
|
||
m.fld(pos).set(data_doc);
|
||
m.fld(pos).dirty();
|
||
}
|
||
|
||
pos = m.id2pos(F_CAUSMAG);
|
||
if (pos >= 0)
|
||
{
|
||
m.fld(pos).set(tp.caus_mov());
|
||
m.fld(pos).dirty();
|
||
}
|
||
|
||
tp.set_defaults(m);
|
||
|
||
if (!dm.field(F_CODCF).empty()) // Carica i dati dell'eventuale cliente
|
||
{
|
||
curdo.put(DOC_TIPOCF, dm.get(F_TIPOCF));
|
||
curdo.put(DOC_CODCF, dm.get(F_CODCF));
|
||
dm.cli2mask(true);
|
||
}
|
||
|
||
if (provv == 'P')
|
||
m.enable(DLG_CONFERMA);
|
||
else
|
||
m.disable(DLG_CONFERMA);
|
||
m.disable(DLG_PRINT);
|
||
m.disable(DLG_PREVIEW);
|
||
m.disable(DLG_EMAIL);
|
||
m.disable(DLG_ELABORA);
|
||
|
||
TSheet_field& ss = dm.sfield(F_SHEET);
|
||
|
||
if (curdo.tipo().auto_add())
|
||
{
|
||
for (int i = 0; i < 10; i++)
|
||
ss.insert(-1, false, true);
|
||
}
|
||
else
|
||
ss.destroy();
|
||
|
||
dm.mask2doc();
|
||
}
|
||
|
||
void TMotore_application::init_modify_mode( TMask& m )
|
||
{
|
||
TEdit_field& n = query_mask().efield(F_NDOC);
|
||
|
||
n.set("");
|
||
n.update_flags("R");
|
||
const bool enable_print = edit_mask().doc().tipo().printable();
|
||
const char provv = m.get(F_PROVV)[0];
|
||
enable_menu_item(MENU_ITEM_ID(1));
|
||
if (provv == 'P')
|
||
{
|
||
m.enable(DLG_CONFERMA);
|
||
m.disable(DLG_PRINT);
|
||
m.disable(DLG_EMAIL);
|
||
m.disable(DLG_PREVIEW);
|
||
enable_menu_item(M_FILE_PRINT, false);
|
||
enable_menu_item(M_FILE_PREVIEW, false);
|
||
}
|
||
else
|
||
{
|
||
m.disable(DLG_CONFERMA);
|
||
m.enable(DLG_PRINT, enable_print);
|
||
m.enable(DLG_EMAIL, enable_print);
|
||
m.enable(DLG_PREVIEW, enable_print);
|
||
enable_menu_item(M_FILE_PRINT, enable_print);
|
||
enable_menu_item(M_FILE_PREVIEW, enable_print);
|
||
}
|
||
m.enable(DLG_ELABORA);
|
||
m.disable(F_STATO);
|
||
|
||
if (m.id2pos(F_CURGIAC)>0 && m.efield(F_CURGIAC).shown())
|
||
{
|
||
cached_article_balances(NULL); // Azzera cache delle giacenze
|
||
edit_mask().update_giacenza(); // Aggiorna giacenza riga corrente
|
||
}
|
||
|
||
TString80 key;
|
||
key << m.get(F_CODNUM);
|
||
key << m.get(F_ANNO);
|
||
key << provv;
|
||
key << m.get(F_NDOC);
|
||
|
||
// Non dare messaggi inutili durante la cancellazione automatica
|
||
if (autodeleting() != 0x3)
|
||
{
|
||
const bool transaction = is_transaction();
|
||
const bool no_mod = !transaction && !doc().modificabile();
|
||
const bool no_del = !doc().cancellabile();
|
||
if (no_del || no_mod)
|
||
{
|
||
if (key != __last_key)
|
||
{
|
||
TString msg;
|
||
msg.format(FR("Documento non %s%s%s."), (no_mod ? TR("modificabile"):""),
|
||
(no_mod && no_del ? TR(" ne' "):""), (no_del ? TR("cancellabile"):""));
|
||
xvtil_statbar_set(msg);
|
||
}
|
||
}
|
||
if (no_mod)
|
||
m.disable(DLG_SAVEREC);
|
||
if (no_del)
|
||
m.disable(DLG_DELREC);
|
||
|
||
if (m.id2pos(F_IBAN_STATO) > 0)
|
||
m.efield(F_IBAN_STATO).validate(K_TAB); // Decodifica IBAN
|
||
}
|
||
__last_key = key;
|
||
}
|
||
|
||
int TMotore_application::user_function(int index)
|
||
{
|
||
switch(index)
|
||
{
|
||
case 1:
|
||
break;
|
||
default:
|
||
yesnofatal_box("Chiamata ad una procedura utente non definita: %d", index);
|
||
return NOERR;
|
||
break;
|
||
}
|
||
return NOERR;
|
||
}
|
||
|
||
bool TMotore_application::changing_mask( int mode )
|
||
{
|
||
static int lastmode = NO_MODE;
|
||
|
||
const bool change = ( mode != lastmode );
|
||
lastmode = mode;
|
||
return change;
|
||
}
|
||
|
||
TMask* TMotore_application::get_mask( int mode )
|
||
{
|
||
if (mode != MODE_INS && mode != MODE_MOD)
|
||
return _msk;
|
||
|
||
TString4 tipodoc = _msk->get(F_TIPODOC); // Prendo il tipo documento dalla maschera di query;
|
||
if (mode == MODE_MOD)
|
||
tipodoc = get_relation()->curr().get(DOC_TIPODOC); // Lo prendo dalla relazione (Gelai)
|
||
|
||
_docmsk = (TDocumento_mask*)_doc_masks.objptr(tipodoc);
|
||
if (_docmsk == NULL)
|
||
{
|
||
_docmsk = new TDocumento_mask(tipodoc);
|
||
_doc_masks.add(tipodoc, _docmsk);
|
||
}
|
||
|
||
return _docmsk;
|
||
}
|
||
|
||
// Cerca numero e data dell'ultimo documento di una numerazione di un anno
|
||
bool TMotore_application::last_doc(char provv, int anno, const char* codnum,
|
||
long& ndoc, TDate& ddoc) const
|
||
{
|
||
TRelation rel(LF_DOC);
|
||
TRectype& curr = rel.curr();
|
||
curr.put(DOC_PROVV, provv);
|
||
curr.put(DOC_ANNO, anno);
|
||
TString cod(codnum); cod.left_just(4, '~');
|
||
curr.put(DOC_CODNUM, cod);
|
||
TCursor cur(&rel, "", 1, &curr, &curr);
|
||
|
||
TRecnotype docs = cur.items();
|
||
bool found = docs > 0;
|
||
|
||
if (found)
|
||
{
|
||
cur = docs-1;
|
||
ndoc = curr.get_long(DOC_NDOC);
|
||
ddoc = curr.get_date(DOC_DATADOC);
|
||
}
|
||
else
|
||
{
|
||
ndoc = 0;
|
||
const TDate oggi(TODAY);
|
||
if (anno < oggi.year())
|
||
ddoc = TDate(31, 12, anno);
|
||
else
|
||
ddoc = oggi;
|
||
}
|
||
return found;
|
||
}
|
||
|
||
const char* TMotore_application::get_next_key( )
|
||
{
|
||
const TMask& m = curr_mask( );
|
||
const TCodice_numerazione& cod_num = cached_numerazione(m.get(F_CODNUM));
|
||
|
||
// Se per questa numerazione e' abilitata le numerazione automatica
|
||
if (cod_num.auto_num())
|
||
{
|
||
TDate ddoc; // unused
|
||
long ndoc = 1;
|
||
if (last_doc(m.get(F_PROVV)[0], m.get_int(F_ANNO), cod_num.codice(), ndoc, ddoc))
|
||
ndoc++;
|
||
else
|
||
ndoc = 1;
|
||
return format("%d|%ld", F_NDOC, ndoc);
|
||
}
|
||
|
||
return "";
|
||
}
|
||
|
||
int TMotore_application::read( TMask& m )
|
||
{
|
||
TDocumento_mask& mask = (TDocumento_mask&) m;
|
||
TRelation_application::read(m);
|
||
|
||
mask.reset_father_rows();
|
||
|
||
|
||
doc() = (TDocumento &)_rel->curr();
|
||
mask.update_father_rows(false);
|
||
|
||
_codnum = m.get(F_CODNUM);
|
||
_tipodoc = m.get(F_TIPODOC);
|
||
|
||
mask.doc2mask();
|
||
|
||
return NOERR;
|
||
}
|
||
|
||
bool TMotore_application::menu(MENU_TAG mt)
|
||
{
|
||
bool ok = true;
|
||
if (mt == MENU_ITEM_ID(1))
|
||
{
|
||
if (_docmsk != NULL)
|
||
_docmsk->sel_color();
|
||
}
|
||
else
|
||
ok = TRelation_application::menu(mt);
|
||
return ok;
|
||
}
|
||
|
||
void TMotore_application::do_elab( TDocumento& doc ) // C 90
|
||
{
|
||
const TString16 codelab = doc.tipo().elaborazione();
|
||
|
||
if (codelab.full())
|
||
{
|
||
TRectype eld = cache().get("%ELD", codelab);
|
||
if (!eld.empty())
|
||
{
|
||
TElaborazione * el = NULL;
|
||
switch (eld.get_int("I0"))
|
||
{
|
||
case _esterna :
|
||
el = new TElaborazione_esterna(eld);
|
||
break;
|
||
case _consegna_ordini:
|
||
el = new TConsegna_ordini(eld);
|
||
break;
|
||
case _fatturazione_bolle :
|
||
el = new TFatturazione_bolle(eld);
|
||
break;
|
||
case _contabilizzazione :
|
||
el = new TContabilizzazione(eld);
|
||
break;
|
||
case _copia_documento :
|
||
el = new TCopia_documento(eld);
|
||
break;
|
||
case _generazione_effetti :
|
||
el = new TGenerazione_effetti(eld);
|
||
break;
|
||
case _consuntivazione_produzione :
|
||
el = new TConsuntivazione_produzione(eld);
|
||
break;
|
||
case _contabilizzazione_analitica :
|
||
el = new TContabilizzazione_analitica(eld);
|
||
break;
|
||
default :
|
||
break;
|
||
}
|
||
TToken_string tipi;
|
||
TToken_string stati;
|
||
|
||
el->tipi_stati_iniziali(tipi, stati);
|
||
if (stati.find(doc.stato()) >= 0)
|
||
{
|
||
TDocumento newdoc(doc.get_char(DOC_PROVV), doc.get_int(DOC_ANNO), el->codice_numerazione_finale(), 0L);
|
||
|
||
TDocumento::copy_data(newdoc.head(), doc.head());
|
||
newdoc.put(DOC_TIPODOC, el->tipo_finale());
|
||
newdoc.put(DOC_STATO, el->stato_finale());
|
||
if (newdoc.tipo().mov_mag())
|
||
newdoc.put(DOC_CAUSMAG, newdoc.tipo().caus_mov());
|
||
else
|
||
newdoc.zero(DOC_CAUSMAG);
|
||
|
||
TLista_documenti in; in.add(doc);
|
||
TLista_documenti out; out.add(newdoc);
|
||
if (el->elabora(in, out, TDate(TODAY), true))
|
||
{
|
||
if (out[0] != newdoc)
|
||
out.rewrite();
|
||
if (doc != in[0])
|
||
doc = in[0];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
int TMotore_application::write( const TMask& m ) // C 90
|
||
{
|
||
TDocumento_mask& mask = (TDocumento_mask&) m;
|
||
TDocumento& d = (TDocumento&)_rel->curr();
|
||
d = mask.doc(); // Trasferisce il documento da maschera a record
|
||
|
||
// Se ho attivato la creazione automatica delle righe allora cancello quelle vuote finali
|
||
if (d.tipo().auto_add())
|
||
{
|
||
for (int r = d.rows(); r > 0; r--)
|
||
{
|
||
const TRiga_documento& dr = d[r];
|
||
if (dr.get(RDOC_CODART).empty() && dr.get(RDOC_DESCR).empty())
|
||
d.destroy_row(r);
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
do_elab(d);
|
||
|
||
const int err = TRelation_application::write(m);
|
||
|
||
if (err == NOERR)
|
||
{
|
||
mask.update_father_rows();
|
||
mask.save_father_rows();
|
||
|
||
// Stampa immediatamente dopo aver salvato se possibile
|
||
if (d.codice_numerazione().save_and_new() && d.tipo().printable())
|
||
{
|
||
const TString& sis = d.tipo().stati_iniziali_stampa();
|
||
if (sis.find(d.stato()) >= 0)
|
||
save_and_print(false, winprinter);
|
||
}
|
||
}
|
||
|
||
return err;
|
||
}
|
||
|
||
int TMotore_application::rewrite( const TMask& m ) // C 90
|
||
{
|
||
TDocumento& d = (TDocumento &) _rel->curr();
|
||
TDocumento_mask& mask = (TDocumento_mask&) m;
|
||
|
||
if (d.bloccato())
|
||
return NOERR;
|
||
d = ((TDocumento_mask&)m).doc(); // Trasferisce il documento da maschera a record
|
||
do_elab(d);
|
||
const int err = TRelation_application::rewrite(m);
|
||
if (err == NOERR)
|
||
{
|
||
mask.update_father_rows();
|
||
mask.save_father_rows();
|
||
}
|
||
return err;
|
||
}
|
||
|
||
bool TMotore_application::remove() // C 90
|
||
{
|
||
TDocumento& d = (TDocumento &) _rel->curr();
|
||
|
||
do_elab(d); // serve ??????
|
||
const bool ok = TRelation_application::remove();
|
||
if (ok)
|
||
edit_mask().save_father_rows();
|
||
return ok;
|
||
}
|
||
|
||
void TMotore_application::on_firm_change()
|
||
{
|
||
if (_config_ditta != NULL)
|
||
delete _config_ditta;
|
||
_config_ditta = new TConfig(CONFIG_DITTA);
|
||
_doc_masks.destroy();
|
||
load_auto_reopen_data();
|
||
TRelation_application::on_firm_change();
|
||
}
|
||
|
||
void TMotore_application::load_auto_reopen_data()
|
||
{
|
||
TAssoc_array & auto_reopen_nums = TDocumento_mask::auto_reopen_nums();
|
||
TAssoc_array & tipidoc_rels = TDocumento_mask::tipidoc_rels();
|
||
TTable num("%NUM");
|
||
TTable eld("%ELD");
|
||
|
||
auto_reopen_nums.destroy();
|
||
tipidoc_rels.destroy();
|
||
for (int err = num.first(); err == NOERR; err = num.next())
|
||
{
|
||
if (num.get_bool("B7"))
|
||
{
|
||
const TString4 codnum = num.get("CODTAB");
|
||
TCodice_numerazione numeraz(codnum);
|
||
const int ntipidoc = numeraz.ntipi_doc();
|
||
TString_array tipi;
|
||
|
||
for (int k = 0 ; k < ntipidoc; k++)
|
||
tipi.add(numeraz.tipo_doc(k));
|
||
auto_reopen_nums.add(codnum, codnum);
|
||
for (int err1 = eld.first(); err1 == NOERR; err1 = eld.next())
|
||
{
|
||
TCopia_documento e(eld.get("CODTAB"));
|
||
const TTipo_elaborazione tipo = e.tipo();
|
||
|
||
if (tipo == _consegna_ordini ||
|
||
tipo == _consuntivazione_produzione)
|
||
{
|
||
const TString4 dest_tipo_doc = e.tipo_finale();
|
||
const char stato_finale = e.stato_finale_doc_iniziale()[0];
|
||
|
||
|
||
for (int i = 0; i < 10; i++)
|
||
{
|
||
TToken_string key(e.tipo_iniziale(i));
|
||
if (key.blank())
|
||
break;
|
||
if (tipi.find(key) >= 0)
|
||
{
|
||
key.add(dest_tipo_doc);
|
||
tipidoc_rels.add(key, new TStati(e.stato_iniziale(i), stato_finale));
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
bool num_filter(const TRelation* r)
|
||
{
|
||
const TCodice_numerazione & cod_num = cached_numerazione(r->curr().get("CODTAB"));
|
||
|
||
const int last = cod_num.ntipi_doc();
|
||
for (int i = 0; i < last; i++ )
|
||
if (tipodoc_ok(cod_num.tipo_doc(i)))
|
||
return true;
|
||
return false;
|
||
}
|
||
|
||
bool TMotore_application::user_create( )
|
||
{
|
||
open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, LF_ANAMAG, LF_SCONTI, LF_UMART, LF_DESLIN, LF_CODCORR,
|
||
LF_TAB, LF_TABCOM, LF_CLIFO, LF_CFVEN, LF_INDSP, LF_OCCAS, LF_PCON, LF_MOV, LF_STOMAG,
|
||
LF_MOVMAG, LF_RMOVMAG, LF_MAG, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
|
||
|
||
TISAM_recordset num("USE %NUM");
|
||
|
||
for (bool ok = num.move_first(); ok; ok = num.move_next())
|
||
const TCodice_numerazione & n = cached_numerazione(num.get("CODTAB").as_string());
|
||
|
||
TISAM_recordset tip("USE %TIP");
|
||
|
||
for (bool ok = tip.move_first(); ok; ok = tip.move_next())
|
||
const TTipo_documento & n = cached_tipodoc(tip.get("CODTAB").as_string());
|
||
|
||
_config_ditta = new TConfig(CONFIG_DITTA);
|
||
|
||
// Metto in relazione testata e righe
|
||
_rel = new TRelation( LF_DOC );
|
||
_rel->lfile().set_curr(new TDocumento);
|
||
|
||
_msk = new TMask(query_mask_name());
|
||
set_search_field(F_NDOC);
|
||
|
||
_msk->set_handler( F_ANNO, TDocumento_mask::anno_handler );
|
||
_msk->set_handler( F_CODNUM, TDocumento_mask::num_handler );
|
||
_msk->set_handler( F_NUMDOCRIF, TDocumento_mask::numdocrif_search_handler );
|
||
_msk->set_handler( F_RAGSOCSEARCH, TDocumento_mask::ragsoc_search_handler );
|
||
|
||
const int args = argc() ;
|
||
|
||
TEdit_field & e = _msk->efield(F_CODNUM);
|
||
TBrowse * b = e.browse();
|
||
TEdit_field & edes = _msk->efield(F_DESNUM);
|
||
TBrowse * bdes = edes.browse();
|
||
TCursor * cur = b->cursor();
|
||
TCursor * descur = bdes->cursor();
|
||
|
||
cur->set_filterfunction(num_filter);
|
||
descur->set_filterfunction(num_filter);
|
||
|
||
for (int i = 2; i < args; i++)
|
||
{
|
||
const TFixed_string arg(argv(i));
|
||
|
||
if (arg.starts_with("-def"))
|
||
{
|
||
TToken_string str(arg.mid(4), ',');
|
||
//attenzione: non ridefinire le TString16 in TString4 perch<63> il nome di variabile codnum non c'entra un benemerito..
|
||
//..cazzo con codnum, ma pu<70> essere una variabile qualunque (compliemti all'astuzia nella scelta del nome)
|
||
const TString16 codnum(str.get());
|
||
const TString16 tipodoc(str.get());
|
||
const TString16 paragraph(str.get());
|
||
|
||
if (paragraph.blank())
|
||
{
|
||
_codnum = codnum;
|
||
_tipodoc = tipodoc;
|
||
}
|
||
else
|
||
{
|
||
TConfig c(CONFIG_DITTA, paragraph);
|
||
_codnum = c.get(codnum);
|
||
_tipodoc = c.get(tipodoc);
|
||
}
|
||
}
|
||
else
|
||
if (arg.starts_with("-filt"))
|
||
{
|
||
if (b != NULL || bdes != NULL)
|
||
{
|
||
TString filter = b->get_filter();
|
||
if (filter.full())
|
||
{
|
||
filter.insert("(");
|
||
filter << ")&&(" << arg.mid(5) << ")";
|
||
if (b != NULL)
|
||
b->set_filter(filter);
|
||
if (bdes != NULL)
|
||
bdes->set_filter(filter);
|
||
}
|
||
else
|
||
{
|
||
const TString newfilter(arg.mid(5));
|
||
if (b != NULL)
|
||
b->set_filter(newfilter);
|
||
if (bdes != NULL)
|
||
bdes->set_filter(newfilter);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
TConfig utente(CONFIG_GUI, app().name().left(2));
|
||
if (_codnum.blank())
|
||
_codnum = utente.get("CODNUM");
|
||
if (_tipodoc.blank())
|
||
_tipodoc = utente.get("TIPODOC");
|
||
_docmsk = NULL;
|
||
|
||
load_auto_reopen_data();
|
||
|
||
return true;
|
||
}
|
||
|
||
bool TMotore_application::user_destroy( )
|
||
{
|
||
// Registro l'ultimo tipo documento e l'ultima numerazione
|
||
TConfig utente( CONFIG_GUI, app().name().left(2) );
|
||
utente.set( "CODNUM", _codnum );
|
||
utente.set( "TIPODOC", _tipodoc );
|
||
|
||
if (_config_ditta != NULL)
|
||
delete _config_ditta;
|
||
// Distruggo la maschera di modifica
|
||
if ( _msk != NULL )
|
||
delete _msk;
|
||
|
||
// Distruggo la relazione
|
||
delete _rel;
|
||
// delete _condv;
|
||
|
||
return true;
|
||
}
|
||
|
||
int TMotore_application::stato_corrente( )
|
||
{
|
||
return edit_mask().get_int(F_STATO);
|
||
}
|
||
|
||
void TMotore_application::sheet2ini(TSheet_field &sheet,TConfig& ini)
|
||
{
|
||
// scrive le righe degli sheet associati
|
||
TString16 defpar;
|
||
TString str(80);
|
||
TDocumento_mask &m = (TDocumento_mask &)sheet.mask();
|
||
int r;
|
||
|
||
for (r = 1; r <= sheet.items(); r++)
|
||
{
|
||
defpar.format("%d,%d",LF_RIGHEDOC,r);
|
||
const TMask * sm = m.riga_mask(r-1);
|
||
const TToken_string rigar = sheet.row(r-1);
|
||
for (int sf = 0; sf < sm->fields(); sf++)
|
||
{
|
||
TMask_field& campo = sm->fld(sf);
|
||
if (campo.shown() && campo.field())
|
||
{
|
||
// str = sheet.row(r-1).get(sheet.cid2index(campo.dlg()));
|
||
const short id = campo.dlg();
|
||
rigar.get(sheet.cid2index(id), str);
|
||
if (str.empty())
|
||
str = " ";
|
||
const word field_class = campo.class_id();
|
||
if (field_class == CLASS_MEMO_FIELD ||
|
||
field_class == CLASS_ZOOM_FIELD)
|
||
{
|
||
int p;
|
||
while ((p = str.find('\n', 0)) >= 0)
|
||
{
|
||
str.overwrite("\\", p);
|
||
str.insert("n", p+1);
|
||
}
|
||
}
|
||
if (campo.field()->name() == RDOC_PREZZO)
|
||
{
|
||
TCodiceIVA c(sm->get(FR_CODIVA));
|
||
TFieldref l;
|
||
real prezzo(str);
|
||
real prezzol;
|
||
|
||
l = RDOC_PREZZOL;
|
||
if (m.doc().tipo().calcolo_lordo())
|
||
{
|
||
prezzol = prezzo;
|
||
c.scorpora(prezzo);
|
||
}
|
||
else
|
||
prezzol = c.lordo(prezzo);
|
||
l.write(ini, defpar, prezzol.string());
|
||
str = prezzo.string();
|
||
}
|
||
campo.field()->write(ini, defpar, str);
|
||
}
|
||
const TRiga_documento &rdoc = m.doc()[r];
|
||
TFieldref f;
|
||
|
||
f = RDOC_DACODNUM;
|
||
f.write(ini, defpar, rdoc.get(RDOC_DACODNUM));
|
||
f = RDOC_DAANNO;
|
||
f.write(ini, defpar, rdoc.get(RDOC_DAANNO));
|
||
f = RDOC_DAPROVV;
|
||
f.write(ini, defpar, rdoc.get(RDOC_DAPROVV));
|
||
f = RDOC_DANDOC;
|
||
f.write(ini, defpar, rdoc.get(RDOC_DANDOC));
|
||
f = RDOC_DAIDRIGA;
|
||
f.write(ini, defpar, rdoc.get(RDOC_DAIDRIGA));
|
||
}
|
||
}
|
||
for ( ; ; r++)
|
||
{
|
||
defpar.format("%d,%d",LF_RIGHEDOC,r);
|
||
if (ini.set_paragraph(defpar))
|
||
ini.remove_all();
|
||
else
|
||
break;
|
||
}
|
||
}
|
||
|
||
void TMotore_application::ini2mask(TConfig& ini, TMask& msk, bool query)
|
||
{
|
||
TRelation_application::ini2mask(ini, msk, query); // Default processing
|
||
|
||
if (query)
|
||
{
|
||
// Dobbiamo riempire il tipo documento per determinare il profilo corretto!
|
||
TMask_field& campo = msk.field(F_TIPODOC);
|
||
TString16 str = campo.field()->read(ini, format("%d", LF_DOC));
|
||
if (str.empty())
|
||
{
|
||
TToken_string key;
|
||
key.add(msk.get(F_PROVV));
|
||
key.add(msk.get(F_ANNO));
|
||
key.add(msk.get(F_CODNUM));
|
||
key.add(msk.get(F_NDOC));
|
||
str = cache().get(LF_DOC, key, DOC_TIPODOC);
|
||
}
|
||
campo.set(str);
|
||
|
||
}
|
||
else
|
||
{
|
||
TDocumento & d = doc();
|
||
|
||
d.put(DOC_TIPOCF, msk.get(F_TIPOCF));
|
||
d.put(DOC_CODCF, msk.get(F_CODCF));
|
||
|
||
const TCli_for & c = d.clifor();
|
||
const TRectype & ven_rec = c.vendite();
|
||
|
||
ini.set_paragraph("33");
|
||
|
||
if (!ini.exist(DOC_CODVAL))
|
||
{
|
||
const TString4 codval = c.get(CLI_CODVAL); // Attenzione: Non usare TString& qui!
|
||
msk.set(F_CODVAL, codval, true);
|
||
msk.set(F_CODVAL1, codval, true);
|
||
if (codval.blank())
|
||
msk.reset(F_CAMBIO);
|
||
}
|
||
if (!ini.exist(DOC_CODLIN))
|
||
msk.set(F_CODLIN, c.get(CLI_CODLIN), true);
|
||
if (!ini.exist(DOC_CODPAG))
|
||
msk.set(F_CODPAG, c.get(CLI_CODPAG), true);
|
||
if (!ini.exist(DOC_CODABIA))
|
||
msk.set(F_CODABIA, c.get(CLI_CODABI), true);
|
||
if (!ini.exist(DOC_CODCABA))
|
||
msk.set(F_CODCABA, c.get(CLI_CODCAB), true);
|
||
if (!ini.exist(DOC_IBAN))
|
||
{
|
||
const TString & iban = c.get(CLI_IBAN);
|
||
|
||
msk.set(F_IBAN, iban, true);
|
||
if (iban.not_empty())
|
||
{
|
||
msk.set(F_IBAN_STATO, iban.left(2));
|
||
msk.set(F_IBAN_CHECK, iban.mid(2,2));
|
||
msk.set(F_BBAN , iban.mid(4));
|
||
msk.set(F_BBAN_CIN , iban.mid(4,1));
|
||
msk.set(F_BBAN_ABI , iban.mid(5,5));
|
||
msk.set(F_BBAN_CAB , iban.mid(10,5));
|
||
msk.set(F_BBAN_CONTO, iban.mid(15,12));
|
||
}
|
||
}
|
||
// Setta i campi che appartengono al file LF_CFVEN
|
||
if (!ini.exist(DOC_CODABIP))
|
||
msk.set(F_CODABIP, ven_rec.get(CFV_CODABIPR), true);
|
||
if (!ini.exist(DOC_CODCABP))
|
||
msk.set(F_CODCABP, ven_rec.get(CFV_CODCABPR), true);
|
||
if (!ini.exist(DOC_RAGGR))
|
||
msk.set(F_RAGGR, ven_rec.get(CFV_RAGGDOC));
|
||
if (!ini.exist(DOC_RAGGREFF))
|
||
msk.set(F_RAGGREFF, ven_rec.get(CFV_RAGGEFF));
|
||
if (!ini.exist(DOC_CODINDSP))
|
||
msk.set(F_CODINDSP, ven_rec.get(CFV_CODINDSP), true);
|
||
if (!ini.exist(DOC_CODAG))
|
||
msk.set(F_CODAG, ven_rec.get(CFV_CODAG));
|
||
if (!ini.exist(DOC_CODAGVIS))
|
||
msk.set(F_CODAGVIS, ven_rec.get(CFV_CODAG1));
|
||
if (!ini.exist(DOC_CODSPMEZZO))
|
||
msk.set(F_CODSPMEZZO, ven_rec.get(CFV_CODSPMEZZO), true);
|
||
if (!ini.exist(DOC_CODPORTO))
|
||
msk.set(F_CODPORTO, ven_rec.get(CFV_CODPORTO), true);
|
||
if (!ini.exist(DOC_CODNOTESP1))
|
||
msk.set(F_CODNOTESP1, ven_rec.get(CFV_CODNOTESP1), true);
|
||
if (!ini.exist(DOC_CODNOTESP2))
|
||
msk.set(F_CODNOTESP2, ven_rec.get(CFV_CODNOTESP2), true);
|
||
if (!ini.exist(DOC_CODNOTE))
|
||
msk.set(F_CODNOTE, ven_rec.get(CFV_CODNOTE), true);
|
||
if (!ini.exist(DOC_CODVETT1))
|
||
msk.set(F_CODVETT1, ven_rec.get(CFV_CODVETT1), true);
|
||
if (!ini.exist(DOC_CODVETT2))
|
||
msk.set(F_CODVETT2, ven_rec.get(CFV_CODVETT2), true);
|
||
if (!ini.exist(DOC_CODVETT3))
|
||
msk.set(F_CODVETT3, ven_rec.get(CFV_CODVETT3), true);
|
||
if (!ini.exist(DOC_PERCSPINC))
|
||
msk.set(F_SPESEINC, ven_rec.get(CFV_PERCSPINC));
|
||
if (!ini.exist(DOC_ADDBOLLI))
|
||
msk.set(F_ADDBOLLI, ven_rec.get(CFV_ADDBOLLI));
|
||
if (!ini.exist(DOC_CATVEN))
|
||
msk.set(F_CATVEN, ven_rec.get(CFV_CATVEN), false);
|
||
if (!ini.exist(DOC_ZONA))
|
||
msk.set(F_CODZON, ven_rec.get(CFV_CODZONA), true);
|
||
if (!ini.exist(DOC_CODLIST))
|
||
{
|
||
const TString16 codlist = ven_rec.get(CFV_CODLIST);
|
||
|
||
msk.set(F_CODLIST, codlist, true);
|
||
msk.set(F_CODLIST1, codlist, true);
|
||
}
|
||
|
||
TSheet_field& f = msk.sfield(F_SHEET);
|
||
|
||
TTipo_riga_documento tr;
|
||
|
||
// Scorre tutti i paragrafi delle righe documento
|
||
const TMaskmode oldmode= (TMaskmode)msk.mode();
|
||
|
||
msk.set_mode(MODE_MOD);
|
||
for (int i = 1; ini.set_paragraph(format("%d,%d", LF_RIGHEDOC, i)); i++)
|
||
{
|
||
if (i == 1) // Se trovo almeno una riga allora cancello tutto, poi aggiungo le righe
|
||
{
|
||
f.destroy();
|
||
doc().destroy_rows();
|
||
}
|
||
|
||
// Considera solo i tipi riga validi
|
||
const TString16 tipo(ini.get(RDOC_TIPORIGA));
|
||
if (tr.read(tipo) == NOERR)
|
||
{
|
||
// Crea una nuova riga documento
|
||
TRiga_documento& rec = doc().new_row(tipo);
|
||
// Riempie i campi della nuova riga
|
||
TAssoc_array& var = ini.list_variables();
|
||
FOR_EACH_ASSOC_STRING(var, obj, key, val)
|
||
{
|
||
if (*val == '"' || *val == '\'')
|
||
{
|
||
const int len = strlen(val);
|
||
*(char*)(val+len-1) = '\0';
|
||
val++;
|
||
}
|
||
|
||
if (xvt_str_compare_ignoring_case(key, RDOC_DESCR) == 0) // Trattamento speciale per la descrizione qui verificare
|
||
{
|
||
TString s = esc(val); s.rtrim();
|
||
int split_pos = s.find('\n');
|
||
const int descr_len = rec.length(RDOC_DESCR);
|
||
if (split_pos < 0 && s.len() > descr_len)
|
||
split_pos = descr_len;
|
||
if (split_pos > descr_len)
|
||
split_pos = descr_len;
|
||
if (split_pos > 0)
|
||
{
|
||
rec.put(RDOC_DESCR, s.left(split_pos));
|
||
rec.put(RDOC_DESCLUNGA, "X");
|
||
rec.put(RDOC_DESCEST, s.mid(split_pos));
|
||
}
|
||
else
|
||
{
|
||
rec.put(RDOC_DESCR, s);
|
||
rec.zero(RDOC_DESCLUNGA);
|
||
rec.zero(RDOC_DESCEST);
|
||
}
|
||
|
||
}
|
||
else
|
||
if (xvt_str_compare_ignoring_case(key, RDOC_NRIGA) != 0) // Ignora il numero riga ..
|
||
if (xvt_str_compare_ignoring_case(key, RDOC_TIPORIGA) != 0) // ... ed il tipo riga
|
||
rec.put(key, val);
|
||
}
|
||
|
||
// solo la insert chiama la post_insert necessaria alla disabilitazione verifichiamo
|
||
// l'autoload ??
|
||
f.insert(-1, FALSE);
|
||
// Aggiunge la riga allo sheet
|
||
|
||
const bool checked = rec.get_bool(RDOC_CHECKED);
|
||
|
||
if (checked)
|
||
{
|
||
const TString& codart = rec.get(RDOC_CODARTMAG);
|
||
|
||
if (codart.full())
|
||
{
|
||
const TRectype& art = cache().get(LF_ANAMAG, codart);
|
||
if (art.empty())
|
||
{
|
||
error_box(FR("Articolo non valido sulla riga %d: %s"), i, (const char*)codart);
|
||
rec.zero(RDOC_CODARTMAG);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (!ini.exist(RDOC_DESCR))
|
||
{
|
||
const TString& codart = rec.get(RDOC_CODARTMAG);
|
||
if (codart.full())
|
||
{
|
||
const TRectype& art = cache().get(LF_ANAMAG, codart);
|
||
|
||
rec.put(RDOC_DESCR, art.get(ANAMAG_DESCR));
|
||
rec.put(RDOC_CODIVA, art.get(ANAMAG_CODIVA));
|
||
}
|
||
rec.put(RDOC_CHECKED, "X");
|
||
}
|
||
}
|
||
|
||
if (!ini.exist(RDOC_CODIVA) && !(rec.is_descrizione() || rec.is_sconto() || rec.is_sconto_perc()))
|
||
{
|
||
const TString4 codiva = ((TDocumento_mask &) msk).doc().codesiva();
|
||
|
||
if (codiva.full())
|
||
rec.put(RDOC_CODIVA, codiva);
|
||
}
|
||
rec.autoload(f);
|
||
f.check_row(f.items() - 1, 0x2);
|
||
|
||
if (!checked) //se non e' checked, il record viene autosalvato (in modo che sia salvato completamente)
|
||
rec.autosave(f);
|
||
}
|
||
}
|
||
msk.set_mode(oldmode);
|
||
}
|
||
}
|
||
|
||
bool TMotore_application::save_and_print(bool savedoc, TPrtype mode)
|
||
{
|
||
if (savedoc)
|
||
{
|
||
if (save(false))
|
||
edit_mask().update_father_rows(false);
|
||
else
|
||
return false;
|
||
}
|
||
|
||
TDocumento& doc = (TDocumento&)get_relation()->curr();
|
||
|
||
const TTipo_documento& tipo = doc.tipo();
|
||
TFilename rep;
|
||
|
||
int filter = has_module(RSAUT) ? 2 : 1;
|
||
while (filter > 0 && !tipo.main_print_profile(rep, filter))
|
||
filter--;
|
||
|
||
if (filter > 0)
|
||
{
|
||
const bool da_stampare = doc.stampabile();
|
||
|
||
TString commandline;
|
||
commandline = "ve1 -";
|
||
if (filter == 2)
|
||
commandline << 2; // Esiste il nuovo report :-)
|
||
else
|
||
commandline << 0; // Esiste il vecchio form :-(
|
||
|
||
commandline << ' ' << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_ANNO)
|
||
<< ' ' << doc.get(DOC_PROVV) << ' ' << doc.get(DOC_NDOC) << ' ';
|
||
switch (mode)
|
||
{
|
||
case exportprinter: commandline << " E"; break;
|
||
case fileprinter : commandline << " P"; break;
|
||
case screenvis : commandline << " A"; break;
|
||
default : commandline << " S"; break;
|
||
}
|
||
commandline << ' ' << (da_stampare ? 'D' : 'P');
|
||
|
||
const int ncopie = tipo.ncopie();
|
||
if (ncopie > 0)
|
||
commandline << ' ' << ncopie;
|
||
|
||
TExternal_app interattivo( commandline );
|
||
if (interattivo.run() == NOERR)
|
||
{
|
||
if (da_stampare) // Aggiorna stato documento se necessario
|
||
{
|
||
TDocumento_mask& m = edit_mask();
|
||
TDocumento& maindoc = m.doc();
|
||
maindoc.read(); // Aggiorna STATO e MOVMAG generati da ve1
|
||
|
||
// Lo stato del documento vive di vita propria
|
||
const char sfs = maindoc.tipo().stato_finale_stampa();
|
||
maindoc.stato(sfs);
|
||
const char str_sfs[2] = { sfs, '\0' };
|
||
m.set(F_STATO, str_sfs, true);
|
||
init_modify_mode(m);
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
rep.ext("");
|
||
return error_box("Il profilo %s non esiste", (const char*)rep);
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
void TMotore_application::print()
|
||
{
|
||
if (edit_mask().id2pos(DLG_PREVIEW) < 0)
|
||
save_and_print(true, printer().printtype());
|
||
else
|
||
save_and_print(true, winprinter);
|
||
}
|
||
|
||
void TMotore_application::mailto()
|
||
{
|
||
save_and_print(true, exportprinter);
|
||
}
|
||
|
||
void TMotore_application::preview()
|
||
{
|
||
save_and_print(true, screenvis);
|
||
}
|
||
|
||
int ve0100( int argc, char* argv[])
|
||
{
|
||
TMotore_application a;
|
||
a.run( argc, argv, TR("Gestione documenti"));
|
||
return 0;
|
||
}
|