c62585cb7e
Files correlati : batbtip.msk ve0.exe ve2.exe ve6.exe (tutti i profili standard) Ricompilazione Demo : [ ] Commento : GF20048 Ho inserito una riga merce nella quale oltre ad attribuire la commessa ho attribuito la fase solo che mi appare il codice di questa e non la descrizione, se sulla descrizione della fase clicco su nuovo mi appare il seguente messaggio d'errore:"Impossibile leggere il file batbfas.msk " GF20049 Se dalla gestione dei documenti cerco di contabilizzare una fattura intra quindi con la sputa nella causale contabile operazione intracomunitaria dà errore ve0 questo programma ha eseguito un'operazione non valida e sarà terminato GF20050 Cercando di contabilizzare delle fatture intra quindi con la sputa nella causale contabile operazione intracomunitaria dà errore ve6 questo programma ha eseguito un'operazione non valida e sarà terminato GF20051 Sto inserendo un documento con valuta blank quindi quella di conto solo che avendo attivato la gestione dei documenti in valuta mi dà il seguente messaggio:"il cambio è obbligatorio" GF20052 Nonostante cerchi di cambiare l'impostazione delle colonne quando entro nel movimento successivo l'impostazione è ritornata a prima della variazione GF20053 Lanciando la stampa la colonna standard intestata come TOTALE arrotonda gli importi all'intero git-svn-id: svn://10.65.10.50/trunk@11295 c028cbd2-c16b-5b4b-a496-9718f37d4682
539 lines
14 KiB
C++
Executable File
539 lines
14 KiB
C++
Executable File
#include <execp.h>
|
|
#include <defmask.h>
|
|
#include <tabutil.h>
|
|
#include <utility.h>
|
|
#include <urldefid.h>
|
|
|
|
#include "ve0100.h"
|
|
#include "veini.h"
|
|
|
|
#include "veuml.h"
|
|
#include "veuml1.h"
|
|
#include "verig.h"
|
|
|
|
#include "sconti.h"
|
|
#include "..\mg\mglib.h"
|
|
|
|
void TMotore_application::init_query_mode( TMask& m )
|
|
{
|
|
disable_menu_item(M_FILE_PRINT);
|
|
|
|
TEdit_field& cn = _msk->efield(F_CODNUM);
|
|
if (cn.empty())
|
|
{
|
|
cn.set(_codnum);
|
|
if (_msk->field(F_TIPODOC).empty())
|
|
{
|
|
cn.set_focusdirty(TRUE);
|
|
cn.on_key(K_TAB);
|
|
cn.set_dirty(FALSE);
|
|
_msk->set(F_TIPODOC, _tipodoc, TRUE);
|
|
}
|
|
}
|
|
}
|
|
|
|
void TMotore_application::init_insert_mode( TMask& m )
|
|
{
|
|
const TString16 codnum(m.get(F_CODNUM));
|
|
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_mask& dm = (TDocumento_mask&)m;
|
|
TDocumento& curdo = dm.doc();
|
|
|
|
curdo.read(provv, anno, codnum, numdoc);
|
|
curdo.set_tipo(m.get(F_TIPODOC));
|
|
|
|
const char stato = curdo.tipo().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);
|
|
|
|
// 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);
|
|
|
|
TLocalisamfile doc(LF_DOC);
|
|
TDate data_doc(TODAY);
|
|
|
|
doc.curr() = curdo.head();
|
|
doc.read(_isgteq);
|
|
if (doc.eof() || doc.prev() == NOERR)
|
|
{
|
|
if (doc.curr().same_key(curdo.head(), 1, 1))
|
|
data_doc = doc.get_date(DOC_DATADOC);
|
|
}
|
|
m.set(F_DATADOC, data_doc);
|
|
|
|
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();
|
|
}
|
|
m.disable(DLG_PRINT);
|
|
|
|
pos = m.id2pos(F_CAUSMAG);
|
|
|
|
if (pos >= 0)
|
|
{
|
|
m.fld(pos).set(curdo.tipo().caus_mov());
|
|
m.fld(pos).dirty();
|
|
}
|
|
|
|
TTipo_documento& tp = (TTipo_documento&) curdo.tipo();
|
|
tp.set_defaults(m);
|
|
|
|
m.disable(DLG_ELABORA);
|
|
}
|
|
|
|
void TMotore_application::init_modify_mode( TMask& m )
|
|
{
|
|
static TString80 __last_key;
|
|
|
|
enable_menu_item(M_FILE_PRINT);
|
|
m.enable(DLG_PRINT);
|
|
m.enable(DLG_ELABORA);
|
|
m.disable(F_STATO);
|
|
TString80 key;
|
|
key << m.get(F_CODNUM);
|
|
key << m.get_int(F_ANNO);
|
|
key << m.get(F_PROVV)[0];
|
|
key << m.get_long(F_NDOC);
|
|
|
|
// Non dare messaggi inutili durante la cancellazione automatica
|
|
if (autodeleting() != 0x3)
|
|
{
|
|
const bool transaction = is_transaction();
|
|
const bool no_mod = !doc().modificabile() && !transaction;
|
|
const bool no_del = !doc().cancellabile();
|
|
if (no_del || no_mod)
|
|
{
|
|
if (key != __last_key)
|
|
{
|
|
TString msg;
|
|
msg.format("Documento non %s%s%s.", (no_mod ? "modificabile":""),
|
|
(no_mod && no_del ? " ne' ":""), (no_del ? "cancellabile":""));
|
|
if (transaction)
|
|
{
|
|
TTimed_box box("Attenzione", msg, 5, DLG_OK, 32, 5);
|
|
|
|
box.add_button(DLG_OK, 0, "", -11, -1, 10, 2);
|
|
box.run();
|
|
}
|
|
else
|
|
warning_box(msg);
|
|
}
|
|
}
|
|
if (no_mod)
|
|
m.disable(DLG_SAVEREC);
|
|
if (no_del)
|
|
m.disable(DLG_DELREC);
|
|
}
|
|
__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 )
|
|
{
|
|
switch ( mode )
|
|
{
|
|
case MODE_INS:
|
|
case MODE_MOD:
|
|
{
|
|
const TString16 tipodoc(_msk->get(F_TIPODOC));
|
|
_docmsk = (TDocumento_mask*)_doc_masks.objptr(tipodoc);
|
|
|
|
if (_docmsk == NULL)
|
|
{
|
|
_docmsk = new TDocumento_mask(tipodoc);
|
|
_doc_masks.add(tipodoc, _docmsk);
|
|
}
|
|
}
|
|
return _docmsk;
|
|
break;
|
|
default:
|
|
return _msk;
|
|
break;
|
|
}
|
|
}
|
|
|
|
const char* TMotore_application::get_next_key( )
|
|
{
|
|
TMask& m = curr_mask( );
|
|
TCodice_numerazione cod_num(m.get(F_CODNUM));
|
|
|
|
// Se per questa numerazione h abilitata le numerazione automatica
|
|
if( cod_num.auto_num())
|
|
{
|
|
TLocalisamfile doc(LF_DOC);
|
|
doc.zero();
|
|
doc.put("CODNUM", cod_num.codice());
|
|
doc.put("ANNO", m.get(F_ANNO));
|
|
doc.put("PROVV", m.get(F_PROVV));
|
|
|
|
TRectype cmp_rec(doc.curr()); // record campione
|
|
|
|
doc.put( "NDOC", 9999999L );
|
|
if (doc.read(_isgreat) == NOERR)
|
|
doc.prev();
|
|
else
|
|
doc.last();
|
|
|
|
const long num = ((doc.curr() == cmp_rec) ? doc.get_long( "NDOC" ) : 0) + 1;
|
|
|
|
return (format( "%d|%ld", F_NDOC, num));
|
|
}
|
|
return "";
|
|
}
|
|
|
|
int TMotore_application::read( TMask& m )
|
|
{
|
|
// m.autoload(*_rel);
|
|
TRelation_application::read(m);
|
|
doc() = (TDocumento &)_rel->curr();
|
|
_codnum = m.get(F_CODNUM);
|
|
_tipodoc = m.get(F_TIPODOC);
|
|
|
|
((TDocumento_mask &)m).doc2mask();
|
|
COLOR high_back_color = _sel_color->get_back_color(_link_pos);
|
|
COLOR high_color = _sel_color->get_fore_color(_link_pos);
|
|
|
|
((TDocumento_mask &)m).highlight(high_back_color, high_color);
|
|
|
|
return NOERR;
|
|
}
|
|
|
|
bool TMotore_application::menu(MENU_TAG mt)
|
|
{
|
|
bool ok = TRUE;
|
|
if (mt == MENU_ITEM(1))
|
|
{
|
|
_sel_color->run();
|
|
COLOR high_back_color = _sel_color->get_back_color(_link_pos);
|
|
COLOR high_color = _sel_color->get_fore_color(_link_pos);
|
|
|
|
if (!query_mask().is_running())
|
|
{
|
|
TDocumento_mask * m = (TDocumento_mask * ) &edit_mask();
|
|
|
|
if (m != NULL)
|
|
m->highlight(high_back_color, high_color);
|
|
}
|
|
}
|
|
else
|
|
ok = TRelation_application::menu(mt);
|
|
return ok;
|
|
}
|
|
|
|
int TMotore_application::write( const TMask& m ) // C 90
|
|
{
|
|
TDocumento& d = (TDocumento&) _rel->curr();
|
|
d = ((TDocumento_mask&)m).doc();
|
|
return TRelation_application::write(m);
|
|
}
|
|
|
|
int TMotore_application::rewrite( const TMask& m ) // C 90
|
|
{
|
|
TDocumento& d = (TDocumento &) _rel->curr();
|
|
if (d.bloccato())
|
|
return 0;
|
|
d = ((TDocumento_mask&)m).doc();
|
|
return TRelation_application::rewrite(m);
|
|
}
|
|
|
|
void TMotore_application::on_firm_change()
|
|
{
|
|
if (_config_ditta != NULL)
|
|
delete _config_ditta;
|
|
_config_ditta = new TConfig(CONFIG_DITTA);
|
|
// condv().set_config(_config_ditta);
|
|
_doc_masks.destroy();
|
|
TApplication::on_firm_change();
|
|
}
|
|
|
|
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);
|
|
|
|
|
|
_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("ve0100a");
|
|
_sel_color = new TSelect_color_mask("ve0100a", "0");
|
|
set_search_field(F_NDOC);
|
|
_link_pos =_sel_color->add_color_def("LINKED", "Righe collegate a documento", COLOR_YELLOW, COLOR_BLACK);
|
|
|
|
_msk->set_handler( F_CODNUM, TDocumento_mask::num_handler );
|
|
_msk->set_handler( F_TIPODOC, TDocumento_mask::tip_handler );
|
|
_msk->set_handler( F_NUMDOCRIF, TDocumento_mask::numdocrif_search_handler );
|
|
|
|
TConfig utente( CONFIG_USER );
|
|
_codnum = utente.get("CODNUM");
|
|
_tipodoc = utente.get("TIPODOC");
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
bool TMotore_application::user_destroy( )
|
|
{
|
|
// Registro l'ultimo tipo documento e l'ultima numerazione
|
|
TConfig utente( CONFIG_USER );
|
|
utente.set( "CODNUM", _codnum, "ve" );
|
|
utente.set( "TIPODOC", _tipodoc, "ve" );
|
|
|
|
if (_config_ditta != NULL)
|
|
delete _config_ditta;
|
|
// Distruggo la maschera di modifica
|
|
if ( _msk != NULL )
|
|
delete _msk;
|
|
|
|
if ( _sel_color != NULL )
|
|
delete _sel_color;
|
|
|
|
// 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();
|
|
for (int 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);
|
|
}
|
|
}
|
|
campo.field()->write(ini, defpar, str);
|
|
}
|
|
}
|
|
}
|
|
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
|
|
{
|
|
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 (stricmp(key, RDOC_DESCR) == 0) // Trattamento speciale per la descrizione
|
|
{
|
|
const TString s(esc(val));
|
|
int split_pos = s.find('\n');
|
|
const int descr_len = rec.length("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.put(RDOC_DESCLUNGA, "");
|
|
rec.zero(RDOC_DESCEST);
|
|
}
|
|
|
|
}
|
|
else
|
|
if (stricmp(key, RDOC_NRIGA) != 0) // Ignora il numero riga ..
|
|
if (stricmp(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.blank())
|
|
{
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
|
|
void TMotore_application::print()
|
|
{
|
|
if (save(TRUE)) // Registra il record corrente
|
|
{
|
|
TDocumento_mask& m = edit_mask();
|
|
const TTipo_documento& tipo = m.doc().tipo();
|
|
const bool da_stampare = m.doc().stampabile();
|
|
|
|
TString commandline("ve1 -0 ");
|
|
commandline << m.get(F_CODNUM) << ' ' << m.get(F_ANNO) << ' ';
|
|
commandline << m.get(F_PROVV) << ' ' << m.get(F_NDOC) << ' ' << m.get(F_NDOC);
|
|
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)
|
|
{
|
|
const char s[2] = { tipo.stato_finale_stampa(), '\0'};
|
|
m.set(F_STATO, s, TRUE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
int ve0100( int argc, char* argv[])
|
|
{
|
|
TMotore_application a;
|
|
|
|
a.run( argc, argv, TR("Gestione documenti"));
|
|
return 0;
|
|
}
|