Files correlati : ve6.exe ve6100a.msk Ricompilazione Demo : [ ] Commento : AO20061 Se sul tipo documento interessato per la contabilizzazione dello stesso ho selezionato il campo "Calcolo importi al lordo" non mi contabilizza nessun documento creato con questa modalità, appena tolgo il flag invece mi contabilizza tutto. ATTENZIONE: Non succede in generale, infatti nelle prove fatte funziona sempre. Ne deriva che occorrono importi ben precisi e quindi occorrono i dati specifici per ricreare la situazione di errore. Normalmente basta aumentare i decimali degli importi. AO20062 Per un tipo documento ho specificato "Calcolo importi al lordo"; spostandomi col TAB da un campo all'altro della riga di dettaglio mi toglie sempre il check da "Lordo", inoltre contrariamente alla vecchia versione tale campo degli Importi al Lordo non è più selezionabile tramite tastiera, ciò determina che una volta inserito il prezzo debba rispuntare col mouse tale campo, mentre una volta era sufficiente scorrere i campi col tab e mettere la 'X' quindi l'inserimento degli importi al lordo risultava molto più agevole. ATTENZIONE: Si tratta di una scelta operata con le nuove librerie. Occorre tavola rotonda e decisione al vertice per modificare questo comportamento. AO20063 Su Win98 se scelgo una stampante Generica / solo testo come dimensione carattere mi riporta solo 0. AO20066 Ho provato a stampare una fattura utilizzando il vecchio modulo bmp, in visualizzazione la stampa è corretta ma se lancio la stampa su foglio A4 non mi viene stampata la parte grafica; utilizzando invece il nuovo sfondo bmp esce tutto corretto (questo chiaramente è un errore che va ad influire anche sui vecchi moduli personalizzati); sulla 16bit invece con lo stesso modulo e stesso bmp, stampa corretto. git-svn-id: svn://10.65.10.50/trunk@11288 c028cbd2-c16b-5b4b-a496-9718f37d4682
367 lines
12 KiB
C++
Executable File
367 lines
12 KiB
C++
Executable File
// ve6100.cpp: programma di contabilizzazione documenti
|
|
// Orgiastica visione...
|
|
// L'anatra del dubbio dalle labbra di Vermouth.
|
|
//******************************************************************************
|
|
// \\\\\\\\ e *
|
|
// b \\\\\\\\ b *
|
|
// \\\\\\\\ e r d l *
|
|
// \\\\\\\\ *
|
|
// \\\\\\\\ i V o e h *
|
|
// L \\\\\\\\ *
|
|
// \\\\\\\\ b d *
|
|
// o \\\\\\\\ m a *
|
|
// +++++++++++++++++++++++++ b t *
|
|
// ++++++++++++++++++++++++++--------------------------------------------------|
|
|
// ++++++++++++++++++++++++++--------------------------------------------------|
|
|
// ++++++++++++++++++++++++ |---------------------------------------|
|
|
// u //////// u |---------------------------------------|
|
|
// ' //////// a | /\ /\ |
|
|
// //////// i | r / \ r / \ |
|
|
// a //////// \|/ / \ / \ l |
|
|
// ////////-----------------*---\ a / t \ / a \ /|
|
|
// //////// /|\ \ / \ / \ / |
|
|
// d //////// n | \ / \ / \ / |
|
|
// //////// l d | \/ a \/ l \/ |
|
|
//-----------------------------------------------------------------------------|
|
|
//
|
|
// Scared uh?
|
|
|
|
#include <applicat.h>
|
|
#include <mask.h>
|
|
#include <progind.h>
|
|
#include <relation.h>
|
|
#include <sheet.h>
|
|
#include <tabutil.h>
|
|
#include <urldefid.h>
|
|
|
|
#include "velib.h"
|
|
#include "../cg/cgsaldac.h"
|
|
|
|
#include "ve6100a.h"
|
|
|
|
|
|
// TContabilizzazione_app
|
|
// Applicazione di contabilizzazione documenti
|
|
class TContabilizzazione_app : public TApplication
|
|
{
|
|
TString16 _cod_el; // codice elaborazione immesso
|
|
TDate _data_reg; // data di registrazione immessa
|
|
TDate _data_ini; // data di inizio intervallo
|
|
TDate _data_fine; // data di fine intervallo
|
|
bool _auto_data; // se TRUE prende in automatico la data di registrazione dalla data documento
|
|
TMask *_msk; // maschera di selezione dati
|
|
TArray_sheet *_num_sheet; // Array sheet selezionabile dei codici numerazione
|
|
TString_array _tipi_doc; // Array di stringhe contenente i tipi documenti da elaborare
|
|
|
|
protected: // TApplication
|
|
// Contabilizza i documenti
|
|
void contabilize();
|
|
// Le 4 seguenti non hanno bisogno di commenti
|
|
virtual bool menu(MENU_TAG mt);
|
|
virtual bool create();
|
|
virtual bool destroy();
|
|
virtual void on_config_change();
|
|
// Handler del codice elaborazione differita
|
|
static bool handle_cod_eld(TMask_field& f, KEY k);
|
|
// Handler dell'intervallo di date
|
|
static bool handle_data_range(TMask_field& f, KEY k);
|
|
// Handler della data di registrazione
|
|
static bool handle_data_reg(TMask_field& f, KEY k);
|
|
// Handler del pulsante di selezione codici numerazione
|
|
static bool handle_select(TMask_field& f, KEY k);
|
|
// Ritorna il TArray_sheet contenente le selezioni sui codici numerazione
|
|
// Costruisce lo sheet dei codici numerazione
|
|
void build_num_sheet();
|
|
TArray_sheet* get_num_sheet() const { return _num_sheet; }
|
|
// Coontrolla se lo stato ed il tipo del documento sono validi e rispettano la selezione
|
|
bool doc_tipo_stato_ok(const TRectype& doc);
|
|
|
|
public:
|
|
TContabilizzazione_app() {_msk = NULL; _num_sheet = NULL;}
|
|
virtual ~TContabilizzazione_app() { }
|
|
};
|
|
|
|
inline TContabilizzazione_app& app() { return (TContabilizzazione_app&) main_app(); }
|
|
|
|
bool TContabilizzazione_app::handle_data_range(TMask_field& f, KEY k)
|
|
{
|
|
if (k==K_ENTER && f.dirty())
|
|
{
|
|
TMask& m = f.mask();
|
|
if (m.get_bool(F_DATA_AUTO))
|
|
return TRUE; // Skip controls if data is automatic
|
|
TDate da(m.get_date(F_DATA_INI));
|
|
TDate a(m.get_date(F_DATA_FIN));
|
|
m.field(F_DATA_REG).set_dirty();
|
|
if ((a - da) > 15)
|
|
{
|
|
f.error_box(TR("L'intervallo tra le date non puo' eccedere i 15 giorni."));
|
|
return FALSE;
|
|
}
|
|
if (f.dlg() == F_DATA_FIN)
|
|
m.set(F_DATA_REG,f.get());
|
|
}
|
|
if (f.focusdirty())
|
|
{
|
|
TMask& m = f.mask();
|
|
if (!m.get_bool(F_DATA_AUTO) && f.dlg() == F_DATA_FIN)
|
|
m.set(F_DATA_REG,f.get());
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TContabilizzazione_app::handle_data_reg(TMask_field& f, KEY k)
|
|
{
|
|
if (k==K_ENTER && f.dirty())
|
|
{
|
|
TMask& m = f.mask();
|
|
|
|
TDate data_reg(f.get());
|
|
if (data_reg == botime) return TRUE;
|
|
TDate da(m.get_date(F_DATA_INI));
|
|
if ((data_reg - da) > 15)
|
|
{
|
|
f.error_box(TR("L'intervallo tra la data di registrazione e la data di inizio non puo' eccedere i 15 giorni."));
|
|
return FALSE;
|
|
}
|
|
if (data_reg < da)
|
|
{
|
|
f.error_box(TR("La data di registrazione non puo' essere minore della data di inizio."));
|
|
return FALSE;
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TContabilizzazione_app::handle_cod_eld(TMask_field& f, KEY k)
|
|
{
|
|
if (f.to_check(k) && k == K_TAB) // se e' cambiato ricostruisce anche lo sheet dei codici numerazione
|
|
{
|
|
app()._cod_el = f.get(); // aggiorna il codice elaborazione per la build_num_sheet()
|
|
f.mask().disable(DLG_OK);
|
|
app().build_num_sheet();
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
bool TContabilizzazione_app::handle_select(TMask_field& f, KEY k)
|
|
{
|
|
if (k == K_SPACE)
|
|
{
|
|
TMask& m = f.mask();
|
|
TArray_sheet* s = app().get_num_sheet();
|
|
if (s->run())
|
|
{
|
|
if (s->checked() != 0) // Hai selezionato qualcosa ?
|
|
m.enable(DLG_OK); // allora abilita il pulsante di conferma
|
|
else
|
|
m.disable(DLG_OK);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void TContabilizzazione_app::build_num_sheet()
|
|
{
|
|
_num_sheet->destroy();
|
|
_tipi_doc.destroy();
|
|
|
|
TTable num("%NUM");
|
|
TString s1,s2,s3;
|
|
|
|
TContabilizzazione* cont = new TContabilizzazione(_cod_el);
|
|
if (!cont->empty())
|
|
{
|
|
TToken_string t;
|
|
TString16 tipo;
|
|
for (int i=0;i<TElaborazione::_max_tipi_doc_elab;i++)
|
|
{
|
|
tipo = cont->tipo_iniziale(i);
|
|
if (tipo.not_empty())
|
|
{
|
|
t = tipo;
|
|
t.add(cont->stato_iniziale(i)); // Stato iniziale
|
|
_tipi_doc.add(t); // Aggiunge questo tipo documento alla lista
|
|
}
|
|
}
|
|
|
|
long pos=0l;
|
|
|
|
for (num.first();num.good();num.next(),pos++) // scorre tutte le numerazioni possibili
|
|
{
|
|
TToken_string t,z;
|
|
t.add(" ");
|
|
t.add(num.get("CODTAB"));
|
|
t.add(num.get("S0"));
|
|
_num_sheet->add(t);
|
|
s2 = num.get("S2"); // reperisce i tipi documento validi per questa numerazione
|
|
|
|
for (int x = 0; x <= s2.len(); x += 4)
|
|
z.add(s2.mid(x,4));
|
|
|
|
bool found = FALSE;
|
|
for (int i = _tipi_doc.last(); !found && i >= 0; i--)
|
|
found |= (s2.find(((TToken_string &)_tipi_doc[i]).get(0)) >= 0);
|
|
if (found)
|
|
_num_sheet->enable_row(pos);
|
|
else
|
|
_num_sheet->disable_row(pos);
|
|
}
|
|
}
|
|
delete cont;
|
|
}
|
|
|
|
bool TContabilizzazione_app::doc_tipo_stato_ok(const TRectype& doc)
|
|
// Verifica che il tipo documento corrente esista tra i tipi previsti dalla elaborazione
|
|
// differita selezionata
|
|
{
|
|
bool found = FALSE;
|
|
const TString16 tipo = doc.get(DOC_TIPODOC);
|
|
const char stato = doc.get_char(DOC_STATO);
|
|
const int items = _tipi_doc.items();
|
|
for (int i=0;i<items && !found;i++)
|
|
{
|
|
TToken_string& t = _tipi_doc.row(i);
|
|
const TString16 tipox(t.get(0));
|
|
const char statox = t.get(1)[0];
|
|
if (tipo == tipox && stato == statox)
|
|
found = TRUE;
|
|
}
|
|
return found;
|
|
}
|
|
|
|
void TContabilizzazione_app::on_config_change()
|
|
{
|
|
TPartita::carica_allineamento();
|
|
}
|
|
|
|
bool TContabilizzazione_app::create()
|
|
{
|
|
TApplication::create();
|
|
open_files(LF_TABCOM, LF_TAB, LF_CLIFO, LF_OCCAS, LF_INDSP, LF_CFVEN,
|
|
LF_DOC, LF_RIGHEDOC, LF_ANAMAG, LF_MOVMAG, LF_RMOVMAG, LF_PROVV, LF_MOV,
|
|
LF_PCON, LF_CONDV, LF_SVRIEP, LF_AGENTI, LF_PERCPROV, LF_ATTIV, LF_CAUSALI, 0);
|
|
_msk = new TMask("ve6100a");
|
|
_msk->set_handler(F_CODICE_ELAB,handle_cod_eld);
|
|
_msk->set_handler(F_DATA_INI,handle_data_range);
|
|
_msk->set_handler(F_DATA_FIN,handle_data_range);
|
|
//_msk->set_handler(F_DATA_REG,handle_data_reg);
|
|
_msk->set_handler(DLG_USER,handle_select);
|
|
_num_sheet = new TArray_sheet(-1,-1,-4,-4,"Codici numerazione",
|
|
"@1|Cod. numerazione|Descrizione@50");
|
|
dispatch_e_menu(BAR_ITEM(1));
|
|
return TRUE;
|
|
}
|
|
|
|
bool TContabilizzazione_app::destroy()
|
|
{
|
|
if (_msk) delete _msk;
|
|
if (_num_sheet) delete _num_sheet;
|
|
return TApplication::destroy();
|
|
}
|
|
|
|
bool TContabilizzazione_app::menu(MENU_TAG mt)
|
|
{
|
|
while (_msk->run() == K_ENTER)
|
|
{
|
|
_cod_el = _msk->get(F_CODICE_ELAB);
|
|
_data_ini = _msk->get_date(F_DATA_INI);
|
|
_data_fine = _msk->get_date(F_DATA_FIN);
|
|
_data_reg = _msk->get_date(F_DATA_REG);
|
|
_auto_data = _msk->get_bool(F_DATA_AUTO);
|
|
contabilize();
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
void TContabilizzazione_app::contabilize()
|
|
{
|
|
TRelation doc_rel(LF_DOC);
|
|
TRectype da(LF_DOC);
|
|
TRectype a(LF_DOC);
|
|
const long items = _num_sheet->items();
|
|
int year_from = _data_ini.year();
|
|
int year_to = _data_fine.year();
|
|
bool ok = TRUE;
|
|
TString16 codnum;
|
|
TString msg,filt_expr;
|
|
TToken_string nums;
|
|
TContabilizzazione cont(_cod_el);
|
|
// Compone la lista dei documenti da elaborare
|
|
|
|
cont.set_auto(_auto_data); // Setta il flag per il settaggio automatico della data di registrazione del movimento
|
|
|
|
for (long i=0L; i<items;i++) // Scorre per tutte le numerazioni dello sheet
|
|
{
|
|
if (_num_sheet->checked(i)) // Costruisce una espressione sul codice numerazione: "CODNUM="x0" || CODNUM="x1" || ..."
|
|
{
|
|
codnum = _num_sheet->row(i).get(1);
|
|
filt_expr << "(CODNUM=\"";
|
|
filt_expr << codnum << "\")||";
|
|
nums.add(codnum);
|
|
}
|
|
}
|
|
filt_expr.rtrim(2);
|
|
|
|
da.put(DOC_DATADOC,_data_ini);
|
|
da.put(DOC_PROVV,"D");
|
|
da.put(DOC_ANNO,year_from);
|
|
a.put(DOC_DATADOC,_data_fine);
|
|
a.put(DOC_PROVV,"D");
|
|
a.put(DOC_ANNO,year_to);
|
|
|
|
// Se ho una sola numerazione ottimizzo la setregion!
|
|
if (nums.items() == 1)
|
|
{
|
|
da.put(DOC_CODNUM, nums);
|
|
a.put(DOC_CODNUM, nums);
|
|
filt_expr.cut(0); // Il filtro diventa inutile
|
|
}
|
|
|
|
// Cursore complessivo con limiti di data (chiave 3). Viene sfruttata l'ottimizzazione
|
|
// sulla costruzione dei cursori nel caso i campi presenti nell'espressione siano campi
|
|
// chiave, nel nostro caso CODNUM soddisfa i requisiti.
|
|
TCursor doc_cur(&doc_rel,filt_expr,3,&da,&a);
|
|
const TRecnotype cur_items = doc_cur.items();
|
|
if (cur_items > 0)
|
|
{
|
|
TLista_documenti lista_in,lista_out;
|
|
|
|
doc_cur.freeze();
|
|
msg = "Selezione documenti dal ";
|
|
msg << _data_ini.string() << " al ";
|
|
msg << _data_fine.string();
|
|
TProgind p(cur_items,msg,FALSE,TRUE);
|
|
const TRectype& cur_rec = doc_cur.curr();
|
|
|
|
// Scorre tutti i documenti che rientrano nell'intervallo selezionato
|
|
for (doc_cur = 0; doc_cur.pos() < cur_items; ++doc_cur)
|
|
{
|
|
p.addstatus(1);
|
|
// controlla che il tipo documento e lo stato siano coerenti con la ELD selezionata
|
|
if (nums.get_pos(cur_rec.get("CODNUM")) >= 0 && doc_tipo_stato_ok(cur_rec))
|
|
{
|
|
TDocumento* doc = new TDocumento;
|
|
if (doc->read(doc_cur.curr()) == NOERR) // legge il documento
|
|
lista_in.add(doc); // Viene aggiunto alla lista dei documenti
|
|
else
|
|
delete doc;
|
|
}
|
|
}
|
|
cont.elabora(lista_in,lista_out,_data_reg);
|
|
if (cont.processed_docs() > 0L)
|
|
message_box(FR("Totale documenti contabilizzati: %ld"), cont.processed_docs());
|
|
}
|
|
else
|
|
warning_box(TR("Non vi sono documenti da contabilizzare per le numerazioni selezionate."));
|
|
|
|
xvt_statbar_set("");
|
|
}
|
|
|
|
int ve6100 (int argc, char **argv)
|
|
{
|
|
TContabilizzazione_app a;
|
|
a.run(argc,argv,"Contabilizzazione documenti");
|
|
return TRUE;
|
|
}
|