#include #include #include #include #include #include #include #include #include #include #include #include #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 "../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 smart_hndl( TMask_field& field, KEY key ) { if (key == K_SPACE) { TDocumento_mask & m = (TDocumento_mask &) field.mask(); TSmart_card * s = m.smartcard(); if (s != NULL) { smartcard_error err = s->connect_card(); if (err == no_smarterror) err = s->check_key(m); if (err == no_smarterror) { s->card2mask(m); if (s->with_card(m)) m.enable(DLG_SAVEREC); m.disable(F_CODCF); m.disable(F_RAGSOC); } else { s->display_error(err); if (err == new_card) if (m.get(F_CODCF).empty() && m.field(F_CODCF).on_key(K_F9) == false) { s->disconnect_card(); return false; } } } } else if (key == K_ENTER) { TDocumento_mask & m = (TDocumento_mask &) field.mask(); TSmart_card * s = m.smartcard(); if (s != NULL && s->card_connected()) { s->mask2card(m); smartcard_error err = s->write(); if (err != no_smarterror) s->display_error(err); if (m.insert_mode() && m.doc().codice_numerazione().save_and_new()) s->disconnect_card(); } } return true; } bool fido_hndl(TMask_field& field, KEY key) { if (key == K_ENTER && !field.empty()) { TDocumento_mask & m = (TDocumento_mask &) field.mask(); const real fido_bau(field.get()); const char tipocf = m.get(F_TIPOCF)[0]; const long codcf = m.get_long(F_CODCF); const TDate& datadoc = m.get_date(F_DATADOC); const int riskdays = ini_get_int(CONFIG_DITTA, "ve", "FIDO_RISKDAYS"); 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 (tipocf, codcf, datadoc, riskdays); //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 ora_hndl( TMask_field& field, KEY key ) { if (field.to_check(key,true)) { TString16 ora; if (field.automagic() && field.get().empty()) { struct tm* t = xvt_time_now(); ora.format("%02d%02d", t->tm_hour, t->tm_min); field.set((ora)); } else { ora = field.get(); if (ora.not_empty()) { if (!isdigit(ora[0]) || !isdigit(ora[1]) || !isdigit(ora[2]) || !isdigit(ora[3]) || atoi(ora.left(2)) > 23 || atoi(ora.mid(2)) > 59) return error_box(TR("Ora errata")); } else if (field.required()) return error_box(TR("Ora obbligatoria")); } } return true; } bool dummy_hndl(TMask_field& field, KEY key) { warning_box(FR("Al campo %d è arrivato un 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())) { const TString& condpag = m.get(F_CODPAG); if (condpag.not_empty()) { 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); } } } 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 { // 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); } 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); } 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 e' 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("Il codice IVA e' 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 TString16 old_tipo_riga = docmask.doc()[curr_row + 1].get(RDOC_TIPORIGA); const TString16 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); sf->force_update(curr_row); } else { f.set(old_tipo_riga); return f.error_box("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 = new TRelation(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); 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); 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-", 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 (strcmp(fieldname, "RESIDUO") == 0) { TString & value = get_tmp_string(80); 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())) { 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; 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); 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"); TString desc; 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); 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.not_empty()) { TLocalisamfile deslin(LF_DESLIN); deslin.setkey(2); deslin.put(DESLIN_CODART, codart); deslin.put(DESLIN_CODLIN, lingua); if (deslin.read() == NOERR) { static int __lingua_only = 3; if (__lingua_only > 2) { TConfig c(CONFIG_DITTA, "ve"); __lingua_only = c.get_bool("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 = 1.0; } row_mask.set(FR_UMQTA, curr_um); upd_colli_peso_tara(row_mask, codart); } condv.ricerca(); 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)); 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(TR("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, "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(); 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 int r = s.selected(); const bool merce = TRiga_documento::tipo(m.get(FR_TIPORIGA)).is_merce(); const bool artmag = merce && f.get().full(); m.show(FR_UMQTA, artmag); m.show(FR_UMQTA2, !artmag); 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(1.0); 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 = 1.0; } 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); 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 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 TString16 um(f.get()); real fc(1.0); 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 TString16 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"); const TString16 umsrif1(ums.get("S7")); if (fc1 > ZERO) { if (curr_um == umsrif1) fc = 1 / fc1; else if (umsrif0 == ums.get("S7")) fc = fc0 / ums.get_real("R10"); } } } 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 TString16 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()) { real giac(mask.get(F_CURGIAC)); if (giac < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione giacenza negativa, Devo continuare ?")) return false; } else if (doc.tipo().check_disp()) { real disp(mask.get(F_CURDISP)); if (disp < -(c.sgn(s_giac) * qta) && !yesno_box("Attenzione disponibilita' negativa, Devo 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); const bool controeuro = mask.get_bool(F_CONTROEURO); sppr_calc(sp, doc_valuta, cambio, prezzo, controeuro ? _exchange_contro : _exchange_base); 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"); TRectype& filtrec = rel.curr(); filtrec.put(DOC_TIPOCF, m.get(F_TIPOCF)); filtrec.put(DOC_CODCF, m.get(F_CODCF)); TSorted_cursor cur(&rel, "TIPOCF|CODCF|PROVV|ANNO|CODNUM|NUMDOCRIF", "", 2, &filtrec, &filtrec); TString80 filter; filter.format("(CODNUM==\"%s\")&&(PROVV==\"D\")&&(ANNO==\"%d\")", (const char*)m.get(F_CODNUM), m.get_int(F_ANNO)); cur.setfilter(filter); TToken_string siblings; TToken_string header(HR("Codice|Ragione Sociale@50|Docum.Rif.|Data@10|Docum.Rif. 1|Docum.Rif. 2|Docum.Rif. 3|Documento|Data\nDocumento@10|Totale\nDocumento@18V|Valuta|Stato")); TToken_string fieldlist("CODCF|20->RAGSOC|NUMDOCRIF|DATADOCRIF|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); 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 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(); short i, first_fld, last_fld; const int lffile = cdc ? LF_CDC : LF_COMMESSE; const TMultilevel_code_info & info = ca_multilevel_code_info(lffile); TString80 cod; last_fld = f.dlg(); first_fld = last_fld - info.levels() + 1; for (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 (i = first_fld; i <= last_fld; i++) cod << mask.get(i); } const TRectype & rec = cache().get(lffile, cod); const TString16 codmag = rec.get("CODMAG"); if (codmag.not_empty()) { 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()) || key == K_ENTER) { ca_mag_handler(f, false); TMask & m = f.mask(); const TSheet_field & s = *m.get_sheet(); TDocumento_mask & mask = (TDocumento_mask & )s.mask(); const TRectype & curr = m.efield(mask.cms_start_sh()).browse()->cursor()->curr(); const TString codcms = curr.get(COMMESSE_CODCMS); if (mask.codcms_sh() != codcms) // Cambio commessa { mask.codcms_sh() = codcms; const TString 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) { TDocumento_mask& mask = (TDocumento_mask&)f.mask(); const TRectype& curr = mask.efield(mask.cms_start()).browse()->cursor()->curr(); const TString codcms = curr.get(COMMESSE_CODCMS); if (f.to_check(key, TRUE)) mask.set(F_CMSH, 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) { TDocumento & doc = mask.doc(); TSheet_field & sf = mask.sfield(F_SHEET); const int rows = doc.physical_rows(); doc.put(DOC_CODCMS, codcms); for (int r = 1; r <= rows; r++) { TRiga_documento & riga = doc[r]; 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.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())) { TDocumento & doc = mask.doc(); if (!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.put(DOC_SPESEUPD, ""); doc.update_spese_aut(spese, false, &mask.sfield(F_SHEET)); } } } if (main_app().has_module(CUAUT) && (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)); } } } 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 quantita' %s e' superiore al residuo %s,\nvuoi 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); 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)) { const TDate datadoc = f.mask().get_date(F_DATADOC); const TEsercizi_contabili es_doc; int anno_doc = es_doc.date2esc(datadoc); const TDate datacomp = f.get(); const TEsercizi_contabili es_comp; int anno_comp = es_comp.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)) { 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); bool 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; } bool show_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; } bool 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(); if (done) { nota.strip_double_spaces(); TString8 tipo; tipo << 'X' << nota.separator(); if (atol(curr.get("S0").mid(1,6)) > 0) tipo << 'C'; if (curr.get("S0").mid(7,4).full()) tipo << 'T'; if (curr.get("S0").mid(11).full()) tipo << 'A'; 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 done; } 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; } bool TNar_mask::show_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); close(); if (_codart.full()) { TRelation rel(NAR_TABLE); TCursor cur(&rel, "", 2); cur.set_filterfunction(nar_filter); const TRecnotype items = cur.items(); if (items > 0) { close(); cur.freeze(); const TRectype& curr = rel.curr(); TSheet_field& sheet = sfield(N_NOTES); sheet.destroy(); for (cur = 0L; cur.pos() < items; ++cur) add_nota(curr, sheet); sheet.sort(notes_compare); open(); sheet.force_update(); } } return is_open(); } 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()); } nw->show_note(); } break; default: break; } return true; }