campo-sirio/ve/velib06a.cpp

3537 lines
99 KiB
C++
Executable File

#include <applicat.h>
#include <execp.h>
#include <defmask.h>
#include <modaut.h>
#include <progind.h>
#include <recset.h>
#include <sheet.h>
#include <tabutil.h>
#include <toolfld.h>
#include <urldefid.h>
#include <utility.h>
#include "sconti.h"
#include "veini.h"
#include "vepriv.h"
#include "verig.h"
#include "veuml1.h"
#include "veini.h"
#include "sconti.h"
#include "velib07.h"
#include "ve0100n.h"
#include "../cg/cg2103.h"
#include "../cg/cglib03.h"
#include "../db/dblib.h"
#include "../mg/mglib.h"
#include "../db/dblib.h"
#include "../mg/anamag.h"
#include "../mg/codcorr.h"
#include "../mg/deslin.h"
#include "../mg/umart.h"
#include "../cg/cfban.h"
#include "../ca/cfcms.h"
#include "../ca/calib01.h"
#include "../ca/commesse.h"
#define MAX_VIS_RATE 5
bool numdocrif_hndl( TMask_field& field, KEY key )
{
if (key == K_ENTER)
{
TDocumento_mask& m = (TDocumento_mask&)field.mask();
TString16 campo = DOC_NUMDOCRIF;
if (field.field() != NULL)
campo = field.field()->name();
TRectype filtrec(LF_DOC);
filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF));
filtrec.put(DOC_CODCF, m.get(F_CODCF));
filtrec.put(DOC_PROVV, m.get(F_PROVV));
filtrec.put(DOC_ANNO, m.get(F_ANNO));
TRelation rel(LF_DOC);
TString sortkey = "TIPOCF|CODCF|PROVV|ANNO|CODNUM|"; sortkey << campo;
TSorted_cursor cur(&rel, sortkey, "", 2, &filtrec, &filtrec);
TString16 f; f.format("CODNUM==\"%s\"", (const char*)m.get(F_CODNUM));
cur.setfilter(f);
filtrec.put(DOC_CODNUM, m.get(F_CODNUM));
filtrec.put(campo, field.get());
cur.curr() = filtrec;
cur.read(_isequal);
if (cur.file().status() == NOERR)
{
const long numdoc = m.get_long(F_NDOC);
if (numdoc != cur.curr().get_long(DOC_NDOC))
return yesno_box("Il numero di riferimento %s è già stato utilizzato\nsi desidera registrare ugualmente?",
(const char *)field.get());
}
}
return true;
}
bool totdoc_hndl( TMask_field& field, KEY key )
{
if (key == K_ENTER)
{
TDocumento_mask & m = (TDocumento_mask &) field.mask();
const real totdoc = m.doc().totale_doc();
const real totdoc_check(field.get());
if (m.doc().physical_rows() > 0 && totdoc != totdoc_check)
{
const TString16 tchk(totdoc_check.string());
return yesno_box("Il totale documento digitato (%s) non corrisponde\nal totale documento (%s) calcolato,\n devo registrare ugualmente",
(const char *) tchk, totdoc.string());
}
}
return true;
}
bool fido_hndl(TMask_field& field, KEY key)
{
if (key == K_ENTER && !field.empty())
{
const TDocumento_mask& m = (TDocumento_mask&)field.mask();
if (m.insert_mode() || m.get(F_STATO) == "1")
{
const real fido_bau(field.get());
const long codcf = m.get_long(F_CODCF);
const TDate datadoc = m.get_date(F_DATADOC);
const TDoc_key ignore_key = m.doc();
const real perc_toll = ini_get_string(CONFIG_DITTA, "ve", "FIDO_PERCTOLL");
//calcola l'esposizione PRIMA del documento corrente
const real esposizione = calcola_fido_cliente(codcf, datadoc, ignore_key);
//prende il valore del documento corrente
const real totdoc = m.doc().totale_doc();
//esposizione comprensiva del documento corrente
const real esposizione_totale = esposizione + totdoc;
const real fido_con_tolleranza = fido_bau * (CENTO + perc_toll) / CENTO;
if (esposizione_totale > fido_con_tolleranza)
return yesno_box(FR("Attenzione! Il cliente %ld risulta fuori fido.\nEsposizione corrente: %s\n"
"Tot. Doc. corrente: %s\nEsposizione totale: %s\nRegistrare ugualmente il documento?"),
codcf, esposizione.stringa(), totdoc.stringa(), esposizione_totale.stringa());
}
}
return true;
}
bool subappalto_hndl(TMask_field& field, KEY key)
{
if (key == K_SPACE)
{
TFilename wrd("CONTRATTOSUBAPPALTO.doc");
if (wrd.custom_path())
{
const TMask& m = field.mask();
TFilename txt = wrd.path();
txt.add("contratto.txt");
ofstream ftxt(txt);
ftxt << m.get(F_CODNUM) << ';' << m.get(F_ANNO) << ';' << m.get(F_PROVV) << ';' << m.get(F_NDOC) << endl;
ftxt.close();
xvt_sys_goto_url(wrd, "open");
}
else
cantread_box(wrd);
}
return true;
}
bool reportba8_hndl(TMask_field& field, KEY key)
{
static bool already_printing = false;
if (already_printing)
return false;
if (key == K_SPACE)
{
const TDocumento_mask& sm = (TDocumento_mask&)field.mask();
const TString& tipo_cod = sm.get(F_TIPODOC);
const TTipo_documento& td = cached_tipodoc(tipo_cod);
TFilename report;
if (!td.main_print_profile(report, 0))
return error_box("Impossibile determinare il profilo di stampa principale");
already_printing = true;
TFilename ini; ini.tempdir(); ini.add(report.name_only()); ini.ext("ini");
if (ini.full())
{
const TDocumento& doc = sm.doc();
TConfig cfg(ini, "Transaction");
cfg.set("Action", "Preview" /*printer().printtype() == screenvis ? "Preview" : "Print"*/);
cfg.set_paragraph("Vars");
cfg.remove_all();
FOR_EACH_MASK_FIELD(sm, i, f) if (f->is_loadable() && !f->empty())
{
const TFieldref* field = f->field();
if (field != NULL && field->from() == 0)
{
const TString& name = field->name();
cfg.set(name, doc.get(name));
}
}
FOR_EACH_PHYSICAL_RDOC(doc, r, rdoc)
{
if (rdoc->get_long(RDOC_DANDOC) > 0)
{
cfg.set(RDOC_DAPROVV, rdoc->get(RDOC_DAPROVV));
cfg.set(RDOC_DAANNO, rdoc->get(RDOC_DAANNO));
cfg.set(RDOC_DACODNUM, rdoc->get(RDOC_DACODNUM));
cfg.set(RDOC_DANDOC, rdoc->get(RDOC_DANDOC));
break;
}
}
}
TString cmd;
cmd << "ba8 -4 " << report;
if (ini.exist())
cmd << " -i" << ini;
TExternal_app a(cmd);
a.run();
already_printing = false;
}
return true;
}
bool ora_hndl( TMask_field& field, KEY key )
{
if (field.to_check(key,true))
{
if (field.automagic() && field.empty())
{
const struct tm* t = xvt_time_now();
TString4 ora; ora.format("%02d%02d", t->tm_hour, t->tm_min);
field.set(ora);
TMask& m = field.mask();
const int pos_data = m.id2pos(field.dlg()) - 1;
TMask_field& dt = m.fld(pos_data);
if (dt.automagic() && dt.is_kind_of(CLASS_DATE_FIELD))
{
const TDate oggi(TODAY);
dt.set(oggi.string());
}
}
else
{
const TString& ora = field.get();
if (ora.full())
{
if (!isdigit(ora[0]) || !isdigit(ora[1]) || !isdigit(ora[2]) ||
!isdigit(ora[3]) || atoi(ora.left(2)) > 23 || atoi(ora.mid(2)) > 59)
return field.error_box(TR("Ora errata"));
}
else
{
if (field.required())
return field.error_box(TR("Ora obbligatoria"));
}
}
}
return true;
}
bool dummy_hndl(TMask_field& field, KEY key)
{
warning_box(FR("Al campo %d è arrivata una KEY %d"), field.dlg( ), key );
return true;
}
// Handler per il calcolo delle date di pagamento
bool condpag_hndl( TMask_field& field, KEY key )
{
TDocumento_mask& m = (TDocumento_mask &) field.mask( );
if ( field.to_check(key) || (key == K_TAB && !m.is_running()))
{
bool is_rid = false;
const TString& condpag = m.get(F_CODPAG);
if (condpag.full())
{
TDocumento& doc = m.doc();
// Aggiorna dati necessari per determinare il pagamento
doc.put(DOC_CODPAG, condpag);
doc.put(DOC_DATADOC, m.get(F_DATADOC));
doc.put(DOC_DATAINSC, m.get(F_DATAINSC));
doc.put(DOC_TIPOCF, m.get(F_TIPOCF));
doc.put(DOC_CODCF, m.get(F_CODCF));
TPagamento& pag = doc.pagamento();
pag.set_total(CENTO, real(10), real(10));
pag.set_rate_auto();
const int numrate = pag.n_rate( );
for(int i = 0; i < MAX_VIS_RATE; i++)
{
if (i < numrate)
{
m.show(F_DATASCAD1+i);
m.set(F_DATASCAD1+i, pag.data_rata(i));
}
else
m.hide(F_DATASCAD1+i);
}
is_rid = numrate > 0 && pag.tipo_rata(0) == _rid;
}
TMask_field* mandato = m.find_by_id(F_MANDATO);
if (mandato != NULL)
{
if (is_rid && main_app().has_module(EFAUT) && m.get_long(F_CODCF))
{
mandato->enable();
mandato->check_type(CHECK_REQUIRED);
TString query; query << "USE &EFMAN SELECT I0=" << m.get_long(F_CODCF);
TISAM_recordset man(query);
if (man.items() == 1)
m.set(F_MANDATO, man.get("CODTAB").as_string(), 0x3);
}
else
{
mandato->reset();
mandato->disable();
mandato->check_type(CHECK_NORMAL);
}
}
}
return true;
}
bool mandato_hndl(TMask_field& f, KEY key )
{
TMask& m = f.mask();
if (f.to_check(key) && !f.empty() && m.is_running())
{
const TRectype& man = cache().get("&EFMAN", f.get());
const TString& iban = man.get("S1");
if (iban.full())
{
TMask_field* iban1 = m.find_by_id(F_IBAN);
if (iban1)
{
iban1->set(iban);
const TString& bank = man.get("S4");
m.set(F_CODABIA, bank.left(5));
m.set(F_CODCABA, bank.mid(5));
m.set(F_CODABIA1, bank.left(5));
m.set(F_CODCABA1, bank.mid(5));
TEdit_field& stato = m.efield(F_IBAN_STATO);
if (key == K_TAB)
stato.set_focusdirty(false);
return stato.validate(key);
}
}
}
return true;
}
bool note_hndl( TMask_field& f, KEY key )
{
TDocumento_mask& m = (TDocumento_mask &) f.mask();
if (key == K_TAB && (f.focusdirty() || !m.is_running()))
{
const TRectype& note = cache().get("%NOT", f.get());
if (!note.empty())
{
if (m.is_running() || m.field(F_NOTECLI).empty()) // Preserva descrizione presente in caricamento
{
if (!note.get_bool("B1"))
{
// gestione del campo con descrizione estesa
TString stringone;
for (int i = 0; i < 6; i++)
{
const char fieldname[3] = { 'S', i+'0', '\0' };
stringone << note.get(fieldname);
}
stringone.replace(char(0xB6), '\n');
m.set(F_NOTECLI, stringone);
}
else
message_box(FR("Attenzione : %s"), (const char*)note.get("S0"));
}
if (m.doc().modificabile() && m.field(DLG_SAVEREC).enabled())
{
const bool reg_disabled = note.get_bool("B0");
if (reg_disabled)
{
message_box(FR("Registrazione disabilitata : %s"), (const char*)note.get("S0"));
m.disable(DLG_SAVEREC);
}
}
}
}
return true;
}
// Handler per il calcolo delle date di pagamento
bool data_hndl( TMask_field& field, KEY key )
{
TDocumento_mask& m = (TDocumento_mask &) field.mask();
if (field.to_check(key))
{
if (m.id2pos(F_DATAINSC) > 0)
{
TEdit_field & e = m.efield(F_DATAINSC);
e.set_dirty();
e.on_hit();
}
if (m.id2pos(F_DATACAMBIO1) > 0 && !m.get(F_CODVAL).empty())
m.set(F_DATACAMBIO1, field.get(), true);
}
// Abilita IVA per cassa su modifica o inizializzazione DATADOC
TMask_field* ixc = m.find_by_id(F_IVAXCASSA);
if (key == K_TAB && ixc)
{
TDate d = field.get();
if (!d.ok()) d = TODAY;
ixc->enable(gestione_IVAxCassa(d));
const bool gld = ini_get_bool(CONFIG_DITTA, "cg", "GesLiqDiff");
m.enable(F_LIQDIFF, gld);
}
if (key == K_ENTER || field.to_check(key))
{
const TDate datadoc(m.get(F_DATADOC));
if (!datadoc.ok())
return field.error_box("La data documento deve essere comunque indicata.");
if (m.id2pos(F_DATACAMBIO1) >= 0 && !m.get(F_CODVAL).empty())
m.set(F_DATACAMBIO1, field.get(), TRUE);
}
if (key == K_ENTER || field.to_check(key))
{
const TDate datadoc(m.get(F_DATADOC));
const int annodoc = m.get_int(F_ANNO);
if (datadoc.year() != annodoc)
{
if (datadoc.ok())
return field.error_box(TR("La data documento deve appartenere all'anno %d"), annodoc);
else
return field.error_box(TR("La data documento deve essere comunque indicata"));
}
const TCodice_numerazione codnum(m.get(F_CODNUM));
if (codnum.test_eser())
{
if (esercizi().date2esc(datadoc) <= 0)
return field.error_box("La data documento non appartiene ad un esercizio valido.");
if (main_app().has_module(CGAUT))
{
const TTipo_documento& td = m.doc().tipo();
TString4 codcaus = td.causale();
if (codcaus.empty())
{
const TRectype& clifo = m.doc().clifor().vendite();
codcaus = clifo.get("CODCAUS");
}
if (codcaus.not_empty())
{
const int year = datadoc.year();
TCausale caus;
if (!caus.read(codcaus, year))
return error_box(TR("Causale assente!")); // L'errore viene segnalato nella read
}
}
}
if (codnum.dont_test_datadoc())
return true; // Non devo fare altri test
TLocalisamfile doc(LF_DOC);
doc.curr() = m.doc().head();
bool same_key = false;
doc.read(_isgteq);
if (doc.eof() || doc.prev() == NOERR)
{
const TDate dataprev = doc.get_date(DOC_DATADOC);
same_key = doc.curr().same_key(m.doc().head(), 1, 1);
if (same_key && datadoc < dataprev)
return field.error_box("Data documento inferiore alla data del documento precedente");
}
doc.curr() = m.doc().head();
doc.read(_isgreat);
same_key = doc.curr().same_key(m.doc().head(), 1, 1);
if (doc.good() && same_key && datadoc > doc.get_date(DOC_DATADOC))
return field.error_box("Data documento superiore alla data del documento successivo");
}
return true;
}
// handler di campi delle maschere di riga
void TDocumento_mask::user_set_row_handler(TMask& rm, short field, int index)
{
switch (index)
{
case 1: rm.set_handler( field, pricerange_handler ); break;
case 2: rm.set_handler( field, dummy_hndl ); break;
case 3:
if (field == FR_CODART)
rm.set_handler( field, search_price_handler );
break;
case 4:
if (field == FR_CODART)
rm.set_handler( field, find_price_handler );
break;
case 5:
if (field == FR_CODART)
rm.set_handler( field, link_row_handler );
break;
case 6:
if (field == FR_CODART)
rm.set_handler( field, evasion_check_handler );
break;
case 7:
if (field == FR_CODART)
rm.set_handler(field, distinta_link_handler);
break;
case 8:
if (field >= FR_LIV1 && field <= FR_LIV4)
rm.set_handler(field, gen_livelli_handler);
break;
default:
break;
}
}
HIDDEN TString4 curr_um;
HIDDEN real curr_fc = UNO;
bool iva_handler( TMask_field& f, KEY key )
{
TDocumento_mask & mask = (TDocumento_mask &) f.mask().get_sheet()->mask();
if (key == 0 || (key == K_ENTER && f.empty()))
{
const TString& codiva = mask.condv().clifo().vendite().get(CFV_ASSFIS);
if (codiva.full())
f.set(codiva);
f.check();
}
if (key == 0 || (key == K_ENTER && f.empty()))
{
const TString& codiva = mask.doc().codesiva();
if (codiva.full())
f.set(codiva);
f.check();
}
if (key == K_ENTER && /*f.focusdirty() &&*/ f.empty())
{
TMask & row_mask = f.mask();
const int r = row_mask.get_sheet()->selected() + 1;
const TRiga_documento& riga = mask.doc()[r];
const int pos_ai = row_mask.id2pos(FR_ADDIVA);
bool addiva = false;
if (pos_ai >= 0)
addiva = row_mask.fld(pos_ai).get() == "X"; // Controlla le righe Omaggio solo se è settato l'addebito IVA
const bool check = riga.is_merce() || riga.is_spese() || riga.is_prestazione() ||
(riga.is_omaggio() && addiva);
if (check)
{
const int pos_p = row_mask.id2pos(FR_PREZZO);
const int pos_q = row_mask.id2pos(FR_QTA);
const bool pe = pos_p >= 0 && row_mask.fld(pos_p).enabled();
const bool qe = pos_q >= 0 && row_mask.fld(pos_q).enabled();
const bool pf = pe && row_mask.fld(pos_p).get().not_empty();
const bool qf = qe && row_mask.fld(pos_q).get().not_empty();
const bool required = pf && !(qe && !qf);
if (required)
return f.error_box(TR("Il codice IVA è obbligatorio."));
}
}
return true;
}
bool dcons_handler( TMask_field& f, KEY key )
{
if (key == K_F8)
{
TMask& row_mask = f.mask();
TSheet_field& s = *row_mask.get_sheet();
TDocumento_mask & mask = (TDocumento_mask &) s.mask();
const int r0 = f.mask().get_sheet()->selected() + 1;
int r = r0 + 1;
TDocumento & doc = mask.doc();
bool multiple_rows = (r <= doc.physical_rows());
if (r > 1)
{
if (multiple_rows)
{
const TString codart = doc[r].get(RDOC_CODART);
multiple_rows = codart == doc[r0].get(RDOC_CODART);
}
if (multiple_rows)
{
const TRiga_documento& prev = doc[r - 1];
TDate first_date = prev.get_date(RDOC_DATACONS);
TDate second_date = doc[r].get_date(RDOC_DATACONS);
if (!second_date.ok())
second_date = mask.get_date(F_DATACONS);
if (second_date.ok())
{
if (!first_date.ok())
first_date = mask.get_date(F_DATACONS);
if (first_date.ok())
{
if (second_date.is_end_month() && first_date.is_end_month())
{
int year = second_date.year();
int month = second_date.month();
const int months = ( year * 12 + month) - (first_date.year() * 12 + first_date.month());
const TString80 cod = doc[r].get(RDOC_CODART);
if (months > 0)
{
for (r++ ; r <= doc.physical_rows() && cod == doc[r].get(RDOC_CODART); r++)
{
TRiga_documento & riga = doc[r];
TToken_string & tr = s.row(r - 1);
month += months;
if (month > 12)
{
year++;
month -= 12;
}
TDate d(1, month, year);
d.set_end_month();
riga.put(RDOC_DATACONS, d);
tr.add(riga.get(RDOC_DATACONS), s.cid2index(FR_DATACONS));
}
s.force_update();
}
}
else
if (second_date.day() == first_date.day())
{
const int months = ( second_date.year() * 12 + second_date.month()) - (first_date.year() * 12 + first_date.month());
if (months > 0)
{
const TString80 cod = doc[r].get(RDOC_CODART);
for (r++ ; r <= doc.physical_rows() && cod == doc[r].get(RDOC_CODART); r++)
{
TRiga_documento & riga = doc[r];
TToken_string & tr = s.row(r - 1);
second_date.addmonth(months);
riga.put(RDOC_DATACONS, second_date);
tr.add(riga.get(RDOC_DATACONS), s.cid2index(FR_DATACONS));
}
s.force_update();
}
}
else
{
const int days = second_date - first_date;
if (days > 0)
{
const TString80 cod = doc[r].get(RDOC_CODART);
for (r++ ; r <= doc.physical_rows() && cod == doc[r].get(RDOC_CODART); r++)
{
TRiga_documento & riga = doc[r];
TToken_string & tr = s.row(r - 1);
second_date += days;
riga.put(RDOC_DATACONS, second_date);
tr.add(riga.get(RDOC_DATACONS), s.cid2index(FR_DATACONS));
}
s.force_update();
}
}
}
}
}
else
{
TRiga_documento & riga = doc.insert_row(r, doc[r - 1].tipo().codice());
TDocumento::copy_data(riga, doc[r - 1]);
s.insert(r - 1);
s.post_select(r - 1);
TToken_string & tr = s.row(r - 1);
riga.zero(RDOC_QTA);
riga.zero(RDOC_DATACONS);
riga.autoload(s);
// tr.add("", s.cid2index(FR_QTA));
// tr.add("", s.cid2index(FR_DATACONS));
s.check_row(r - 1);
s.force_update();
}
}
}
return true;
}
bool tipo_riga_handler(TMask_field& f, KEY key)
{
if (key == K_SPACE && f.focusdirty())
{
TMask & row_mask = f.mask();
TVariable_sheet_field * sf = (TVariable_sheet_field *) row_mask.get_sheet();
if (sf != NULL)
{
TDocumento_mask & docmask = (TDocumento_mask&)sf->mask();
if (docmask.is_running())
{
const int curr_row = sf->selected();
TToken_string & row = sf->row(curr_row);
const TString4 old_tipo_riga = docmask.doc()[curr_row + 1].get(RDOC_TIPORIGA);
const TString4 tipo_riga = f.get();
if (old_tipo_riga != tipo_riga)
{
if (!row_mask.is_running())
{
docmask.doc()[curr_row + 1].set_tipo(tipo_riga);
sf->post_insert(curr_row);
sf->check_row(curr_row);
const TTipo_riga_documento t(tipo_riga);
t.set_defaults(*sf, curr_row + 1);
sf->force_update(curr_row);
}
else
{
f.set(old_tipo_riga);
return f.error_box(TR("Impossibile cambiare il tipo nella maschera di riga"));
}
}
}
}
}
return true;
}
bool codmag_handler( TMask_field& f, KEY key )
{
// if (f.to_check(key, true))
if (key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask();
TSheet_field& sf = *row_mask.get_sheet();
TDocumento_mask& docmask = (TDocumento_mask&)sf.mask();
if (sf.column_enabled(sf.cid2index(FR_CODDEP)))
{
const int pos = row_mask.id2pos(FR_CODDEP);
const TString & val = f.get();
if (pos >= 0 && val.not_empty())
{
const TRectype& mag = cache().get("MAG", val);
const bool active = mag.get_bool("B0");
row_mask.fld(pos).enable(active);
if (!active)
row_mask.fld(pos).reset();
}
}
if (f.get().empty() && docmask.doc().tipo().mov_mag())
return f.error_box("Indicare il magazzino.");
docmask.update_giacenza();
}
return true;
}
bool codmag_coll_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask();
TSheet_field& sf = *row_mask.get_sheet();
if (sf.column_enabled( ((TSheet_field &)f).cid2index(FR_CODDEPC)))
{
const int pos = row_mask.id2pos(FR_CODDEPC);
const TString & val = f.get();
if (pos >= 0 && val.not_empty())
{
const TRectype& mag = cache().get("MAG", val);
const bool active = mag.get_bool("B0");
row_mask.fld(pos).enable(active);
if (!active)
row_mask.fld(pos).reset();
}
}
}
return true;
}
void upd_colli_peso_tara(TMask& m, const TString & codart)
{
// const real qta = m.get_real(FR_QTA) * curr_fc; // curr_fc puo' non essere inizializzata e vale -1
// Usando il metodo apposito di TArticolo non si sbaglia micca mai.
// Sarebbe bene sparare (come dice Luca) a curr_fc ovunque copaia
TArticolo& articolo = cached_article(codart);
const real qta = articolo.convert_to_um(m.get_real(FR_QTA), NULL, m.get(FR_UMQTA));
const real ppcollo = articolo.get_real(ANAMAG_PPCOLLO);
real ncolli = ppcollo.is_zero() ? UNO : qta / ppcollo;
ncolli.ceil(0);
int pos = m.id2pos(FR_NCOLLI);
if (pos >= 0)
if (ppcollo != ZERO)
m.fld(pos).set(ncolli.string());
else
m.fld(pos).reset();
pos = m.id2pos(FR_TARA);
if (pos >= 0)
{
const real tara = ncolli * articolo.get_real(ANAMAG_TARA);
m.fld(pos).set(tara.string());
}
pos = m.id2pos(FR_PNETTO);
if (pos >= 0)
{
const real peso = qta * articolo.get_real(ANAMAG_PESO);
m.fld(pos).set(peso.string());
}
}
bool pricerange_handler(TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask& mask = (TDocumento_mask &)sh.mask();
if (mask.doc().tipo().controllo_prezzi())
{
const int current_doc_row = sh.selected() + 1;
TRiga_documento & riga = mask.doc()[current_doc_row];
const real old_price = riga.get_real(RDOC_PREZZO);
const real new_price = row_mask.get_real(FR_PREZZO);
if (!old_price.is_zero())
{
const TTipo_riga_documento& tipo_riga = riga.tipo();
const int incr = tipo_riga.incr_perc_prezzo();
const int decr = tipo_riga.decr_perc_prezzo();
if (incr == 0 && decr == 0)
{
if (old_price != new_price && !yesno_box("Il prezzo è variato, confermare"))
return false;
}
else
{
real inf = old_price * (UNO - (decr/CENTO));
if (inf > new_price && !yesno_box("Il prezzo è diminuito di più del %d%%, confermare", decr))
return false;
real sup = old_price * (UNO + (incr/CENTO));
if (sup < new_price && !yesno_box("Il prezzo è aumentato di più del %d%%, confermare", incr))
return false;
}
}
riga.put(RDOC_PREZZO, new_price);
}
}
return true;
}
static bool __in_handler = false;
static int sort_sheet(const TObject** a, const TObject** b)
{
TToken_string * t1 = (TToken_string *) *a;
TToken_string * t2 = (TToken_string *) *b;
const char * a1 = t1->get(2);
const char * a2 = t2->get(2);
int cmp = strcmp(a1, a2);
if (cmp == 0)
{
TDate d1(t1->get(1));
TDate d2(t2->get(1));
cmp = d2 - d1;
if (cmp == 0)
return t2->get_int(8) - t1->get_int(8);
}
return cmp;
}
// Classe indispensabile alla Sig.ra Firpo
class TPrice_sheet : public TArray_sheet
{
TEdit_field& _fld;
protected:
virtual bool get_ini_paragraph(const TEdit_field& f, TString& name) const;
virtual long handler(WINDOW win, EVENT* ep);
TEdit_field& field() { return _fld; }
public:
TPrice_sheet(TEdit_field& f);
};
long TPrice_sheet::handler(WINDOW win, EVENT* ep)
{
if (ep->type == E_MOUSE_DOWN)
{
switch (ep->v.mouse.button )
{
case 1:
{
MENU_ITEM* menu = xvt_res_get_menu(BROWSE_BAR);
if (menu != NULL && menu->child != NULL)
{
dictionary_translate_menu(menu);
const PNT& p = ep->v.mouse.where;
RCT cr; xvt_vobj_get_client_rect(win, &cr);
XVT_POPUP_ALIGNMENT pa = XVT_POPUP_CENTER;
if (p.h < cr.right / 3)
pa = XVT_POPUP_LEFT_ALIGN;
else
if (p.h > 2 * cr.right / 3)
pa = XVT_POPUP_RIGHT_ALIGN;
xvt_menu_popup(menu->child, win, p, pa, NULL);
xvt_res_free_menu_tree(menu);
}
return 0;
}
break;
default:
break;
}
}
else
if (ep->type == E_COMMAND)
{
switch (ep->v.cmd.tag)
{
case BROWSE_BAR + 1:
save_columns_order(field());
return 0;
case BROWSE_BAR + 2:
set_columns_order(NULL);
return 0;
case BROWSE_BAR + 3:
fld(0).on_key(K_F11);
return 0;
default:
break;
}
}
return TArray_sheet::handler(win, ep);
}
bool TPrice_sheet::get_ini_paragraph(const TEdit_field& field, TString& parag) const
{
const bool ok = TSheet::get_ini_paragraph(field, parag);
if (ok)
parag << "_F80";
return ok;
}
TPrice_sheet::TPrice_sheet(TEdit_field& f)
: TArray_sheet(0, 3, -1, 16, TR("Ricerca Prezzi"),
HR("Num.|Data@10|Codice articolo@20|Descrizione@40|Quantità@15P|Prezzo@18P|Sconto@10|Numerazione@18|Tipo Documento@18"), 0, 1),
_fld(f)
{
load_columns_order(_fld);
}
static void search_price(TEdit_field& f, KEY key )
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask& mask = (TDocumento_mask &)sh.mask();
TPrice_sheet sheet(f);
TString_array & el = sheet.rows_array();
TRelation rel(LF_DOC);
TRectype from(rel.curr());
TRectype to(rel.curr());
TDate datadoc = mask.get_date(F_DATADOC);
const long codcf = mask.get_long(F_CODCF);
const long numdoc = mask.get_long(F_NDOC);
const int last_anno = mask.get_int(F_ANNO);
const int current_doc_row = sh.selected() + 1;
const int first_anno = last_anno - ((TTipo_riga_documento&)mask.doc()[current_doc_row].tipo()).search_years();
TToken_string nums(((TTipo_riga_documento&)mask.doc()[current_doc_row].tipo()).search_nums());
const TString& tipocf = mask.get(F_TIPOCF);
from.put(DOC_TIPOCF, tipocf);
to.put(DOC_TIPOCF, tipocf);
from.put(DOC_CODCF, codcf);
to.put(DOC_CODCF, codcf);
from.put(DOC_PROVV, "D");
to.put(DOC_PROVV, "D");
from.put(DOC_ANNO, first_anno);
to.put(DOC_ANNO, last_anno);
to.put(DOC_DATADOC, datadoc);
if (nums.empty())
nums = mask.get(F_CODNUM);
TString4 first_num(nums.get(0));
TString4 last_num(first_num);
TString filter;
filter << "((CODNUM==\"" << first_num << "\")";
for (const char * s = nums.get(); s && *s; s = nums.get())
{
if (first_num > s)
first_num = s;
if (last_num < s)
last_num = s;
filter << "||(CODNUM==\"" << s << "\")";
}
filter << ")";
TCursor cur(&rel, filter, 2, &from, &to);
const int items = cur.items();
cur.freeze();
TRecord_array r(LF_RIGHEDOC, RDOC_NRIGA);
TRectype rec(LF_RIGHEDOC);
for(cur = 0L; cur.pos() < items; ++cur)
{
const TDate data(cur.curr().get(DOC_DATADOC));
const TString80 num(cache().get("%NUM", cur.curr().get(DOC_CODNUM), "S0"));
const TString80 tipo(cache().get("%TIP", cur.curr().get(DOC_TIPODOC), "S0"));
rec.zero();
rec.put(RDOC_PROVV, cur.curr().get(DOC_PROVV));
rec.put(RDOC_ANNO, cur.curr().get(DOC_ANNO));
rec.put(RDOC_CODNUM, cur.curr().get(DOC_CODNUM));
rec.put(RDOC_NDOC, cur.curr().get(DOC_NDOC));
r.read(rec);
const int last_row = r.last_row();
for (int i = r.first_row(); i <= last_row; i = r.succ_row(i))
{
const TRectype& rdoc = r.row(i);
const TString& codart = rdoc.get(RDOC_CODART);
if (codart.full())
{
TToken_string row;
row.add(rdoc.get(RDOC_NDOC));
row.add(data);
row.add(codart);
row.add(rdoc.get(RDOC_DESCR));
row.add(rdoc.get(RDOC_QTA));
row.add(rdoc.get(RDOC_PREZZO));
row.add(rdoc.get(RDOC_SCONTO));
row.add(num);
row.add(tipo);
row.add(rdoc.get(RDOC_NRIGA));
el.add(row);
}
}
}
el.TArray::sort(sort_sheet);
const int max_rows = ((TTipo_riga_documento&)mask.doc()[current_doc_row].tipo()).max_rows_art();
if (max_rows > 0)
{
const int items = el.items();
TString80 last_cod;
long last_doc = 0L;
real last_price(ZERO);
int count = 0;
for (int i = 0 ; i < items; i++)
{
const TString & codart = el.row(i).get(2);
long ndoc = el.row(i).get_long(0);
real price(el.row(i).get(5));
if (codart != last_cod)
{
last_cod = codart;
last_doc = ndoc;
last_price = price;
count = 1;
}
else
{
if (ndoc == last_doc && price == last_price)
{
el.destroy(i);
}
else
{
last_doc = ndoc;
last_price = price;
count++;
if (count > max_rows)
el.destroy(i);
}
}
}
el.pack();
}
if (sheet.run() == K_ENTER)
{
__in_handler = true;
const TToken_string& selected = sheet.row(-1);
real prezzo; selected.get(5, prezzo);
row_mask.set(FR_PREZZO, prezzo);
TString80 str; selected.get(2, str);
row_mask.set(FR_CODART, str, 3);
row_mask.field(FR_CODART).set_dirty(false);
row_mask.set(FR_PREZZO, prezzo);
selected.get(6, str);
row_mask.set(FR_SCONTO, str);
__in_handler = false;
}
}
class TPrice_article_sheet : public TBrowse_sheet
{
protected:
virtual bool get_ini_paragraph(const TEdit_field& field, TString& parag) const;
public:
TPrice_article_sheet(TCursor& cur, TEdit_field& f);
};
bool TPrice_article_sheet::get_ini_paragraph(const TEdit_field& field, TString& parag) const
{
const bool ok = TSheet::get_ini_paragraph(field, parag);
if (ok)
parag << "_F81";
return ok;
}
TPrice_article_sheet::TPrice_article_sheet(TCursor& cur, TEdit_field& f)
: TBrowse_sheet(&cur, HR("NDOC|33->DATADOC|PREZZO|QTA|SCONTO|-201->S0|-202->S0"),
TR("Ricerca Prezzi"),
HR("Num.|Data@10|Prezzo@18P|Quantità@15P|Sconto@10|Numerazione@18|Tipo Documento@18"),
0, f, TToken_string())
{ }
static void search_price_article(TEdit_field& f, KEY key )
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask& mask = (TDocumento_mask &)sh.mask();
const int current_doc_row = sh.selected() + 1;
const TString80 codart(row_mask.get(FR_CODART));
TDate datadoc = mask.get_date(F_DATADOC);
const char tipocf = mask.get(F_TIPOCF)[0];
const long codcf = mask.get_long(F_CODCF);
TToken_string nums(((TTipo_riga_documento&)mask.doc()[current_doc_row].tipo()).search_nums());
if (nums.blank())
nums = mask.get(F_CODNUM);
TString4 first_num(nums.get(0));
TString4 last_num(first_num);
TString filter;
filter << "(33->TIPOCF==\"" << tipocf << "\")&&(33->CODCF==\"" << codcf << "\")&&(ANSI(33->DATADOC)<=\"" << datadoc.string(ANSI) << "\")" << "&&((CODNUM==\"" << first_num << "\")";
FOR_EACH_TOKEN(nums, s)
{
if (first_num > s)
first_num = s;
if (last_num < s)
last_num = s;
filter << "||(CODNUM==\"" << s << "\")";
}
filter << ")";
TRelation rel(LF_RIGHEDOC);
TRectype from(rel.curr());
TRectype to(rel.curr());
rel.add(LF_DOC, "PROVV==PROVV|ANNO=ANNO|CODNUM==CODNUM|NDOC==NDOC");
const int last_anno = mask.get_int(F_ANNO);
const int first_anno = last_anno - ((TTipo_riga_documento&)mask.doc()[current_doc_row].tipo()).search_years();
TString80 livello;
for (int l = 0; l<4 ; l++)
mask.doc().livelli().pack_grpcode(livello, row_mask.get(FR_LIV1 + l),l + 1);
from.put(RDOC_CODART, codart);
from.put(RDOC_LIVELLO, livello); // Non fa parte della chive 5
from.put(RDOC_CODNUM, first_num);
from.put(RDOC_ANNO, first_anno);
from.put(RDOC_PROVV, 'D');
to.put(RDOC_CODART, codart);
to.put(RDOC_LIVELLO, livello); // Non fa parte della chive 5
to.put(RDOC_CODNUM, last_num);
to.put(RDOC_ANNO, last_anno);
to.put(RDOC_PROVV, 'D');
TSorted_cursor cur(&rel, "33->DATADOC-|CODNUM|NDOC-", filter, 5, &from, &to);
cur.items();
cur.freeze();
cur.relation()->add("%NUM", "CODTAB==CODNUM", 1, 0, 201);
cur.relation()->add("%TIP", "CODTAB==TIPODOC", 1, LF_DOC, 202);
TPrice_article_sheet sheet(cur, f);
sheet.add_string (FR_DESCR, 0, "", 38, 0, 50, "D", 30);
sheet.set(FR_CODART, codart);
sheet.set(FR_DESCR, cache().get(LF_ANAMAG, codart, "DESCR"));
if (sheet.run() == K_ENTER)
{
__in_handler = true;
row_mask.set(FR_CODART, codart, 0x3);
row_mask.field(FR_CODART).set_dirty(false);
__in_handler = false;
TToken_string& row = sheet.row(-1);
const TString& prezzo = row.get(2);
row_mask.set(FR_PREZZO, prezzo);
const TString& sconto = row.get(4);
row_mask.set(FR_SCONTO, sconto);
}
}
bool search_price_handler(TMask_field& f, KEY key )
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
if (key == K_F8 && !sh.sheet_mask().is_running())
{
TEdit_field& ef = (TEdit_field&)f;
const TString& codart = row_mask.get(FR_CODART);
if (codart.blank())
search_price(ef, key);
else
search_price_article(ef,key);
return true;
}
else
if ((key == K_TAB && f.focusdirty()))
{
TDocumento_mask& mask = (TDocumento_mask &)sh.mask();
const TCodice_articolo codart = row_mask.get(FR_CODART);
if (!__in_handler && codart.full() && row_mask.get(FR_PREZZO).empty())
{
TDate datadoc = mask.get_date(F_DATADOC);
const char tipocf = mask.get(F_TIPOCF)[0];
const long codcf = mask.get_long(F_CODCF);
const int current_doc_row = sh.selected() + 1;
TToken_string nums(((TTipo_riga_documento&)mask.doc()[current_doc_row].tipo()).search_nums());
if (nums.empty())
nums = mask.get(F_CODNUM);
TString4 first_num(nums.get(0));
TString4 last_num(first_num);;
TString form;
form << "(33->TIPOCF==\"" << tipocf << "\")&&(33->CODCF==\"" << codcf << "\")&&(ANSI(33->DATADOC)<=\"" << datadoc.string(ANSI) << "\")" << "&&((CODNUM==\"" << first_num << "\")";
for (const char * s = nums.get(); s && *s; s = nums.get())
{
if (first_num > s)
first_num = s;
if (last_num < s)
last_num = s;
form << "||(CODNUM==\"" << s << "\")";
}
form << ")";
TRelation rel(LF_RIGHEDOC);
TRectype from(rel.curr());
TRectype to(rel.curr());
rel.add(LF_DOC, "PROVV==PROVV|ANNO=ANNO|CODNUM==CODNUM|NDOC==NDOC");
const int last_anno = mask.get_int(F_ANNO);
const int first_anno = last_anno - ((TTipo_riga_documento&)mask.doc()[current_doc_row].tipo()).search_years();
TString80 livello;
for (int l = 0; l<4 ; l++)
mask.doc().livelli().pack_grpcode(livello, row_mask.get(FR_LIV1 + l),l + 1);
from.put(RDOC_CODART, codart);
from.put(RDOC_LIVELLO, livello);
from.put(RDOC_CODNUM, first_num);
from.put(RDOC_ANNO, first_anno);
from.put(RDOC_PROVV, "D");
to.put(RDOC_CODART, codart);
to.put(RDOC_LIVELLO, livello);
to.put(RDOC_CODNUM, last_num);
to.put(RDOC_ANNO, last_anno);
to.put(RDOC_PROVV, "D");
TSorted_cursor cur(&rel, "33->DATADOC-|CODNUM|NDOC-", "", 5, &from, &to);
cur.setfilter(form, true);
if (cur.items() > 0L)
{
cur = 0L;
__in_handler = true;
row_mask.set(FR_CODART, codart, 0x3);
row_mask.field(FR_CODART).set_dirty(false);
__in_handler = false;
const TString& prezzo = cur.curr().get(RDOC_PREZZO);
row_mask.set(FR_PREZZO, prezzo);
const TString& sconto = cur.curr().get(RDOC_SCONTO);
row_mask.set(FR_SCONTO, sconto);
}
}
}
return codart_handler( f, key);
}
bool find_price_handler(TMask_field& f, KEY key )
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
if (key == K_F8 && !sh.sheet_mask().is_running())
{
TEdit_field& ef = (TEdit_field&)f;
const TString& codart = row_mask.get(FR_CODART);
if (codart.empty())
search_price(ef, key);
else
search_price_article(ef,key);
return true;
}
return codart_handler( f, key);
}
///////////////////////////////////////////////////////////
// TCache_documenti
///////////////////////////////////////////////////////////
class TCache_documenti : public TRecord_cache
{
protected:
virtual TObject* rec2obj(const TRectype& rec) const;
public:
TDocumento& doc(const char* key);
TCache_documenti();
virtual ~TCache_documenti() { }
};
TCache_documenti::TCache_documenti()
: TRecord_cache(LF_DOC, 1)
{
test_file_changes(); // Tieni d'occhio le modifiche sul file
set_items_limit(256); // Standard
}
TObject* TCache_documenti::rec2obj(const TRectype& curr) const
{
return new TDocumento(curr);
}
TDocumento& TCache_documenti::doc(const char* key)
{
return (TDocumento &)query(key);
}
TDocumento& cached_doc(const char* key)
{
static TCache_documenti * _cache_docs = NULL;
if (_cache_docs == NULL)
_cache_docs = new TCache_documenti();
return _cache_docs->doc(key);
}
class TLink_riga_documento : public TRiga_documento
{
protected:
const TDocumento_mask* _mask;
virtual const TString& get_str(const char* fieldname) const;
public:
virtual const TDocumento& doc() const;
void set_mask(const TDocumento_mask * m) { _mask = m;}
virtual real qtaresidua() const;
TLink_riga_documento(const TDocumento_mask * m = NULL, const char* tipo = NULL) : TRiga_documento(NULL, tipo), _mask(m){}
};
const TString& TLink_riga_documento::get_str(const char* fieldname) const
{
if (xvt_str_same(fieldname, "RESIDUO"))
{
TString& value = get_tmp_string();
value = qtaresidua().string();
return value;
}
return TRiga_documento::get_str(fieldname);
}
const TDocumento& TLink_riga_documento::doc() const
{
if (has_doc())
return TRiga_documento::doc();
TToken_string key;
key.add(get_char(RDOC_PROVV));
key.add(get_int(RDOC_ANNO));
key.add(get(RDOC_CODNUM));
key.add(get_long(RDOC_NDOC));
return cached_doc(key);
}
real TLink_riga_documento::qtaresidua() const
{
real residuo = TRiga_documento::qtaresidua();
TToken_string key, key_to_compare;
const TDocumento_mask& m = (const TDocumento_mask &) *_mask;
const TDocumento &doc = m.doc();
const int rows = doc.physical_rows();
const int current_doc_row = m.sfield(F_SHEET).selected() + 1;
key.add(get(RDOC_PROVV));
key.add(get(RDOC_ANNO));
key.add(get(RDOC_CODNUM));
key.add(get(RDOC_NDOC));
key.add(get(RDOC_IDRIGA));
real * qta = (real *) m.father_rows().objptr(key);
if (qta != NULL)
residuo -= *qta;
for (int j = 1; j <= rows; j++)
{
if (j != current_doc_row)
{
const TRiga_documento & row = doc[j];
key_to_compare.cut(0);
key_to_compare.add(row.get(RDOC_DAPROVV));
key_to_compare.add(row.get(RDOC_DAANNO));
key_to_compare.add(row.get(RDOC_DACODNUM));
key_to_compare.add(row.get(RDOC_DANDOC));
key_to_compare.add(row.get(RDOC_DAIDRIGA));
if (key == key_to_compare)
residuo -= row.quantita();
}
}
return residuo;
}
class TLink_article_sheet : public TBrowse_sheet
{
protected:
virtual bool get_ini_paragraph(const TEdit_field& field, TString& parag) const;
public:
TLink_article_sheet(TCursor& cur, TEdit_field& f, const char * fieldlist, const char * headers);
};
bool TLink_article_sheet::get_ini_paragraph(const TEdit_field& field, TString& parag) const
{
const bool ok = TSheet::get_ini_paragraph(field, parag);
if (ok)
parag << "_F82";
return ok;
}
TLink_article_sheet::TLink_article_sheet(TCursor& cur, TEdit_field& f, const char * fieldlist, const char * headers)
: TBrowse_sheet(&cur, fieldlist, TR("Evasione"), headers, 0, f, TToken_string())
{ }
bool link_row_handler(TMask_field& f, KEY key )
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
if (key == K_F8 && !sh.sheet_mask().is_running())
{
TDocumento_mask& mask = (TDocumento_mask &)sh.mask();
TDocumento &doc = mask.doc();
const int current_doc_row = sh.selected() + 1;
TRiga_documento & r = doc[current_doc_row];
TTipo_riga_documento & tipo = (TTipo_riga_documento &) r.tipo();
if ((tipo.search_active_docs().blank()) || (tipo.search_active_docs().find(doc.tipo().codice()) >= 0))
{
TEdit_field& ef = (TEdit_field&)f;
const TCodice_articolo codart(row_mask.get(FR_CODART));
const bool select_clifo = tipo.select_clifo();
if (codart.full() && r.get(RDOC_DACODNUM).empty())
{
TDate datadoc = mask.get_date(F_DATADOC);
TToken_string nums(((TTipo_riga_documento&)r.tipo()).search_nums());
const int sel = sh.selected();
TToken_string & sh_row = sh.row(sel);
const TString row_cod(sh_row.get(sh.cid2index(FR_CODART)));
TString80 from_livello, to_livello;
int len = 0;
for (int l = 1; l <= doc.livelli().last_level() ; l++)
{
doc.livelli().pack_grpcode(from_livello, row_mask.get(FR_LIV1 + l - 1),l);
len += doc.livelli().code_length(l);
}
to_livello = from_livello;
if (doc.livelli().last_level() > 0 && to_livello.blank())
to_livello.fill('{', len);
if (row_cod.blank())
{
sh_row.add("", sh.cid2index(FR_CHECKED));
sh_row.add(codart, sh.cid2index(FR_CODART));
sh.check_row(sel);
}
r.autosave(sh);
if (nums.blank())
nums = mask.get(F_CODNUM);
TString4 first_num(nums.get(0));
TString4 last_num(first_num);
TString filter;
filter << "(RIGAEVASA!=\"X\")&&(CODART==\"" << codart << "\")&&((LIVELLO>=\""
<< from_livello << "\")&&(LIVELLO<=\"" << to_livello << "\"))&&(ANSI(33->DATADOC)<=\"" << datadoc.string(ANSI) << "\")";
if (nums.items() > 0)
{
const bool more_nums = (nums.items() > 1);
bool add_or = false;
filter<< "&&";
if (more_nums)
filter<< "(";
FOR_EACH_TOKEN(nums, s)
{
if (add_or)
filter << "||";
add_or = true;
if (first_num > s)
first_num = s;
if (last_num < s)
last_num = s;
filter << "(CODNUM==\"" << s << "\")";
}
if (more_nums)
filter << ")";
}
TRelation rel(LF_RIGHEDOC);
TRectype from(rel.curr());
TRectype to(rel.curr());
rel.lfile().set_curr(new TLink_riga_documento(&mask));
rel.add(LF_DOC, "PROVV==PROVV|ANNO=ANNO|CODNUM==CODNUM|NDOC==NDOC");
if (select_clifo)
{
filter << "&&(33->TIPOCF==\"" << doc.get(DOC_TIPOCF) << "\")";
filter << "&&(33->CODCF==\"" << doc.get(DOC_CODCF) << "\")";
}
else
rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF", 1, LF_DOC);
const int last_anno = mask.get_int(F_ANNO);
const int first_anno = last_anno - tipo.search_years();
from.put(RDOC_CODART, codart);
from.put(RDOC_LIVELLO, from_livello);
from.put(RDOC_CODNUM, first_num);
from.put(RDOC_ANNO, first_anno);
from.put(RDOC_PROVV, 'D');
to.put(RDOC_CODART, codart);
to.put(RDOC_LIVELLO, to_livello);
to.put(RDOC_CODNUM, last_num);
to.put(RDOC_ANNO, last_anno);
to.put(RDOC_PROVV, 'D');
TString order = tipo.order();
if (order.blank())
order ="33->DATADOC|CODNUM|NDOC";
TSorted_cursor cur(&rel, order, filter, 5, &from, &to);
cur.items();
cur.freeze();
cur.relation()->add("%NUM", "CODTAB==CODNUM", 1, 0, 201);
cur.relation()->add("%TIP", "CODTAB==TIPODOC", 1, LF_DOC, 202);
TToken_string fieldlist = tipo.field_list();
TToken_string header = tipo.header();
if (fieldlist.blank())
fieldlist = "-201->S0|-202->S0|NDOC|33->DATADOC|QTA|QTAEVASA";
if (header.blank())
header = HR("Numerazione@18|Tipo Documento@18|Num.|Data@10|Quantità@15P|Evaso@15P");
if (!select_clifo)
{
fieldlist << "|20->CODCF|20->RAGSOC";
header << HR("|Codice|Ragione sociale@50");
}
TLink_article_sheet sheet(cur, (TEdit_field&)f, fieldlist, header);
sheet.add_string (FR_DESCR, 0, "", 38, 0, 50, "D", 30);
sheet.set(FR_CODART, codart);
sheet.set(FR_DESCR, cache().get(LF_ANAMAG, codart, "DESCR"));
if (sheet.run() == K_ENTER)
{
r.set_original_rdoc_key(cur.curr());
const TRectype * orig_doc = r.find_original_doc(); // warning
if (orig_doc != NULL)
{
TDocumento father_doc(*orig_doc);
TLink_riga_documento & father_row = (TLink_riga_documento &) cur.curr();
const TString16 livello = father_row.get(RDOC_LIVELLO);
father_row.set_doc(&doc);
r.put(RDOC_LIVELLO, livello);
r.put(r.field_qta(), father_row.qtaresidua());
TToken_string & flds = tipo.fields_to_update();
FOR_EACH_TOKEN(flds, fld)
{
const TString & val = father_row.get(fld);
r.put(fld, val);
}
r.autoload(sh);
sh.force_update(sel);
}
}
}
return true;
}
}
return codart_handler( f, key);
}
bool codart_handler(TMask_field& f, KEY key )
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask& mask = (TDocumento_mask &)sh.mask();
const int current_doc_row = sh.selected() + 1;
if (f.to_check(key, true))
{
TEdit_field& liv1 = row_mask.efield(FR_LIV1);
if (f.empty())
{
liv1.reset();
liv1.disable();
}
else
liv1.enable();
liv1.on_hit();
}
if (key == K_TAB && (f.focusdirty() || row_mask.get(FR_CHECKED).empty()))
{
// cached_article(NULL); // Azzera cache articoli nel caso l'utente abbia cambiato pesi
TCond_vendita & condv = mask.condv();
condv.set_testa(&mask);
condv.set_riga(&row_mask);
TCodice_articolo codart = f.get();
TRectype anamag = cache().get(LF_ANAMAG, codart); // anamag puo' cambiare
bool found = !anamag.empty();
TString4 umcorr;
TString desc;
if (found)
row_mask.set(FR_CODARTMAG, codart, true);
else
{
TLocalisamfile codalt(LF_CODCORR);
codalt.setkey(2);
codalt.put(CODCORR_CODARTALT, codart);
if (codalt.read() == NOERR)
{
codart = codalt.get(CODCORR_CODART);
desc = codalt.get(CODCORR_DESCR);
anamag = cache().get(LF_ANAMAG, codart);
found = !anamag.empty();
if (found)
{
row_mask.set(FR_CODARTMAG, codart, true);
umcorr = codalt.get(CODCORR_UM);
const TString& liv1 = codalt.get(CODCORR_LIV1);
if (liv1.full())
row_mask.set(FR_LIV1, liv1);
const TString & liv2 = codalt.get(CODCORR_LIV2);
if (liv2.full())
row_mask.set(FR_LIV2, liv2);
const TString & liv3 = codalt.get(CODCORR_LIV3);
if (liv3.full())
row_mask.set(FR_LIV3, liv3);
const TString & liv4 = codalt.get(CODCORR_LIV4);
if (liv4.full())
row_mask.set(FR_LIV4, liv4);
}
}
}
row_mask.set(FR_CHECKED, "X");
if (!found)
{
row_mask.set(FR_CODARTMAG, "", true);
if (main_app().has_module(DBAUT))
{
const TRectype& dist = cache().get(LF_DIST, codart);
if (!dist.empty())
{
desc = dist.get("DESCR");
umcorr = dist.get("UM");
}
}
}
else
{
const TString4 lingua = mask.get(F_CODLIN);
const TCodice_articolo codart = row_mask.get(FR_CODARTMAG);
if (desc.blank())
desc = anamag.get(ANAMAG_DESCR);
if (mask.doc()[current_doc_row].is_omaggio())
{
static TString dicitura_omaggio;
if (dicitura_omaggio.empty())
{
dicitura_omaggio = ini_get_string(CONFIG_STUDIO, "ve", "DESOMAGGI");
if (dicitura_omaggio.blank())
dicitura_omaggio = TR("(OMAGGIO)");
}
desc << ' ' << dicitura_omaggio;
}
if (lingua.full())
{
TLocalisamfile deslin(LF_DESLIN);
deslin.setkey(2);
deslin.put(DESLIN_CODART, codart);
deslin.put(DESLIN_CODLIN, lingua);
if (deslin.read() == NOERR)
{
static bool __lingua_only = ini_get_bool(CONFIG_DITTA, "ve", "LINGUA_ONLY");
if (__lingua_only)
desc = deslin.get(DESLIN_DESCR);
else
desc << '\n' << deslin.get(DESLIN_DESCR);
}
}
const TString& descest = anamag.get("DESCRAGG");
if (descest.not_empty())
{
if (!mask.doc()[current_doc_row].tipo().extended_desc_search())
desc << "\n";
desc << descest;
}
if (!mask.doc()[current_doc_row].tipo().no_desc())
row_mask.set(FR_DESCR, desc);
TString80 key; key << codart << "|1";
const TRectype& umart = cache().get(LF_UMART, key);
if (!umart.empty())
{
curr_um = umart.get(UMART_UM);
curr_fc = umart.get_real(UMART_FC);
}
else
{
curr_um.cut(0);
curr_fc = UNO;
}
row_mask.set(FR_UMQTA, curr_um);
upd_colli_peso_tara(row_mask, codart);
}
condv.ricerca();
const char* rdoc_prezzo = mask.doc().tipo().calcolo_lordo() ? RDOC_PREZZOL : RDOC_PREZZO;
mask.doc()[current_doc_row].put(rdoc_prezzo, row_mask.get(FR_PREZZO));
FOR_EACH_CONFIGURED_CONAI_CLASS(type)
{
short id = conai_sottocat_id(type);
int pos = row_mask.id2pos(id);
if (pos >= 0 && row_mask.fld(pos).get().blank())
{
const int lognum = anamag.num();
const TFieldref fr(conai_sottocat_name(type, lognum), lognum);
row_mask.fld(pos).set(fr.read(anamag));
}
id = conai_peso_id(type);
pos = row_mask.id2pos(id);
if (pos >= 0 && row_mask.fld(pos).get().blank())
{
const int lognum = anamag.num();
const TFieldref fr(conai_peso_name(type, lognum), lognum);
row_mask.fld(pos).set(fr.read(anamag));
}
}
const int pos = row_mask.id2pos(FR_CODIVA);
if (pos >= 0)
iva_handler(row_mask.fld(pos), 0);
if (found)
{
TString8 caus(row_mask.get(FR_CAUS));
if (caus.blank())
caus = mask.get(F_CAUSMAG);
if (caus.full())
{
const TCausale_magazzino & c = cached_causale_magazzino(caus);
if (!c.movimenta_sospesi())
{
const TRectype & rec = cache().get(LF_ANAMAG, row_mask.get(FR_CODARTMAG));
if (rec.get_bool(ANAMAG_SOSPESO))
return error_box(FR("Articolo %s sospeso, quindi non movimentabile"), (const char *)codart);
}
}
if (mask.gestione_note_per_articolo())
mask.send_key(K_F8, F_NAR, &sh);
}
} else
if (key == K_F8 && !row_mask.is_running())
{
const bool explode_db = ini_get_bool(CONFIG_DITTA, "ve", "EXPLODEDB");
if (explode_db && !sh.sheet_mask().is_running())
{
const bool valcomp = ini_get_bool(CONFIG_DITTA, "ve", "VALCOMP");
const bool matbase = ini_get_bool(CONFIG_DITTA, "ve", "TIPOESPL");
const TExplosion_grouping raggart = (TExplosion_grouping) ini_get_int(CONFIG_DITTA, "ve", "RAGGART");
const bool elrorig = ini_get_bool(CONFIG_DITTA, "ve", "ELRORIG");
const int livello = ini_get_int(CONFIG_DITTA, "ve", "LIVESPL");
const int ordin = ini_get_int(CONFIG_DITTA, "ve", "ORDDB");
TDocumento & doc = mask.doc();
TRiga_documento & curr_row = doc[current_doc_row];
const int start_level = curr_row.get_int(RDOC_LEVEL);
sh.update_row(current_doc_row - 1);
curr_row.autosave(sh);
TDistinta_tree db;
TArray components;
db.set_root(curr_row);
const int items = db.explode(components, matbase, raggart, livello, "A", ordin);
if (items > 0)
{
TProgind pi(items, TR("Esplosione in corso..."), false, true);
int row = current_doc_row;
const TString16 tiporiga(curr_row.tipo().codice());
TString_array& str_arr = sh.rows_array();
for (int i = components.first(); i < items; i = components.succ(i))
{
pi.addstatus(1L);
TRiga_esplosione & r = (TRiga_esplosione &) components[i];
sh.insert(row, false, true);
TRiga_documento & new_row = doc[row + 1];
TDocumento::copy_data(new_row, curr_row);
new_row.put(RDOC_CODART, r.articolo());
new_row.put(RDOC_CODARTMAG, r.articolo());
new_row.put(RDOC_LIVELLO, r.giacenza());
new_row.zero(RDOC_DESCR);
new_row.zero(RDOC_DESCLUNGA);
new_row.zero(RDOC_DESCEST);
new_row.put(RDOC_CHECKED, "");
new_row.put(RDOC_UMQTA, r.um());
new_row.put(RDOC_GENERATA, "X");
new_row.put(RDOC_QTA, r.val() /* * qta_fin */);
const int level = start_level + r.livello();
new_row.put(RDOC_LEVEL, level);
if (!valcomp)
{
new_row.zero(RDOC_PREZZO);
sh.row(row).add("0", sh.cid2index(FR_PREZZO));
row_mask.reset(FR_PREZZO);
}
new_row.autoload(sh);
sh.check_row(row);
new_row.autosave(sh); // Da sheet a rdoc
row++;
}
if (elrorig)
{
doc.destroy_row(current_doc_row, true);
sh.destroy(current_doc_row - 1, false);
row--;
}
else
if (valcomp)
{
curr_row.zero(RDOC_PREZZO);
curr_row.autoload(sh);
}
sh.force_update();
sh.post_select(current_doc_row - 1);
sh.update_mask(current_doc_row - 1);
}
}
mask.update_giacenza();
}
return true;
}
bool codartmag_handler( TMask_field& f, KEY key )
{
TMask & m = f.mask();
/* Modo vecchio con funzionamento dubbiamente legato a !mask.is_running
TSheet_field& s = *m.get_sheet();
TDocumento_mask& mask= (TDocumento_mask&)s.mask();
bool to_check = key == K_TAB && f.focusdirty();
if (!to_check)
to_check = !mask.is_running();
if (to_check)
{
const bool artmag = !f.empty() && TRiga_documento::tipo(m.get(FR_TIPORIGA)).is_merce();
m.show(FR_UMQTA, artmag);
m.show(FR_UMQTA2, !artmag);
mask.update_giacenza();
}
*/
if (key == K_TAB)
{
// const bool artmag = !f.empty() && TRiga_documento::tipo(m.get(FR_TIPORIGA)).is_merce();
const bool artmag = !f.empty() && !cache().get(LF_ANAMAG, f.get()).empty();
m.show(FR_UMQTA, artmag);
m.show(FR_UMQTA2, !artmag);
if (f.focusdirty())
{
TSheet_field& s = *m.get_sheet();
TDocumento_mask& mask= (TDocumento_mask&)s.mask();
if (mask.is_running())
mask.update_giacenza();
}
}
return true;
}
bool liv_handler( TMask_field& f, KEY key )
{
bool ok = true;
TDocumento_mask & mask=(TDocumento_mask &) f.mask().get_sheet()->mask();
if (key == K_TAB && f.focusdirty() && !f.get().empty())
{
const int levnum=f.dlg()-FR_LIV1+1;
// Se e' abilitato l'autoinserimento del livello di giacenza...
if (mask.livelli().autoinsert(levnum))
mask.livelli().autoinsert(levnum, f);
}
if (f.to_check(key, true))
{
if (f.dlg() < FR_LIV4)
{
TMask& row_mask = f.mask();
TMask_field & next = row_mask.field(f.dlg() + 1);
if (f.get().not_empty())
next.enable();
else
{
next.reset();
next.disable();
}
next.on_hit();
}
TDocumento_mask& mask=(TDocumento_mask&)f.mask().get_sheet()->mask();
mask.update_giacenza();
}
return ok;
}
void set_curr_um(const TString & um)
{
curr_um = um;
curr_fc = -1.0;
}
bool umart_handler( TMask_field& f, KEY key )
{
TMask& row_mask = f.mask( );
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask & mask = (TDocumento_mask &)sh.mask();
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty() && mask.is_running())
{
const int current_doc_row = sh.selected() + 1;
TCond_vendita & condv = mask.condv();
condv.set_riga(&row_mask);
const TString& um = f.get();
real fc = UNO;
if (um.not_empty() && curr_um.not_empty() && um != curr_um)
{
TLocalisamfile umart(LF_UMART);
umart.setkey(2);
umart.put(UMART_CODART, row_mask.get(FR_CODARTMAG));
umart.put(UMART_UM, um);
if (umart.read() == NOERR)
{
real qta(row_mask.get_real(FR_QTA));
fc = umart.get_real(UMART_FC);
if (curr_fc < ZERO)
{
umart.put(UMART_CODART, row_mask.get(FR_CODARTMAG));
umart.put(UMART_UM, curr_um);
if (umart.read() == NOERR)
curr_fc = umart.get_real(UMART_FC);
else
curr_fc = UNO;
}
qta *= curr_fc;
qta /= fc;
qta.round(5);
row_mask.set(FR_QTA, qta);
qta = row_mask.get_real(FR_QTAEVASA);
qta *= curr_fc;
qta /= fc;
qta.round(5);
row_mask.set(FR_QTAEVASA, qta);
}
}
curr_um = um;
curr_fc = fc;
condv.ricerca(true);
const char* const prezzo = mask.doc().tipo().calcolo_lordo() ? RDOC_PREZZOL : RDOC_PREZZO;
mask.doc()[current_doc_row].put(prezzo, row_mask.get(FR_PREZZO));
const int pos = row_mask.id2pos(FR_CODIVA);
if (pos >= 0)
iva_handler(row_mask.fld(pos), 0);
}
return true;
}
bool um_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
TTable& ums = (TTable&)((TEdit_field&)f).browse()->cursor()->file();
const TString4 um = f.get();
real fc = UNO;
if (um.not_empty() && curr_um.not_empty() && um != curr_um)
{
ums.put("CODTAB", curr_um);
if (ums.read() == NOERR)
{
real qta(row_mask.get_real(FR_QTA));
const TString4 umsrif0 = ums.get("S7");
const real fc0 = ums.get_real("R10");
if (um == umsrif0)
fc = fc0;
else
{
ums.put("CODTAB", um);
if (ums.read() == NOERR)
{
const real fc1 = ums.get_real("R10");
if (fc1 > ZERO)
{
const TString& umsrif1 = ums.get("S7");
if (curr_um == umsrif1)
fc = UNO / fc1;
else
if (umsrif0 == umsrif1)
fc = fc0 / fc1;
}
}
}
qta *= fc;
qta.round(5);
row_mask.set(FR_QTA, qta);
qta = row_mask.get_real(FR_QTAEVASA);
qta *= fc;
qta.round(5);
row_mask.set(FR_QTAEVASA, qta);
}
}
curr_um = um;
curr_fc = fc;
}
return true;
}
bool descr_handler( TMask_field& f, KEY key )
{
if (key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask & mask = (TDocumento_mask &)sh.mask();
const TTipo_riga_documento & t = mask.doc()[sh.selected() + 1].tipo();
if (t.extended_desc_search())
{
const TString& s = f.get();
TLocalisamfile& anamag = ((TEdit_field&)f).browse()->cursor()->file();
if (s == anamag.get(ANAMAG_DESCR))
f.mask().set(FR_CODART, anamag.get(ANAMAG_CODART), 3);
}
else
{
const TString& s = f.get();
if (s.find('\n') < 0)
{
TLocalisamfile& anamag = ((TEdit_field&)f).browse()->cursor()->file();
TString codart = anamag.get(ANAMAG_CODART);
if (s == anamag.get(ANAMAG_DESCR) && codart != f.mask().get(FR_CODART))
f.mask().set(FR_CODART, anamag.get(ANAMAG_CODART), 3);
}
}
}
return true;
}
bool qtaart_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask& mask = (TDocumento_mask&) sh.mask();
const int current_doc_row = sh.selected() + 1;
TCond_vendita & condv = mask.condv();
condv.set_riga(&row_mask);
condv.ricerca(false, true);
if (mask.doc().tipo().calcolo_lordo())
mask.doc()[current_doc_row].put(RDOC_PREZZOL, row_mask.get(FR_PREZZO));
else
mask.doc()[current_doc_row].put(RDOC_PREZZO, row_mask.get(FR_PREZZO));
const TString& codart = row_mask.get(FR_CODARTMAG);
if (codart.not_empty())
upd_colli_peso_tara(row_mask, codart);
} //if(key==K_TAB
else
if (key == K_ENTER && f.dirty())
{
TDocumento_mask& mask=(TDocumento_mask&)f.mask().get_sheet()->mask();
TDocumento & doc = mask.doc();
if ((doc.tipo().check_giac() || doc.tipo().check_disp()) &&
main_app().has_module(MGAUT, CHK_DONGLE) && doc.tipo().mov_mag())
{
TSheet_field& sf = mask.sfield(F_SHEET);
TToken_string& row = sf.row(sf.selected());
const TCodice_articolo codart = row.get(sf.cid2index(FR_CODARTMAG));
if (codart.full())
{
TString8 codmag = row.get(sf.cid2index(FR_CODMAG));
const TString4 coddep = row.get(sf.cid2index(FR_CODDEP));
if (!coddep.blank())
codmag << coddep;
TString16 livello;
for (int i = 0; i < 4; i++)
{
const char* liv = row.get(sf.cid2index(FR_LIV1+i));
if (*liv > ' ')
livello << liv;
else
break;
}
real qta(row.get(sf.cid2index(FR_QTA)));
const TString8 caus = mask.get(F_CAUSMAG);
const TCausale_magazzino & c = cached_causale_magazzino(caus);
const long nmovmag = doc.get_long(DOC_MOVMAG);
if (nmovmag != 0)
{
TLocalisamfile rmovmag(LF_RMOVMAG);
rmovmag.setkey(2);
rmovmag.put(RMOVMAG_CODART, codart);
rmovmag.put(RMOVMAG_LIVGIAC, livello);
rmovmag.put(RMOVMAG_CODMAG, codmag);
rmovmag.put(RMOVMAG_NUMREG, nmovmag);
if (rmovmag.read() == NOERR)
qta -= rmovmag.get_real(RMOVMAG_QUANT);
}
if (mask.fconv_qta() != UNO)
qta *= mask.fconv_qta();
if (doc.tipo().check_giac())
{
const real giac = mask.get(F_CURGIAC);
if (giac < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione giacenza negativa: si desidera continuare?"))
return false;
} else
if (doc.tipo().check_disp())
{
const real disp = mask.get(F_CURDISP);
if (disp < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione disponibilità negativa: si desidera continuare?"))
return false;
}
}
}
}
return qta_handler(f, key);
}
bool qta_handler( TMask_field& f, KEY key )
{
// Se qualcuno cerca di modificare la maschera
if ( key == K_TAB && f.focusdirty())
{
TMask& row_mask = f.mask( );
const real qta_evasa = row_mask.get_real(FR_QTAEVASA);
const real qta(f.get());
if (qta_evasa > 0 && qta_evasa >= qta)
{
row_mask.set(FR_RIGAEVASA, "X");
row_mask.disable(FR_RIGAEVASA);
}
else
row_mask.enable(FR_RIGAEVASA);
}
return true;
}
bool qta_evasa_handler( TMask_field& f, KEY key )
{
TMask& row_mask = f.mask( );
if (f.to_check(key) || (key == K_TAB && !row_mask.is_running()))
{
const real qta_evasa(f.get());
const real qta = row_mask.get_real(FR_QTA);
bool enable_evasa = true;
if (qta_evasa > 0 && qta_evasa >= qta)
{
row_mask.set(FR_RIGAEVASA, "X");
enable_evasa = false;
}
row_mask.enable(FR_RIGAEVASA, enable_evasa);
if (!row_mask.is_running())
{
TSheet_field* sheet = row_mask.get_sheet();
const int riga = sheet->selected();
sheet->enable_cell(riga, sheet->cid2index(FR_RIGAEVASA), enable_evasa);
}
}
return true;
}
bool causmag_handler( TMask_field& f, KEY key )
{
if (f.to_check(key))
{
TMask& row_mask = f.mask( );
TDocumento_mask& mask = (TDocumento_mask &) row_mask.get_sheet()->mask();
TString8 causmag(f.get());
if (causmag.blank())
causmag = mask.get(F_CAUSMAG);
if (causmag.full())
{
TCausale_magazzino c = cached_causale_magazzino(causmag); // deve essere modiifcata quindi non puo' essere un reference
if (c.has_default_mag() && row_mask.get(FR_CODMAG).empty())
{
row_mask.set(FR_CODMAG, c.default_mag(), true);
row_mask.set(FR_CODDEP, "", true);
}
if (c.has_default_dep() && row_mask.get(FR_CODDEP).empty())
row_mask.set(FR_CODDEP, c.default_dep(), true);
if (c.caus_collegata().full())
{
c = cache().get("%CAU", c.caus_collegata());
if (c.has_default_mag() && row_mask.get(FR_CODMAGC).empty())
{
row_mask.set(FR_CODMAGC, c.default_mag(), true);
row_mask.set(FR_CODDEPC, "", true);
}
if (c.has_default_dep() && row_mask.get(FR_CODDEPC).empty())
row_mask.set(FR_CODDEPC, c.default_dep(), true);
static int copy_defmagc = -883;
if (copy_defmagc < 0)
{
TFilename fname; mask.doc().tipo().profile_name(fname);
TConfig c_tipo_documento(fname,"MAIN");
copy_defmagc = c_tipo_documento.get_bool("DEFMAGXCOLL");
}
if (copy_defmagc!=0)
{
if (row_mask.get(FR_CODMAGC).empty())
row_mask.set(FR_CODMAGC, mask.stdmag(), true);
if (row_mask.get(FR_CODDEPC).empty())
row_mask.set(FR_CODDEPC, mask.stddep(), true);
}
}
if (!c.movimenta_sospesi())
{
const TRectype & rec = cache().get(LF_ANAMAG, row_mask.get(FR_CODARTMAG));
if (rec.get_bool("SOSPESO"))
return error_box("Articolo %s sospeso, quindi non movimentabile", (const char *)rec.get(ANAMAG_CODART));
}
}
}
return true;
}
bool sppr_handler( TMask_field& f, KEY key )
{
TMask& row_mask = f.mask();
if (key == K_TAB && (f.focusdirty() || row_mask.get(FR_DESCR).empty()))
{
const TRectype& curr = ((TEdit_field&)f).browse()->cursor()->curr();
const TSpesa_prest sp(curr);
const int pos = row_mask.id2pos(FR_PREZZO);
if (pos >= 0 && !sp.empty())
{
const char tipo = sp.tipo();
const bool qta_val_fl = tipo == 'Q';
const bool perc_fl = tipo == 'P';
int pos = row_mask.id2pos(FR_UMQTASP);
if (pos >= 0)
row_mask.fld(pos).enable(!perc_fl);
pos = row_mask.id2pos(FR_PREZZO);
if (pos >= 0)
row_mask.fld(pos).enable(!perc_fl);
pos = row_mask.id2pos(FR_SCONTO);
if (pos >= 0)
row_mask.fld(pos).enable(!perc_fl);
pos = row_mask.id2pos(FR_QTA);
if (pos >= 0)
{
row_mask.fld(pos).show(!perc_fl);
row_mask.fld(pos).enable(qta_val_fl);
}
pos = row_mask.id2pos(FR_PERCSP);
if (pos >= 0)
{
row_mask.fld(pos).show(perc_fl);
row_mask.fld(pos).enable(perc_fl);
}
if (!perc_fl)
{
const TDocumento_mask& mask = (const TDocumento_mask&)row_mask.get_sheet()->mask();
const real cambio = mask.get_real(F_CAMBIO);
real prezzo = sp.prezzo();
const TString& doc_valuta = mask.get(F_CODVAL);
sppr_calc(sp, doc_valuta, cambio, prezzo);
if (mask.doc().tipo().calcolo_lordo())
prezzo = TRiga_documento::iva(sp.cod_iva()).lordo(prezzo, ALL_DECIMALS);
row_mask.set(FR_PREZZO, prezzo);
}
}
const int posiva = row_mask.id2pos(FR_CODIVA);
if (posiva >= 0)
iva_handler(row_mask.fld(posiva), 0);
if (row_mask.id2pos(FR_CDC1) >= 0 && sp.get("S1").full())
{
const TString80 cdc(sp.cdc());
const TString80 cms(sp.cms());
const TString80 fase(sp.fase());
for (short i = FR_CDC1; i <= FR_CDC12; i++)
{
const int pos = row_mask.id2pos(i);
if (pos >=0)
{
TEdit_field& e = (TEdit_field&)row_mask.fld(pos);
const TFieldref& fr = *e.field();
if (fr.name() == RDOC_CODCOSTO)
{
if (cdc.full())
e.set(cdc.sub(fr.from(), fr.to()));
} else
if (fr.name() == RDOC_CODCMS)
{
if (cms.full())
e.set(cms.sub(fr.from(), fr.to()));
} else
if (fr.name() == RDOC_FASCMS)
{
if (fase.full())
e.set(fase.sub(fr.from(), fr.to()));
}
}
}
}
}
return true;
}
// Costava troppo fare una unica funzione, ma alla fine ce l'abbiamo fatta! :-)
static void add_custom_search_fields(TMask& m, TToken_string& fields, TToken_string& headers)
{
TFilename name(m.source_file()); name.ext("ini");
TConfig c(name, "Search");
const TString& f = c.get("FieldList");
if (f.full())
{
if (f[0] == fields.separator())
fields << f;
else
fields.add(f);
const TString& h = c.get("Header");
if (h[0] == headers.separator())
headers << h;
else
headers.add(h);
}
}
bool TDocumento_mask::numdocrif_search_handler(TMask_field& f, KEY key)
{
if (key == K_F9)
{
TMask& m = f.mask();
TRelation rel(LF_DOC);
rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF");
rel.add(LF_RIGHEDOC, "PROVV==PROVV|ANNO==ANNO|CODNUM==CODNUM|NDOC==NDOC|NRIGA==1");
const long codcf = m.get_int(F_CODCF);
bool is_clifor = (codcf > 0L);
TRectype& filtrec = rel.curr();
if (is_clifor)
{
filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF));
filtrec.put(DOC_CODCF, codcf);
}
else
filtrec.put(DOC_CODNUM, m.get(F_CODNUM));
filtrec.put(DOC_PROVV, m.get(F_PROVV));
filtrec.put(DOC_ANNO, m.get(F_ANNO));
TSorted_cursor cur(&rel, "NUMDOCRIF", "", is_clifor ? 2: 1, &filtrec, &filtrec);
if (is_clifor)
{
TString80 filter;
filter.format(DOC_CODNUM "==\"%s\"", (const char*)m.get(F_CODNUM));
cur.setfilter(filter);
}
TToken_string siblings;
TToken_string header(HR("Docum.Rif.|Data@10|Codice|Ragione Sociale@50|Docum.Rif. 1|Docum.Rif. 2|Docum.Rif. 3|Documento|Data\nDocumento@10|Totale\nDocumento@18V|Valuta|Stato"));
TToken_string fieldlist("NUMDOCRIF|DATADOCRIF|CODCF|20->RAGSOC|DOC1|DOC2|DOC3|NDOC|DATADOC|G1:TOTDOC|CODVAL|STATO");
add_custom_search_fields(m, fieldlist, header);
TBrowse_sheet sheet(&cur, fieldlist, TR("Documento di riferimento"),
header, 0, (TEdit_field&)f, siblings);
TCursor * c = sheet.cursor();
if (c != NULL)
{
TRectype rec(filtrec);
rec.put(DOC_NUMDOCRIF, m.get(F_NUMDOCRIF));
c->curr() = rec;
c->read();
}
if (sheet.run() == K_ENTER)
{
const int pos_ndoc = fieldlist.get_pos(DOC_NDOC);
const long ndoc = sheet.row(-1).get_long(pos_ndoc);
m.set(F_NDOC, ndoc);
m.stop_run(K_AUTO_ENTER);
}
}
return true;
}
/*
bool TDocumento_mask::ragsoc_search_handler(TMask_field& f, KEY key)
{
if (key == K_F9)
{
TMask& m = f.mask();
TRelation rel(LF_DOC);
rel.add(LF_CLIFO, "TIPOCF==TIPOCF|CODCF==CODCF");
TRectype& filtrec = rel.curr();
filtrec.put(DOC_PROVV, m.get(F_PROVV));
filtrec.put(DOC_ANNO, m.get(F_ANNO));
filtrec.put(DOC_CODNUM, m.get(F_CODNUM));
TSorted_cursor cur(&rel, "TIPOCF|UPPER(20->RAGSOC)|PROVV|ANNO|CODNUM|PROVV|NDOC", "", 1, &filtrec, &filtrec);
TString filter; filter.format("(CODNUM==\"%s\")&&(PROVV==\"D\")&&(TIPOCF==\"%s\")",
(const char*)m.get(F_CODNUM), (const char*)m.get(F_TIPOCF));
cur.setfilter(filter, true);
TToken_string siblings;
TToken_string header(HR("Ragione Sociale@50|Codice|Documento|Data\nDocumento@10|Totale\nDocumento@18V|Valuta|Stato|Partita IVA"));
TToken_string fieldlist("20->RAGSOC|CODCF|NDOC|DATADOC|G1:TOTDOC|CODVAL|STATO|20->PAIV");
add_custom_search_fields(m, fieldlist, header);
TBrowse_sheet sheet(&cur, fieldlist, TR("Ragione Sociale"),
header, 0, (TEdit_field&)f, siblings);
if (!f.empty())
{
TString ragsoc(f.get()); ragsoc.upper();
filtrec.zero();
filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF));
rel.curr(LF_CLIFO).put(CLI_RAGSOC, ragsoc);
cur.read();
}
if (sheet.run() == K_ENTER)
{
const int pos_ndoc = fieldlist.get_pos(DOC_NDOC);
const long ndoc = sheet.row(-1).get_long(pos_ndoc);
m.set(F_NDOC, ndoc);
m.stop_run(K_AUTO_ENTER);
}
}
return true;
}
*/
bool TDocumento_mask::datadocrif_handler(TMask_field& f, KEY key)
{
if (key == K_ENTER && f.empty())
{
const TDocumento_mask& m = (const TDocumento_mask&)f.mask();
if (m.get_bool(F_RAGGREFF))
{
const TDocumento& doc = m.doc();
if (doc.is_nota_credito())
return f.error_box("E' necessario specificare data e numero documento di riferimento\n"
"quando si desidera generare effetti raggruppati");
}
}
return true;
}
bool TDocumento_mask::liqdiff_handler( TMask_field& f, KEY key )
{
if (key == K_ENTER && f.get().full())
{
if (f.mask().get_bool(F_IVAXCASSA))
return f.error_box(TR("Non è ammesso selezionare IVA per cassa e liquidazione differita"));
}
return true;
}
bool link_handler( TMask_field& f, KEY key )
{
if (key == K_SPACE)
{
TSheet_field & sf = *f.mask().get_sheet();
TDocumento_mask & m = (TDocumento_mask & )sf.mask();
TDocumento & d = (TDocumento &) m.doc();
int row = sf.selected();
const TRiga_documento & r = d[row + 1];
const TMask & row_mask = f.mask();
if (r.linked())
r.edit(LF_DOC, "DAPROVV|DAANNO|DACODNUM|DANDOC");
else
if (!row_mask.is_running() && row_mask.id2pos(FR_CODART) >= 0)
{
TBrowse * brw = row_mask.efield(FR_CODART).browse();
if (row_mask.get(FR_CODART).empty() && brw)
{
TCursor& cur = *brw->cursor();
TToken_string siblings;
TToken_string head(brw->head());
head.insert("@1|", 0);
TToken_string items(brw->items());
items.insert(" |", 0);
cur = 0L;
siblings.add(FR_CODART);
TBrowse_sheet sht(&cur, items, TR("Selezione multipla"), head, 0, row_mask.efield(FR_CODART), siblings);
if (sht.run() == K_ENTER && sht.one_checked())
{
const int items_selected = sht.checked();
const long totit = cur.items();
if (items_selected * d.physical_rows() < 950)
{
int processed = 0L;
TToken_string out_id(brw->get_output_fields());
TToken_string out_fnames(brw->get_output_field_names());
const TString4 tipo(row_mask.get(FR_TIPORIGA));
cur.freeze(TRUE);
for (cur = 0L; cur.pos() < totit; ++cur)
if (sht.checked(cur.pos()))
{
if (++processed < items_selected)
sf.insert(row, false, true); // call notify ?
d[row + 1].autoload(sf);
TToken_string & shrow = sf.row(row);
shrow.add(tipo, sf.cid2index(FR_TIPORIGA));
shrow.add("", sf.cid2index(FR_CHECKED));
TMask & row_mask = sf.sheet_row_mask(row);
row_mask.set(FR_TIPORIGA, tipo);
out_fnames.restart();
for (short id = out_id.get_int(0); id > 0; id = out_id.get_int())
{
const TString16 fn(out_fnames.get());
const TFieldref fr(fn, 0);
row_mask.set(id, fr.read(cur.curr()));
shrow.add(row_mask.get(id), sf.cid2index(id));
}
sf.check_row(row, 0x2);
d[row + 1].autosave(sf);
m.highlight_row(row);
row++;
}
cur.freeze(FALSE);
sf.force_update();
}
}
}
}
}
return true;
}
bool ca_mag_handler(TMask_field& f, bool cdc = true)
{
TMask& row_mask = f.mask();
const TSheet_field& sf = *f.mask().get_sheet();
const TDocumento_mask& mask = (TDocumento_mask&)sf.mask();
const int lffile = cdc ? LF_CDC : LF_COMMESSE;
const TMultilevel_code_info & info = ca_multilevel_code_info(lffile);
TString80 cod;
short last_fld = f.dlg();
short first_fld = last_fld - info.levels() + 1;
for (short i = first_fld; i <= last_fld; i++)
cod << row_mask.get(i);
if (cod.blank())
{
cod.cut(0);
last_fld = cdc ? mask.cdc_end() : mask.cms_end();
first_fld = last_fld - info.levels() + 1;
for (short i = first_fld; i <= last_fld; i++)
cod << mask.get(i);
}
const TString8 codmag = cache().get(lffile, cod, "CODMAG");
if (codmag.full())
{
row_mask.set(FR_CODMAG, codmag.left(3), true);
row_mask.set(FR_CODDEP, codmag.mid(3), true);
}
return true;
}
bool cms_mag_handler(TMask_field& f, KEY key)
{
if ((key == K_TAB && f.focusdirty() && !f.empty()) || key == K_ENTER)
{
TMask& m = f.mask();
for (int i = m.id2pos(f.dlg())+1; i < m.fields(); i++)
{
const TMask_field& nxt = m.fld(i);
if (nxt.is_edit() && nxt.field() != NULL && nxt.field()->name() == f.field()->name())
return true; // Opera solo sull'ultimo livello del codice commessa
}
ca_mag_handler(f, false);
const TSheet_field& s = *m.get_sheet();
TDocumento_mask& mask = (TDocumento_mask&)s.mask();
const TRectype& curr = m.efield(mask.cms_end_sh()).browse()->cursor()->curr();
const TString80 codcms = curr.get(COMMESSE_CODCMS);
if (curr.get_bool(COMMESSE_CHIUSA))
return f.error_box(FR("Impossibile operare sulla commessa chiusa %s"), (const char*)codcms);
if (mask.codcms_sh() != codcms) // Cambio commessa
{
mask.codcms_sh() = codcms;
const TString80 codcosto = curr.get(COMMESSE_CODCOSTO);
if (mask.cdc_start_sh() > mask.cms_start_sh() && codcosto.full())
{
for (short i = mask.cdc_start_sh(); i <= mask.cdc_end_sh(); i++)
{
TEdit_field & e = m.efield(i);
const TFieldref* f = e.field();
if (f != NULL)
{
const int from = f->from();
const int to = f->to();
m.set(i, codcosto.sub(from, to), 0x2);
}
}
}
}
}
return true;
}
bool cdc_mag_handler(TMask_field& f, KEY key)
{
if ((key == K_TAB && f.focusdirty()) || key == K_ENTER)
ca_mag_handler(f);
return true;
}
bool codcms_handler(TMask_field& f, KEY key)
{
if (!f.to_check(key, true))
return true;
TDocumento_mask& mask = (TDocumento_mask&)f.mask();
if (f.dlg() < mask.cms_end())
return true; // Opera solo sull'ultimo livello del codice commessa
TDocumento& doc = mask.doc();
TSheet_field& sf = mask.sfield(F_SHEET);
const bool req = !sf.empty() && doc.tipo().head_ca_required();
f.check_type(req ? CHECK_REQUIRED : CHECK_NORMAL);
if (f.empty())
{
if (req)
return f.error_box(TR("La commessa è obbligatoria per questo tipo documento"));
else
return true;
}
const TRectype& curr_cms = ((TEdit_field&)f).browse()->cursor()->curr();
const TString80 codcms = curr_cms.get(COMMESSE_CODCMS);
mask.set(F_CMSH, codcms);
if (curr_cms.get_bool(COMMESSE_CHIUSA))
return f.error_box(FR("Impossibile operare sulla commessa chiusa %s"), (const char*)codcms);
if ((key == K_TAB && f.focusdirty()) || key == K_ENTER)
{
// Controlla se c'e' la gestione dei centri di costo al secondo livello
if (mask.codcms() != codcms)
{
doc.put(DOC_CODCMS, codcms);
FOR_EACH_PHYSICAL_RDOC(doc, r, riga)
{
const TMask& m = sf.sheet_row_mask(r -1);
if (m.id2pos(FR_TIPODET) >= 0 && m.field(FR_TIPODET).active()) //solo se attivo il campo di indetraibilita'...
{
riga->cms2tipodet();
riga->autoload(sf);
sf.force_update(r - 1);
}
}
}
if (mask.cdc_start() > 0 && mask.cdc_start() > mask.cms_start() && mask.codcms() != codcms)
{
mask.codcms() = codcms;
const TString codcosto = curr_cms.get(COMMESSE_CODCOSTO);
if (codcosto.full()) // Propone centro di costo solo se specificato
{
for (short i = mask.cdc_start(); i <= mask.cdc_end(); i++)
{
TEdit_field & e = mask.efield(i);
const TFieldref * f = e.field();
if (f != NULL)
{
const int from = f->from();
const int to = f->to();
mask.set(i, codcosto.sub(from, to), 0x2);
}
}
}
if ((key == K_TAB && f.focusdirty()) && !doc.bloccato())
{
char name[8] = "CODSP0";
TString_array spese;
const TRectype& ven_rec = doc.clifor().vendite();
for (int i = 1; i <= 4; i++)
{
name[5] = '0' + i;
const TString& s = ven_rec.get(name);
if (s.full())
spese.add(s);
}
mask.mask2doc();
doc.zero(DOC_SPESEUPD);
doc.update_spese_aut(spese, false, &mask.sfield(F_SHEET));
}
}
if (main_app().has_module(CTAUT) && (key == K_TAB && f.focusdirty()))
{
TToken_string key;
static TRecord_cache __cfcm(LF_CFCMS, 4);
if (mask.get(F_TIPOCF) != "C")
{
key.add(codcms);
key.add("C");
key.add(1);
const TRectype& cfcms = cache().get(LF_CFCMS, key);
mask.set(F_CUP, cfcms.get(CFCMS_CUP), 3);
mask.set(F_CIG, cfcms.get(CFCMS_CIG), 3);
}
else
{
key.add(codcms);
key.add(mask.get(F_TIPOCF));
key.add(mask.get(F_CODCF));
const TRectype & cfcms1 = __cfcm.get(key);
if (cfcms1.empty())
{
key = codcms;
key.add("C");
key.add(1);
const TRectype & cfcms2 = cache().get(LF_CFCMS, key);
mask.set(F_CUP, cfcms2.get(CFCMS_CUP), 3);
mask.set(F_CIG, cfcms2.get(CFCMS_CIG), 3);
}
else
{
mask.set(F_CUP, cfcms1.get(CFCMS_CUP), 3);
mask.set(F_CIG, cfcms1.get(CFCMS_CIG), 3);
}
}
key.cut(0);
key.add(codcms);
key.add(mask.get(F_TIPOCF));
key.add(mask.get(F_CODCF));
const TRectype & cfcms1 = __cfcm.get(key);
const int nrigaban = cfcms1.get_int(CFCMS_NRIGABAN);
if (nrigaban > 0)
{
key.cut(0);
key.add(mask.get(F_TIPOCF));
key.add(mask.get(F_CODCF));
key.add("V");
key.add(nrigaban);
const TRectype & cfban = cache().get(LF_CFBAN, key);
mask.set(mask.field(F_CODABIA).active() ? F_CODABIA : F_CODABIA1, cfban.get(CFBAN_ABI), 3);
mask.set(mask.field(F_CODCABA).active() ? F_CODCABA : F_CODCABA1, cfban.get(CFBAN_CAB), 3);
mask.set(F_IBAN, cfban.get(CFBAN_IBAN));
}
} //if (main_app().has_module(CTAUT) && (...
//aggiornamento automatico del campo codice contabilita' separata nel caso di commessa che ce lo abbia
if (main_app().has_module(NPAUT) && (key == K_TAB && f.focusdirty()))
{
const TString& contsep = cache().get(LF_COMMESSE, codcms, COMMESSE_CONTSEP);
mask.set(F_CONTSEP, contsep);
}
}
else
{
if (key == K_TAB && !mask.is_running())
mask.codcms() = mask.doc().get(DOC_CODCMS);
}
return true;
}
bool evasion_check_handler(TMask_field& f, KEY key )
{
if (key == K_ENTER && f.dirty())
{
const real qta(f.get());
if (qta <= ZERO)
return true;
const TFieldref * fld = f.field();
if (fld == NULL)
return true;
TSheet_field & sf = *f.mask().get_sheet();
TDocumento_mask & m = (TDocumento_mask & )sf.mask();
const TDocumento & d = m.doc();
const int nrow = sf.selected() + 1;
const TRiga_documento & r = d[nrow];
const TString16 name = fld->name();
const TRectype * orig_doc = r.find_original_doc(); // warning
if (orig_doc != NULL)
{
const long ndoc = d.get_long(DOC_NDOC);
TToken_string key;
key.add(orig_doc->get(DOC_PROVV));
key.add(orig_doc->get(DOC_ANNO));
key.add(orig_doc->get(DOC_CODNUM));
key.add(orig_doc->get(DOC_NDOC));
TDocumento& father_doc = cached_doc(key);
const TRectype* row = r.find_original_rdoc();
if (row != NULL)
{
const TRiga_documento & father_row = father_doc[row->get_int(RDOC_NRIGA)];
const real ordinato(father_row.get(name));
TString query("USE RDOC KEY 4 SELECT NDOC!=");
const int anno = r.get_int(RDOC_DAANNO);
const TString4 & codnum = r.get(RDOC_DACODNUM);
const long numdoc = r.get_long(RDOC_DANDOC);
TString select;
select << " DAPROVV='" << r.get(RDOC_DAPROVV) << "'";
select << " DAANNO='" << r.get(RDOC_DAANNO) << "'";
select << " DACODNUM='" << r.get(RDOC_DACODNUM) << "'";
select << " DANDOC='" << r.get(RDOC_DANDOC) << "'";
select << " DAIDRIGA='" << r.get(RDOC_DAIDRIGA) << "'";
query << ndoc ;
query << "\nFROM " << select;
query << "\nTO " << select;
TISAM_recordset recset(query);
real evaso;
for (bool ok = recset.move_first(); ok ; ok = recset.move_next())
evaso += recset.get(name).as_real();
const int doc_rows = d.physical_rows();
for (int i = 1; i <= doc_rows; i++)
{
if (i != nrow)
{
const TRiga_documento & row = d[i];
if (r.get(RDOC_CODART) == row.get(RDOC_CODART))
evaso += row.get_real(name);
}
}
const real residuo = ordinato - evaso;
if (residuo < qta)
{
if (!yesno_box(FR("La quantità %s è superiore al residuo %s:\nsi desidera continuare ugualmente?"),
qta.stringa(), residuo.stringa()))
{
if (!f.mask().is_running())
{
m.set_focus_field(F_SHEET);
sf.post_select(nrow - 1);
}
return false;
}
else
if (!f.mask().is_running())
m.set_focus_field(F_SHEET);
}
}
}
}
if (f.dlg() == FR_QTA)
return qtaart_handler(f, key);
return true;
}
bool distinta_link_handler(TMask_field& f, KEY key )
{
if (key == K_F8)
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
TFilename tempfile;
TCodice_articolo codart(row_mask.get(FR_CODART));
const bool exist = !cache().get(LF_DIST, codart).empty();
tempfile.temp("ve0");
tempfile.ext("ini");
{
TConfig configfile(tempfile);
TString8 para;
para << LF_DIST;
configfile.set("Action", exist ? "Modify" : "Insert", "Transaction");
configfile.set("Mode", "R", "Transaction");
configfile.set("CODDIST", codart, para);
}
TString commandline;
commandline.format("db0 -4 /i%s",(const char*)tempfile);
TExternal_app db(commandline);
db.run();
remove_file(tempfile);
TDocumento_mask & m = (TDocumento_mask & )sh.mask();
const TDocumento & d = m.doc();
const int row = sh.selected() + 1;
if (row < d.physical_rows() && d[row + 1].get_bool(RDOC_GENERATA))
return true;
}
return codart_handler( f, key);
}
bool gen_livelli_handler(TMask_field& f, KEY key )
{
if (key == K_F8 && f.get().blank())
{
TMask& row_mask = f.mask();
TSheet_field& sh = *row_mask.get_sheet();
TDocumento_mask & m = (TDocumento_mask & )sh.mask();
const TDocumento & d = m.doc();
const int row = sh.selected() + 1;
const int livello = f.dlg() - FR_LIV1;
const TRiga_documento & r = d[row];
TToken_string * str = r.tipo().genconf(livello);
if (str != NULL)
{
const TString codart = row_mask.get(FR_CODART);
if (codart.full())
{
TString code;
const TRectype & anamag = cache().get(LF_ANAMAG, codart);
const int items = str->items();
for (int i = 0; i < items; i++)
{
const TString & name = str->get(i);
if (name.starts_with("PROG"))
{
TTable mat(format("VE%1d", livello + 1));
const int chars = atoi(name.after("PROG"));
mat.put("CODTAB", code);
if (mat.read(_isequal) != NOERR)
{
mat.zero();
mat.put("CODTAB", code);
mat.write();
}
const int prog = mat.get_int("I0") + 1;
mat.put("I0", prog);
mat.rewrite();
TString s; s << prog; s.lpad(chars, '0');
code << s;
}
else
if (name.starts_with("33."))
{
TFieldref fld(name.after("33."), LF_DOC);
code << fld.read(d);
}
else
if (name.starts_with("34."))
{
TFieldref fld(name.after("34."), LF_RIGHEDOC);
code << fld.read(r);
}
else
if (name.starts_with("47."))
{
TFieldref fld(name.after("47."), LF_ANAMAG);
code << fld.read(anamag);
}
}
row_mask.set(f.dlg(), code, 0x3);
}
}
}
return true;
}
bool sottocat_conai_handler(TMask_field& f, KEY key )
{
if (key == K_F8)
{
const TString& codart = f.mask().get(FR_CODARTMAG);
const TArticolo& articolo = cached_article(codart);
const TCONAI_class type = conai_id2class(f.dlg());
const TFieldref fld(conai_sottocat_name(type, LF_ANAMAG), LF_ANAMAG);
f.set(fld.read(articolo));
}
return true;
}
bool peso_conai_handler(TMask_field& f, KEY key)
{
if (key == K_F8)
{
const TString& codart = f.mask().get(FR_CODARTMAG);
const TArticolo& articolo = cached_article(codart);
const TCONAI_class type = conai_id2class(f.dlg());
f.set(articolo.get(conai_peso_name(type, LF_ANAMAG)));
}
return true;
}
bool datacomp_handler(TMask_field& f, KEY key)
{
if (key == K_F8)
f.set(f.mask().get(F_DATADOC));
if (f.to_check(key, false) && !f.empty())
{
const TDate datadoc = f.mask().get_date(F_DATADOC);
const TEsercizi_contabili esc;
const int anno_doc = esc.date2esc(datadoc);
const TDate datacomp = f.get();
const int anno_comp = esc.date2esc(datacomp);
if (anno_doc != anno_comp)
return error_box("La data inizio competenza deve appartenere all'esercizio del documento!");
}
return true;
}
bool datafcomp_handler(TMask_field& f, KEY key)
{
if (f.to_check(key, false) && !f.empty())
{
const TDate datacomp = f.mask().get_date(F_DATACOMP);
const TDate datafcomp = f.get();
if (datafcomp < datacomp)
return error_box("La data fine competenza non puo' essere antecedente alla data inizio competenza!");
}
return true;
}
///////////////////////////////////////////////////////////
// Gestione note articolo
///////////////////////////////////////////////////////////
#if 0 && (_MSC_VER > 1300) // Dalla versione 10.x
#define NAR_TABLE "&VENAR"
#else // Versione 3.x
#define NAR_TABLE "NAR"
#endif
class TNar_mask : public TAutomask
{
static TMask* _doc_mask;
static char _tipocf;
static long _codcf;
static TString4 _tipodoc;
static TCodice_articolo _codart;
static bool nar_filter(const TRelation* rel);
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
int add_nota(const TRectype& curr, TSheet_field& sht);
public: // virtual methods
virtual void open(); // : TMask : TWindow
virtual void close(); // : TMask : TWindow
public:
void set_doc_mask(TMask& docmask) { _doc_mask = &docmask; }
int find_note();
TNar_mask();
};
TMask* TNar_mask::_doc_mask = NULL;
char TNar_mask::_tipocf = ' ';
long TNar_mask::_codcf;
TString4 TNar_mask::_tipodoc;
TCodice_articolo TNar_mask::_codart;
void TNar_mask::open()
{
RCT rctd; xvt_vobj_get_client_rect(_doc_mask->win(), &rctd);
RCT rctn; xvt_vobj_get_client_rect(win(), &rctn);
const short dx = rctd.right - (rctn.right-rctn.left) - 4;
const short dy = 4;
xvt_rect_offset(&rctn, dx-rctn.left, dy-rctn.top);
xvt_vobj_move(win(), &rctn);
TAutomask::open();
_running = true;
}
void TNar_mask::close()
{
TAutomask::close();
_running = false;
}
bool TNar_mask::nar_filter(const TRelation* rel)
{
const TString& codtab = rel->curr().get("S0");
const char r_tipocf = codtab[0]; // C/F
if (r_tipocf > ' ' && r_tipocf != _tipocf) // Considera solo le note cliente/fornitore compatibili
return false;
const long r_codcf = atol(codtab.mid(1,6));
if (r_codcf > 0 && r_codcf != _codcf)
return false; // Scarta i clienti diversi da quello sulla maschera
TString4 r_tipod = codtab.mid(7, 4);
if (r_tipod.full())
{
r_tipod.rtrim();
if (r_tipod != _tipodoc)
return false; // Scarta i tipi documento diversi da quello sulla maschera
}
const TString& codart = codtab.mid(11);
return codart.blank() || codart == _codart;
}
int TNar_mask::add_nota(const TRectype& curr, TSheet_field& sht)
{
TToken_string nota;
char sn[4] = "S0";
for (int s = 1; s <= 3; s++)
{
sn[1] = '0' + s;
const TString& esse = curr.get(sn);
if (esse.full())
nota << esse << ' ';
}
const bool done = nota.full();
int found = 0;
if (done)
{
nota.strip_double_spaces();
TString8 tipo;
tipo << 'X' << nota.separator();
if (atol(curr.get("S0").mid(1,6)) > 0)
{
tipo << 'C';
found |= 1;
}
if (curr.get("S0").mid(7,4).full())
{
tipo << 'T';
found |= 2;
}
if (curr.get("S0").mid(11).full())
{
tipo << 'A';
found |= 4;
}
tipo << nota.separator();
nota.insert(tipo, 0);
const int n = sht.insert(-1, false, true);
sht.row(n) = nota;
sht.set_row_height(n, 2*CHARY);
}
return found;
}
static int notes_compare(TSheet_field& s, int r1, int r2)
{
TToken_string order = "C|T|CT|A|CA|TA|CTA";
const char* c1 = s.row(r1).get(1);
const char* c2 = s.row(r2).get(1);
const int i1 = order.get_pos(c1);
const int i2 = order.get_pos(c2);
int cmp = i1 - i2;
if (cmp == 0)
cmp = r1 - r2;
return cmp;
}
int TNar_mask::find_note()
{
TSheet_field& ss = _doc_mask->sfield(F_SHEET);
const int sel = ss.selected();
if (sel >= 0)
{
_tipocf = _doc_mask->get(F_TIPOCF)[0];
_codcf = _doc_mask->get_long(F_CODCF);
_tipodoc = _doc_mask->get(F_TIPODOC);
_codart = ss.row(sel).get(ss.cid2index(FR_CODART));
}
else
_codart.cut(0);
TSheet_field& sheet = sfield(N_NOTES);
sheet.destroy();
int found = 0;
if (_codart.full() || !ss.empty())
{
TRelation rel(NAR_TABLE);
TCursor cur(&rel, "", 2);
cur.set_filterfunction(nar_filter);
const TRecnotype items = cur.items();
if (items > 0)
{
cur.freeze();
for (cur = 0L; cur.pos() < items; ++cur)
found |= add_nota(cur.curr(), sheet);
sheet.sort(notes_compare);
}
}
sheet.force_update();
return found;
}
bool TNar_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case DLG_FINDREC:
if (e == fe_button)
{
TRelation rel(NAR_TABLE);
TCursor cur(&rel, "", 2);
TRectype& curr = rel.curr();
bool update = false;
_tipocf = _doc_mask->get(F_TIPOCF)[0];
_codcf = _doc_mask->get_long(F_CODCF);
_tipodoc = _doc_mask->get(F_TIPODOC);
_codart.cut(0); // Nessun codice articolo corrente
cur.set_filterfunction(nar_filter);
TCursor_sheet as(&cur, "CODTAB|S0[1,1]|S0[2,7]|S0[8,11]|S0[12,31]|S1", TR("Note articolo"),
HR("Codice Nota@20|C/F|Codice|Tipo|Articolo@20|Note@50"), 0x3, 1, parent());
switch (as.run())
{
case K_ENTER:
cur = as.selected();
update = true;
break;
case K_CTRL+'G':
cur = as.selected();
update = curr.edit();
if (update)
cur = as.selected(); // Aggiorna valori editati esternamente
break;
case K_INS:
rel.file().zero(); // Usa azzeramento avanzato che funziona anche per tabelle di modulo
curr.edit();
break;
default:
break;
}
if (update)
{
TSheet_field& ns = sfield(N_NOTES); // Sheet delle note articolo
ns.destroy();
if (add_nota(curr, ns))
{
ns.force_update();
open();
}
}
}
break;
case DLG_NEWREC:
if (e == fe_button)
{
TRelation rel(NAR_TABLE); // Lascio a rel l'onere di decidere se TAB o TABMOD
rel.curr().edit();
}
break;
case DLG_SAVEREC:
if (e == fe_button)
{
TSheet_field& ns = sfield(N_NOTES); // Sheet delle note articolo
TString note;
FOR_EACH_SHEET_ROW(ns, n, row) if (row->get_char(0) > ' ') // For each checked row
note << row->get(2) << '\n';
if (note.full())
{
const TString4 tiporiga = _doc_mask->get(F_LBTIPORIGA); // Memorizza tipo riga
_doc_mask->set(F_LBTIPORIGA, "05"); // Impone riga descrizione
TSheet_field& ss = _doc_mask->sfield(F_SHEET); // Sheet delle righe documento
int i = ss.selected() + (get(N_WHERE)=="A" ? 1 : 0); // Inserisci prima o dopo?
i = ss.insert(i, false, true); // Crea nuova riga descrizione
ss.row(i).add(note.trim(), ss.cid2index(FR_DESCR)); // Copia descrizione dal memo
ss.force_update(); // Aggiorna sheet
_doc_mask->set(F_LBTIPORIGA, tiporiga); // Ripristina tipo riga
}
}
break;
default:
if (e == fe_button && is_open())
close();
break;
}
return true;
}
TNar_mask::TNar_mask() : TAutomask("ve0100n")
{
_doc_mask = NULL;
}
bool nar_handler(TMask_field& f, KEY key)
{
static TNar_mask* nw = NULL;
switch (key)
{
case K_SPACE:
if (nw == NULL)
nw = new TNar_mask;
nw->set_doc_mask(f.mask());
nw->open();
break;
case K_ESC:
case K_ENTER:
if (nw != NULL && nw->is_open())
nw->close();
break;
case K_F8:
if (xvt_vobj_is_focusable(f.parent()))
{
if (nw == NULL)
nw = new TNar_mask;
nw->set_doc_mask(f.mask());
TButton_field& btn = (TButton_field&)f;
const int found = nw->find_note();
if (found >= 4)
btn.set_bmp(1203); else
if (found >= 2)
btn.set_bmp(1116); else
if (found >= 1)
btn.set_bmp(1204);
else
btn.set_prompt(PR("Note"));
}
break;
default:
break;
}
return true;
}