diff --git a/ve/ve0100b.uml b/ve/ve0100b.uml index 42de7b4bf..02df93576 100755 --- a/ve/ve0100b.uml +++ b/ve/ve0100b.uml @@ -7,7 +7,7 @@ BEGIN PROMPT -12 -1 "" END -BUTTON DLG_CANCEL 10 2 +BUTTON DLG_QUIT 10 2 BEGIN PROMPT -22 -1 "" END diff --git a/ve/velib04d.cpp b/ve/velib04d.cpp index 8eabb84de..e82859123 100755 --- a/ve/velib04d.cpp +++ b/ve/velib04d.cpp @@ -12,22 +12,25 @@ class TConsegna_mask : public TAutomask { + bool _ordina_per_codice; + protected: virtual bool on_field_event(class TOperable_field& f, TField_event e, long jolly); public: - void doc2mask(const TDocumento& doc); + void doc2mask(const TDocumento& doc, const TString & articolo); - TConsegna_mask() : TAutomask("velib04d") { } + TConsegna_mask(int header_code = 0, bool per_codice = FALSE); virtual ~TConsegna_mask() { } }; bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, long jolly) { + bool update_row = FALSE; switch (f.dlg()) { case S_QTADAEVADERE: - if (e == fe_modify) + if (e == fe_modify && jolly > 0) { TMask& m = f.mask(); const real qta_residua = m.get_real(S_QTARESIDUA); @@ -48,6 +51,20 @@ bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, lo m.set(S_RIGAEVASA, " "); m.enable(S_RIGAEVASA); } + update_row = !m.is_running(); + } + break; + case S_RIGAEVASA: + if (e == fe_modify && jolly > 0 && f.get().not_empty()) + { + TMask& m = f.mask(); + const real qta_daevadere = m.get(S_QTADAEVADERE); + if (qta_daevadere.is_zero()) + { + const TString& residuo = m.get(S_QTARESIDUA); + m.set(S_QTADAEVADERE, residuo, TRUE); + update_row = !m.is_running(); + } } break; case F_CONSEGNA: @@ -55,17 +72,19 @@ bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, lo { TSheet_field& s = sfield(F_ROWS); FOR_EACH_SHEET_ROW(s, n, row) - { - const real residuo = row->get(S_QTARESIDUA-FIRST_FIELD); - const real evaso = row->get(S_QTADAEVADERE-FIRST_FIELD); - if (evaso == ZERO && residuo > ZERO) - { - row->add(residuo.string(), S_QTADAEVADERE-FIRST_FIELD); - row->add("X", S_RIGAEVASA-FIRST_FIELD); - s.disable_cell(n, S_RIGAEVASA-FIRST_FIELD); + if (!s.cell_disabled(n,S_RIGACONSEGNATA-FIRST_FIELD)) + { + const real residuo = row->get(S_QTARESIDUA-FIRST_FIELD); + const real evaso = row->get(S_QTADAEVADERE-FIRST_FIELD); + + if (evaso == ZERO && residuo > ZERO) + { + row->add(residuo.string(), S_QTADAEVADERE-FIRST_FIELD); + row->add("X", S_RIGAEVASA-FIRST_FIELD); + s.disable_cell(n, S_RIGAEVASA-FIRST_FIELD); + } + row->add("X", S_RIGACONSEGNATA-FIRST_FIELD); } - row->add("X", S_RIGACONSEGNATA-FIRST_FIELD); - } s.force_update(); } break; @@ -74,11 +93,60 @@ bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, lo return FALSE; default:break; } + + if (update_row) + { + TSheet_field& s = sfield(F_ROWS); + const int riga = s.selected(); + s.update_row(riga); + s.force_update(riga); + } + return TRUE; } -void TConsegna_mask::doc2mask(const TDocumento& doc) +rows_sort_func(TSheet_field & s, int i, int j) { + TToken_string & s1 = (TToken_string & )(s.row(i)); + TToken_string & s2 = (TToken_string & )(s.row(j)); + TString ss1, ss2; + TDate dd1, dd2; + real rr1, rr2; + int fields[] = {S_CODART, S_LIVGIAC1, S_LIVGIAC2, S_LIVGIAC3, S_LIVGIAC4, + S_CODMAG, S_CODDEP, S_RIGAEVASA, S_DATACONS, S_QTARESIDUA, -1}; + int ret(0), field(0); + while (fields[field] >= 0) + { + if (fields[field] == S_QTARESIDUA) + { + s1.get(fields[field]-FIRST_FIELD, rr1); + s2.get(fields[field]-FIRST_FIELD, rr2); + ret = rr2 < rr1 ? -1 : (rr2 > rr1 ? 1 : 0); + } + else + { + s1.get(fields[field]-FIRST_FIELD ,ss1); + s2.get(fields[field]-FIRST_FIELD ,ss2); + if (fields[field] == S_DATACONS) + { + dd1 = ss1; + dd2 = ss2; + ret = int (dd1.date2ansi() - dd2.date2ansi()); + } + else + ret = ss1.compare(ss2); + } + if (ret != 0) + break; + field++; + } + return ret; +} + +void TConsegna_mask::doc2mask(const TDocumento& doc, const TString & articolo) +{ + TWait_cursor hourglass; + for (int n = fields()-1; n >= 0; n--) { TMask_field& f = fld(n); @@ -89,38 +157,84 @@ void TConsegna_mask::doc2mask(const TDocumento& doc) f.set(val); } } + + const bool show_evaded = doc.tipo().mostra_righe_evase_in_elaborazione(); + TSheet_field& s = sfield(F_ROWS); s.destroy(); const int rows = doc.physical_rows(); for (int i = 0; i < rows; i++) { const TRiga_documento& rec = doc[i+1]; - TToken_string& r = s.row(i); - r = " "; + const real residuo = rec.qtaresidua(); + const bool evasa = residuo.is_zero(); - bool evasa = rec.get_bool(RDOC_RIGAEVASA); - const real residuo = rec.get_real(RDOC_QTA) - rec.get_real(RDOC_QTAEVASA); - if (residuo <= ZERO) + if ((show_evaded || !evasa) && (articolo.empty() || articolo == rec.get(RDOC_CODART))) { - r.add(" "); - evasa = TRUE; + TToken_string& r = s.row(-1); + r = " "; + if (evasa) + r.add(" "); + else + r.add(residuo.string()); + r.add(" "); // Da evadere + if (evasa) + { + s.disable_cell(i, -1); // Disbilita tutta la riga ... + s.enable_cell(i, 0); // ... tranne il flag di consegna + r.add("X"); // La considera evasa + } + else + r.add(" "); + r.add(rec.get(RDOC_CODMAG).left(3)); + r.add(rec.get(RDOC_CODMAG).mid(3)); + r.add(rec.get(RDOC_CODART)); + const TString& livello = rec.get(RDOC_LIVELLO); + for (int l = 1; l <= 4; l++) + r.add(livelli_giacenza().unpack_grpcode(livello, l)); + if (rec.get_date(RDOC_DATACONS).ok()) + r.add(rec.get_date(RDOC_DATACONS)); + else + r.add(doc.get_date(DOC_DATACONS)); + r.add(rec.get(RDOC_PREZZO), s.cid2index(S_PREZZO)); + r.add(rec.get(RDOC_DESCR), s.cid2index(S_DESCR)); + r.add(rec.get(RDOC_TIPORIGA), s.cid2index(S_TIPORIGA)); + r.add(rec.get(RDOC_NRIGA),s.cid2index(S_NUMRIGA)); } - else - r.add(residuo.string()); - r.add(" "); // Da evadere - if (evasa) - { - s.disable_cell(i, -1); - r.add("X"); - } - else - r.add(" "); - r.add(rec.get(RDOC_CODMAG).left(3)); - r.add(rec.get(RDOC_CODMAG).mid(3)); - r.add(rec.get(RDOC_CODART)); - r.add(rec.get(RDOC_DESCR)); - r.add(rec.get(RDOC_TIPORIGA)); + } + if (_ordina_per_codice) + s.sort(rows_sort_func); +} + +TConsegna_mask::TConsegna_mask(int header_code, bool per_codice) + : TAutomask("velib04d") , _ordina_per_codice(per_codice) +{ + TCodgiac_livelli cl; + TSheet_field& s = sfield(F_ROWS); + cl.set_sheet_columns(s, S_LIVGIAC1); + if (header_code == 1) + { + TString h; + h = "Quantita'\nconsegnata"; + s.set_column_header(S_QTARESIDUA, h); + s.sheet_mask().field(S_QTARESIDUA).set_prompt("Q.ta' consegnata"); + + h = "Quantita'\nda fatturare"; + s.set_column_header(S_QTADAEVADERE, h); + s.sheet_mask().field(S_QTADAEVADERE).set_prompt("Q.ta' da fatturare"); } + else + if (header_code == 2) + { + TString h; + h = "Residuo"; + s.set_column_header(S_QTARESIDUA, h); + s.sheet_mask().field(S_QTARESIDUA).set_prompt("Residuo "); + + h = "Da evadere"; + s.set_column_header(S_QTADAEVADERE, h); + s.sheet_mask().field(S_QTADAEVADERE).set_prompt("Da evadere "); + } } /////////////////////////////////////////////////////////// @@ -140,47 +254,167 @@ bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_o CHECK(items_in > 0, "Nessun documento da elaborare"); CHECK(items_out> 0, "Nessun documento da generare"); CHECK(items_in == 1 || items_out == 1 || items_out == items_in, - "Numero di documenti da elborare 'strano'"); + "Numero di documenti da elaborare 'strano'"); bool ok = TRUE; - TConsegna_mask m; + const int header_code = intestazioni_sheet(); + + TConsegna_mask m(header_code, ordina_per_codice()); const int items_max = items_in > items_out ? items_in : items_out; for (int d = 0; d < items_max && ok; d++) { TDocumento& indoc = doc_in[d < items_in ? d : 0]; TDocumento& outdoc = doc_out[d < items_out ? d : 0]; + const TString& articolo = params().get("ARTICOLO"); - m.doc2mask(indoc); + m.doc2mask(indoc, articolo); + TArticolo art; + if (articolo.not_empty()) + { + art.read(articolo); + params().set("QUANTITA", ZERO); + } ok = m.run() == K_ENTER; if (ok) { - TSheet_field& s = m.sfield(F_ROWS); - FOR_EACH_SHEET_ROW(s, n, row) if (*row->get(0) > ' ') - { - TRiga_documento& inrec = indoc[n+1]; - const real daeva = row->get(S_QTADAEVADERE - FIRST_FIELD); - if (daeva > ZERO) + if (gestione_riferimenti()) + { + // Determina ed eventualmente crea la riga di riferimento + const int riga_rif = riferimenti_in_testa() ? 1 : outdoc.physical_rows()+1; + if (riga_rif > outdoc.physical_rows()) { - const real qtaevasa = inrec.get_real(RDOC_QTAEVASA) + daeva; - inrec.put(RDOC_QTAEVASA, qtaevasa); - inrec.put(RDOC_RIGAEVASA, row->get(S_RIGAEVASA - FIRST_FIELD)); + TRiga_documento& rout = outdoc.new_row(); + rout.forza_sola_descrizione(); + } + + TRiga_documento& rout = outdoc[riga_rif]; + + // Costruisce la stringa di riferimento + TString riferimento; + indoc.riferimento(riferimento); + if (riferimento.empty()) + riferimento = indoc.tipo().descrizione(); + if (usa_doc_rif() && indoc.get(DOC_NUMDOCRIF).not_empty()) + { + riferimento << " n. " << indoc.get(DOC_NUMDOCRIF); + riferimento << " del " << indoc.get(DOC_DATADOCRIF); } - - const TString16 tiporiga = inrec.get(RDOC_TIPORIGA); - TRiga_documento& outrec = outdoc.new_row(tiporiga); - outrec = inrec; - outrec.set_numero(outdoc.physical_rows()); - outrec.put(RDOC_QTA, daeva); - outrec.zero(RDOC_QTAEVASA); - outrec.zero(RDOC_RIGAEVASA); + else + { + riferimento << " n. " << indoc.numero(); + riferimento << " del " << indoc.data().string(); + } + + + // Setta la descrizione se vuota + if (rout.get("DESCR").empty()) + rout.put("DESCR", riferimento); + else + { + // Altrimenti aggiungi il riferimento al memo + TString memo(1024); + memo = rout.get("DESCEST"); + if (memo.empty()) + { + TString80 rif(rout.get("DESCR")); + + rif << '\n'; + rout.put("DESCR", rif); + rout.put("DESCLUNGA", "X"); + } + else + memo << '\n'; + memo << riferimento; + rout.put("DESCEST", memo); + } } + + TToken_string campi_riga(80); + const bool ragg_rig = raggruppa_righe(); + + if (ragg_rig) + { + campi_riga = "CODART|LIVELLO|UMQTA"; // Uguali sempre + // Uguali opzionalmente + if (riga_uguale(0)) campi_riga.add("CODMAG"); + if (riga_uguale(1)) campi_riga.add("CODIVA"); + if (riga_uguale(2)) campi_riga.add("PREZZO|SCONTO"); + } + + TSheet_field& s = m.sfield(F_ROWS); + int r = 0; + FOR_EACH_SHEET_ROW(s, n, row) + { + r = row->get_int(S_NUMRIGA - FIRST_FIELD); + if (*row->get(0) > ' ') // E' da consegnare? + { + TRiga_documento& inrec = indoc[r]; + const real daeva = row->get(S_QTADAEVADERE - FIRST_FIELD); + + if (daeva > ZERO || row->get_char(S_RIGAEVASA-FIRST_FIELD) > ' ') + { + const char* fqe = inrec.field_qtaevasa(); + const real qtaevasa = inrec.get_real(fqe) + daeva; + inrec.put(fqe, qtaevasa); + inrec.put(RDOC_RIGAEVASA, row->get(S_RIGAEVASA - FIRST_FIELD)); + } + if (articolo.not_empty()) + { + const TString16 um(inrec.get(RDOC_UMQTA)); + const real qta = art.convert_to_um(daeva, params().get("UM"), um); + params().set("QUANTITA", qta + params().get_real("QUANTITA")); + } + + bool elaborata = FALSE; + if (ragg_rig) + { + for (int i = 1; i <= outdoc.physical_rows(); i++) + { + TRiga_documento& outrec = outdoc[i]; + + if (outrec.sola_descrizione()) // Ignora le righe descrittive + continue; + if (inrec.raggruppabile(outrec, campi_riga)) // Se esiste una riga compatibile ... + { + const TString& qta_field = outrec.field_qta(); + const real qta = outrec.get_real(qta_field) + daeva; + outrec.put(qta_field, qta); + if (qta_field != RDOC_QTA) + outrec.put(RDOC_QTA, 1); // Pezza temporanea + outrec.dirty_fields(); // Forza ricalcolo peso etc. + elaborata = TRUE; // Ricorda di averla gia' elaborata + break; + } + } + } + if (!elaborata) // Se la riga non e' stata gia' sommata ... + { + const TString16 tiporiga = inrec.get(RDOC_TIPORIGA); + TRiga_documento & outrec = outdoc.new_row(tiporiga); + const TString& qta_field = outrec.field_qta(); + + TDocumento::copy_data(outrec, inrec); + outrec.put(qta_field, daeva); + if (qta_field != RDOC_QTA) + { + real q = inrec.get(RDOC_QTA); + if (q.is_zero()) q = 1.0; + outrec.put(RDOC_QTA, q); // Pezza temporanea + } + outrec.dirty_fields(); // Forza ricalcolo peso etc. + outrec.zero(RDOC_QTAEVASA); + outrec.zero(RDOC_RIGAEVASA); + outrec.set_original_rdoc_key(inrec); + } + } + } } if (indoc.is_evaso()) { - indoc.stato(stato_finale()[0]); + indoc.stato(stato_finale_doc_iniziale()[0]); } } return ok; diff --git a/ve/velib06.cpp b/ve/velib06.cpp index 20d89bba2..6bb777126 100755 --- a/ve/velib06.cpp +++ b/ve/velib06.cpp @@ -1724,10 +1724,10 @@ bool TElabora_mask::elabora() TLista_documenti in; TLista_documenti out; TDocumento& app_doc = ((TDocumento_mask *)_main)->doc(); - long numdoc = get_long(F_NDOC_ELAB); + const long numdoc = get_long(F_NDOC_ELAB); const bool update_header = get_bool(F_UPDATE_HEADER); - TDocumento* newdoc = new TDocumento(*get(F_PROVV_ELAB), get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc); + TDocumento* newdoc = new TDocumento(get(F_PROVV_ELAB)[0], get_int(F_ANNO_ELAB), get(F_CODNUM_ELAB), numdoc); TDocumento& d = *newdoc; if (numdoc <= 0) @@ -1814,8 +1814,7 @@ bool TElabora_mask::elabora() if (d != in[0]) in.rewrite(); } - TString8 num_in(e->codice_numerazione_iniziale()); - + const TString8 num_in = e->codice_numerazione_iniziale(); set(F_CODNUM_ELAB, num_in); set(F_NDOC_ELAB, ""); set(F_NUMDOCRIF_ELAB, ""); @@ -2142,7 +2141,7 @@ bool TDocumento_mask::elabora_handler( TMask_field& f, KEY key ) bool update_mask = FALSE; const char stato_iniziale = m.doc().stato(); - while (selection->run() != K_ESC) + while (selection->run() == K_ENTER) { m.mask2doc(); update_mask |= selection->elabora();