From 572ff303d168425e42fcd1d4bc00afc497dc1db8 Mon Sep 17 00:00:00 2001 From: guy Date: Wed, 14 May 2014 08:32:23 +0000 Subject: [PATCH] Aggiunti handlers per stampe industriali git-svn-id: svn://10.65.10.50/branches/R_10_00@22945 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ve/ve0400.cpp | 11 +- ve/ve1100.cpp | 12 +- ve/ve6200.cpp | 24 +- ve/ve6200a.uml | 12 +- ve/velib.h | 6 +- ve/velib03.cpp | 18 +- ve/velib03a.cpp | 2 +- ve/velib04.cpp | 32 + ve/velib04.h | 2 + ve/velib06.cpp | 27 +- ve/velib06a.cpp | 7007 ++++++++++++++++++++++++----------------------- ve/vepriv.h | 2 + 12 files changed, 3646 insertions(+), 3509 deletions(-) diff --git a/ve/ve0400.cpp b/ve/ve0400.cpp index 15ab45d7b..1ea413dd1 100755 --- a/ve/ve0400.cpp +++ b/ve/ve0400.cpp @@ -844,7 +844,7 @@ void TTRI_handlers_mask::mask2prof(TTipo_riga_documento & tipo) profile.set(RDOC_QTAEVASA, get(F_QTAEVASAR)); profile.set("QTA_MAG", get(F_QTAMAGR)); profile.set("QTAEVASA_MAG", get(F_QTAEVASAMAGR)); - profile.set("LIVGEN", get(F_LIVGEN1), NULL, true, 1); + profile.set("LIVGEN", get(F_LIVGEN1), NULL, true, 1); profile.set("LIVGEN", get(F_LIVGEN2), NULL, true, 2); profile.set("LIVGEN", get(F_LIVGEN3), NULL, true, 3); profile.set("LIVGEN", get(F_LIVGEN4), NULL, true, 4); @@ -859,24 +859,19 @@ void TTRI_handlers_mask::mask2prof(TTipo_riga_documento & tipo) for (int i = 0 ; i < 10; i++) profile.remove(format("%d", i)); - - TSheet_field & sh = sfield(F_HANDLERSR); - + TSheet_field& sh = sfield(F_HANDLERSR); FOR_EACH_SHEET_ROW(sh, r, row) { const short id = row->get_int(1); - profile.set("Handler", row->get_int(0), NULL, true, id); } profile.set_paragraph("DEFAULT"); profile.remove_array("Default"); - TSheet_field & sd = sfield(F_DEFAULTSR); - + TSheet_field& sd = sfield(F_DEFAULTSR); FOR_EACH_SHEET_ROW(sd, dr, drow) { const short id = drow->get_int(0); - profile.set("Default", drow->get(), NULL, true, id); } } diff --git a/ve/ve1100.cpp b/ve/ve1100.cpp index 23b77421a..71d70f80f 100755 --- a/ve/ve1100.cpp +++ b/ve/ve1100.cpp @@ -1458,10 +1458,9 @@ void TStampaDoc_application::print_selected(KEY k) int ncopie = _ncopie <= 0 ? mainform->ncopie() : _ncopie; // Numero di copie da stampare per questo documento if (ncopie <= 0) ncopie = 1; + TDocumentoEsteso& extdoc = mainform->doc(); for (int n=0; n < ncopie; n++) - { - TDocumentoEsteso& extdoc = mainform->doc(); - + { print_documento(*mainform); extdoc.summary_reset(); extdoc.scadenze_reset(); @@ -1497,7 +1496,12 @@ void TStampaDoc_application::print_selected(KEY k) } // Totalizza gli importi per eventuale stampa su FAKETOTFLD - totdocumenti += mainform->doc().totale_doc(); + const real tot = extdoc.totale_doc(); + if (extdoc.is_nota_credito()) + totdocumenti -= tot; + else + totdocumenti += tot; + if (i == items - 1 && mainform->is_faketotfld()) { mainform->hide_sections(); diff --git a/ve/ve6200.cpp b/ve/ve6200.cpp index 9081ee583..b5f392cef 100755 --- a/ve/ve6200.cpp +++ b/ve/ve6200.cpp @@ -83,7 +83,7 @@ void TFatturazione_bolle_app::process_by_cli(const TMask& m) for (int c = 0; c < tot_cli && !iw.iscancelled(); c++) { const long codcli = clienti[c]; // Codice cliente in esame - msg = "Elaborazione dei documenti del cliente "; + msg = TR("Elaborazione documenti del cliente "); msg << codcli << " ..."; iw.set_text(msg); // Messaggio sul cliente do_events(); // Attende visualizzazione @@ -92,6 +92,8 @@ void TFatturazione_bolle_app::process_by_cli(const TMask& m) din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an); if (din.items() > 0 && !iw.iscancelled()) { + if (m.get(F_ORDINAMENTO) == "Z") + din.sort(DOC_ZONA"|"DOC_DATADOC"|"DOC_NDOC); bool ok = process(iw, eld, din, data_elab); if (!ok) // In caso di errore termina qui l'elaborazione. break; @@ -135,7 +137,7 @@ void TFatturazione_bolle_app::process_by_ragsoc(const TMask& m) for (int c = 0; c < tot_cli && !iw.iscancelled(); c++) { const long codcli = clienti[c]; // Codice cliente in esame - msg = "Elaborazione dei documenti del cliente "; + msg = TR("Elaborazione documenti del cliente "); msg << codcli << " ..."; iw.set_text(msg); // Messaggio sul cliente do_events(); // Attende visualizzazione @@ -144,6 +146,8 @@ void TFatturazione_bolle_app::process_by_ragsoc(const TMask& m) din.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an); if (din.items() > 0 && !iw.iscancelled()) { + if (m.get(F_ORDINAMENTO) == "Z") + din.sort(DOC_ZONA"|"DOC_DATADOC"|"DOC_NDOC); bool ok = process(iw, eld, din, data_elab); if (!ok) // In caso di errore termina qui l'elaborazione. break; @@ -190,16 +194,13 @@ void TFatturazione_bolle_app::process_by_doc(const TMask& m) for (int c = 0; c < tot_cli && !iw.iscancelled(); c++) { const long codcli = clienti[c]; // Codice cliente in esame - msg = TR("Elaborazione dei documenti del cliente"); + msg = TR("Elaborazione documenti del cliente"); msg << ' ' << codcli << "..."; iw.set_text(msg); // Messaggio sul cliente do_events(); // Attende visualizzazione - if (codcli == 203726) - int cazzone = 1; - + TLista_documenti list; - list.read('D', tipocf, codcli, anno, tipidoc, statidoc, dd, ad, codnum, dn, an); for (int i = list.items()-1; i >= 0; i--) @@ -227,7 +228,11 @@ void TFatturazione_bolle_app::process_by_doc(const TMask& m) din.add(list[j]); } if (din.items() > 0 && !iw.iscancelled()) - bool ok = process(iw, eld, din, data_elab); + { + if (m.get(F_ORDINAMENTO) == "Z") + din.sort(DOC_ZONA"|"DOC_DATADOC"|"DOC_NDOC); + process(iw, eld, din, data_elab); + } delete e; } @@ -372,7 +377,8 @@ void TFatturazione_bolle_app::main_loop() cfg.set("FATBOLSEL", _default_selection = select_from); } - if (m.get(F_ORDINAMENTO) == "R") + const TString& orderby = m.get(F_ORDINAMENTO); + if (orderby == "R") process_by_ragsoc(m); else { diff --git a/ve/ve6200a.uml b/ve/ve6200a.uml index 4941f97d8..fa7c2d089 100755 --- a/ve/ve6200a.uml +++ b/ve/ve6200a.uml @@ -71,22 +71,22 @@ END RADIOBUTTON F_ORDINAMENTO 20 BEGIN PROMPT 3 5 "@bOrdinamento per" - ITEM "C|Clienti" + ITEM "C|Cliente" MESSAGE ENABLE,1@|CLEAR,2@|CLEAR,3@|CLEAR,4@ - ITEM "R|Ragione Soc.Clienti" + ITEM "R|Ragione Sociale" MESSAGE CLEAR,1@|CLEAR,2@|CLEAR,3@|ENABLE,4@ - ITEM "A|Agenti" + ITEM "A|Agente" MESSAGE CLEAR,1@|ENABLE,2@|CLEAR,3@|CLEAR,4@ - ITEM "Z|Zone" + ITEM "Z|Zona" MESSAGE CLEAR,1@|CLEAR,2@|ENABLE,3@|CLEAR,4@ END RADIOBUTTON F_ORDINAMENTO_2 20 BEGIN PROMPT 3 5 "@bSelezione per" - ITEM "A|Agenti" + ITEM "A|Agente" MESSAGE ENABLE,1@|ENABLE,2@|CLEAR,3@|COPY,F_ORDINAMENTO - ITEM "Z|Zone" + ITEM "Z|Zona" MESSAGE ENABLE,1@|CLEAR,2@|ENABLE,3@|COPY,F_ORDINAMENTO FLAGS "H" END diff --git a/ve/velib.h b/ve/velib.h index a154ad437..1e9e27399 100755 --- a/ve/velib.h +++ b/ve/velib.h @@ -72,7 +72,7 @@ class TCond_vendita; class TIVA_array; class TArticolo_giacenza; class TCache_articoli; -class TSmart_card; +// class TSmart_card; bool ora_hndl(TMask_field& field, KEY key); bool totdoc_hndl(TMask_field& field, KEY key); @@ -963,7 +963,7 @@ class TDocumento_mask : public TVariable_mask // velib06 bool _ges_mag, _ges_dep, _ges_ca; TString8 _std_mag, _std_dep; real _fconv_qta; - TSmart_card * _smartcard; + // TSmart_card * _smartcard; Cassato il macchinaro static TAssoc_array _father_rows; static TAssoc_array _auto_reopen_nums; static TAssoc_array _tipidoc_rels; @@ -1064,7 +1064,7 @@ public: const real & fconv_qta() const { return _fconv_qta;} bool is_calculated_page(int p) const { return _calculated_pages[p]; } - TSmart_card* smartcard() const { return _smartcard;} + // TSmart_card* smartcard() const { return _smartcard;} bool show_note_articolo(const TString& codart); short cdc_start() const { return _cdc_start;} diff --git a/ve/velib03.cpp b/ve/velib03.cpp index 5463ea3aa..68fab85f0 100755 --- a/ve/velib03.cpp +++ b/ve/velib03.cpp @@ -863,7 +863,7 @@ void TDocumento::set_riga_sconto() { _tipo_riga_sc = "08"; conf.set("TRSCONTI", _tipo_riga_sc); - warning_box(FR("Il tipo riga sconti di testa non risultava impostato.\n L'applicazione userà automaticamente il tipo %s"), (const char*) _tipo_riga_sc); + warning_box(FR("Il tipo riga sconti di testa non risultava impostato.\nL'applicazione userà automaticamente il tipo %s"), (const char*) _tipo_riga_sc); } } _sconto = new TRiga_documento(this, _tipo_riga_sc); @@ -1710,15 +1710,19 @@ void TDocumento::calc_provvigione(TProvvigioni_agente & provv, const TString & k // Crea le nuove rate provvigionali const bool isnew = provv.items() == 0; // Il documento non ha righe provvigionali - TRate_doc& rd = provv.rate(anno, codnum, ndoc, isnew ? true : FALSE); + TRate_doc& rd = provv.rate(anno, codnum, ndoc, isnew); // A questo punto rd e' vuoto: settiamo i dati del documento: + const int ndec = tot_doc.decimals(); + TToken_string t; - t.add(anno); t.add(codnum);t.add(ndoc); - t.add(datadoc.string()); t.add(tot_doc.string()); - t.add(tot_provv.string());t.add(tot_netto.string()); + t.add(anno); t.add(codnum); t.add(ndoc); t.add(datadoc.string()); + t.add(tot_doc.get_num().string(-1, ndec)); + t.add(tot_provv.get_num().string(-1, ndec)); + t.add(tot_netto.get_num().string(-1, ndec)); t.add(codcf()); - t.add(TDocumento::valuta());t.add(change.string()); + t.add(TDocumento::valuta()); + t.add(change.string()); t.add(get(DOC_DATACAMBIO)); rd.set(t); @@ -1736,7 +1740,7 @@ void TDocumento::calc_provvigione(TProvvigioni_agente & provv, const TString & k if (nrate == 1 && is_anticipo) // significa che l'anticipo paga tutto ora, quindi provv_fat vale tutta la provvigione del documento provv_fat = tot_provv; - const bool first_rata_ok = provv_fat.get_num() != ZERO; + const bool first_rata_ok = !provv_fat.is_zero(); // Impostazione prima rata solo se la provvigione sul fatturato è diversa da 0 if (first_rata_ok) diff --git a/ve/velib03a.cpp b/ve/velib03a.cpp index 77ce15657..c1e59443f 100755 --- a/ve/velib03a.cpp +++ b/ve/velib03a.cpp @@ -299,7 +299,7 @@ const TPointer_array& TTipo_documento::handlers() const break; default: break; } - if (id > 100 && id < 1000 && hnd > 0) + if (id > 10 && id < 1000 && hnd > 0) ((TPointer_array&)_handlers).add_long(hnd, id); } } diff --git a/ve/velib04.cpp b/ve/velib04.cpp index 1c644c0b0..7c8db4ef1 100755 --- a/ve/velib04.cpp +++ b/ve/velib04.cpp @@ -182,6 +182,38 @@ int TLista_documenti::write(bool re) const return err; } +static int doc_cmp(const TSortable& o1, const TSortable& o2, void* jolly) +{ + const TDocumento& d1 = (const TDocumento&)o1; + const TDocumento& d2 = (const TDocumento&)o2; + TToken_string& order_by = *(TToken_string*)jolly; + + int cmp = 0; + FOR_EACH_TOKEN(order_by, fld) + { + const TFieldtypes ft = d1.type(fld); + switch(ft) + { + case _intfld : + case _longfld : + case _intzerofld : + case _longzerofld: cmp = d1.get_long(fld) - d2.get_long(fld); break; + case _datefld : cmp = d1.get_date(fld) - d2.get_date(fld); break; + default : cmp = d1.get(fld).compare(d2.get(fld), -1, true); break; + } + if (cmp != 0) + break; + } + return cmp; +} + +int TLista_documenti::sort(const char* fields) +{ + TToken_string orderby = fields; + _documenti.sort(doc_cmp, &orderby); + return items(); +} + /////////////////////////////////////////////////////////// // TLista_clifo /////////////////////////////////////////////////////////// diff --git a/ve/velib04.h b/ve/velib04.h index 5405db0fb..27dbb98e8 100755 --- a/ve/velib04.h +++ b/ve/velib04.h @@ -42,6 +42,8 @@ public: TDocumento& operator[] (int n) { return (TDocumento&)_documenti[n]; } int items() const { return _documenti.items(); } + int sort(const char* fields); // token string of field names + TLista_documenti() { } virtual ~TLista_documenti() {}; }; diff --git a/ve/velib06.cpp b/ve/velib06.cpp index c6f63e201..7246720cd 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -4,7 +4,7 @@ #include #include #include -#include +// #include // Cassato il macchinaro #include #include #include @@ -89,7 +89,7 @@ TCONAI_class conai_id2class(short id) /////////////////////////////////////////////////////////// TDocumento_mask::TDocumento_mask(const char* td) - : TVariable_mask(), _progs_page(-1), _condv(NULL), _smartcard(NULL), + : TVariable_mask(), _progs_page(-1), _condv(NULL), //_smartcard(NULL), _cms_start(-1), _cms_end(-1), _cms_start_sh(-1), _cms_end_sh(-1), _cdc_start(-1), _cdc_end(-1), _cdc_start_sh(-1), _cdc_end_sh(-1) { @@ -107,7 +107,6 @@ TDocumento_mask::TDocumento_mask(const char* td) read_mask(mname, 0, MAX_PAGES); _sheet = &sfield(F_SHEET); - //_sheet->set_handler( ss_handler ); set_field_handler(F_SHEET, ss_handler ); _sheet->set_notify( ss_notify ); _sheet->set_append(FALSE); @@ -475,8 +474,7 @@ TDocumento_mask::~TDocumento_mask() delete _condv; if (_livelli_giac) delete _livelli_giac; - if (_smartcard) - delete _smartcard; + // if (_smartcard) delete _smartcard; // cassato il macchinaro } int TDocumento_mask::insert_anal_fields(TMask& m, int page, int lf, int& y, @@ -804,7 +802,8 @@ void TDocumento_mask::next_page(int p) } void TDocumento_mask::start_run() -{ +{ + /* cassato il macchinaro TSmart_card * s = smartcard(); if (s != NULL) @@ -826,6 +825,7 @@ void TDocumento_mask::start_run() s->display_error(err); } } + */ TVariable_mask::start_run(); } @@ -833,6 +833,7 @@ bool TDocumento_mask::stop_run(KEY key) { if (key != K_ESC && key != K_QUIT) update_progs(true); +/* Cassato il macchinaro else if (key == K_ESC) { @@ -848,7 +849,7 @@ bool TDocumento_mask::stop_run(KEY key) } } } - +*/ return TVariable_mask::stop_run(key); } @@ -865,10 +866,12 @@ bool TDocumento_mask::on_key(KEY key) stato.enable(); enable(DLG_SAVEREC); enable(DLG_DELREC); - TSmart_card * s = smartcard(); xvtil_statbar_set(TR("Modifica")); +/* + TSmart_card * s = smartcard(); if (s != NULL && s->card_connected()) s->enable_prot_fields(*this); +*/ } else warning_box("L'utente %s non puo' modificare questo documento", @@ -3756,6 +3759,7 @@ void TDocumento_mask::user_set_handler(short fieldid, int index) case 2: set_field_handler(fieldid, totdoc_hndl); break; case 3: set_field_handler(fieldid, numdocrif_hndl); break; case 4: + /* Cassato il macchinaro! _smartcard = new TSmart_card(); if (_smartcard->type() != no_smartcard) { @@ -3768,9 +3772,12 @@ void TDocumento_mask::user_set_handler(short fieldid, int index) delete _smartcard; _smartcard = NULL; } + */ break; - case 5: set_field_handler(fieldid, dummy_hndl); break; - case 6: set_field_handler(fieldid, fido_hndl); break; + case 5: set_field_handler(fieldid, dummy_hndl); break; + case 6: set_field_handler(fieldid, fido_hndl); break; + case 7: set_field_handler(fieldid, subappalto_hndl); break; + case 8: set_field_handler(fieldid, reportba8_hndl); break; default: break; } } diff --git a/ve/velib06a.cpp b/ve/velib06a.cpp index 75fb428f9..2bd48e83c 100755 --- a/ve/velib06a.cpp +++ b/ve/velib06a.cpp @@ -1,3461 +1,3546 @@ -#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 "../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 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()) - { - 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 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())) - { - 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); - } - } - } - 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 - if (key == K_TAB && m.id2pos(F_IVAXCASSA) > 0) - { - TDate d = field.get(); - if (!d.ok()) d = TODAY; - m.enable(F_IVAXCASSA, gestione_IVAxCassa(d)); - } - - 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 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); - - 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 (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())) - { - // 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 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 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.empty() || f.dlg() < mask.cms_end()) - return true; // Opera solo sull'ultimo livello del codice commessa - - const TRectype& curr = mask.efield(mask.cms_end()).browse()->cursor()->curr(); - const TString80 codcms = curr.get(COMMESSE_CODCMS); - - if (f.to_check(key, true)) - { - mask.set(F_CMSH, codcms); - if (curr.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) - { - 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(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 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); - 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; -} +#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 "../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; +} + +/* Cassato il macchinaro +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()) + { + 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())) + { + 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); + } + } + } + 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 + if (key == K_TAB && m.id2pos(F_IVAXCASSA) > 0) + { + TDate d = field.get(); + if (!d.ok()) d = TODAY; + m.enable(F_IVAXCASSA, gestione_IVAxCassa(d)); + } + + 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 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); + + 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 (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())) + { + // 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 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 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.empty() || f.dlg() < mask.cms_end()) + return true; // Opera solo sull'ultimo livello del codice commessa + + const TRectype& curr = mask.efield(mask.cms_end()).browse()->cursor()->curr(); + const TString80 codcms = curr.get(COMMESSE_CODCMS); + + if (f.to_check(key, true)) + { + mask.set(F_CMSH, codcms); + if (curr.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) + { + 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(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 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); + 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; +} diff --git a/ve/vepriv.h b/ve/vepriv.h index 30c123604..519692e8f 100755 --- a/ve/vepriv.h +++ b/ve/vepriv.h @@ -45,6 +45,8 @@ bool numdocrif_hndl(TMask_field& field, KEY key); bool smart_hndl(TMask_field& field, KEY key); bool fido_hndl(TMask_field& field, KEY key); bool nar_handler(TMask_field& f, KEY key); +bool subappalto_hndl(TMask_field& f, KEY key); +bool reportba8_hndl(TMask_field& f, KEY key); bool tipodoc_ok(const TString & tipodoc);