#include #include "velib.h" #include "velib04d.h" #include #include /////////////////////////////////////////////////////////// // TConsegna ordini mask /////////////////////////////////////////////////////////// class TConsegna_mask : public TAutomask { protected: virtual bool on_field_event(class TOperable_field& f, TField_event e, long jolly); public: void doc2mask(const TDocumento& doc); TConsegna_mask() : TAutomask("velib04d") { } virtual ~TConsegna_mask() { } }; bool TConsegna_mask::on_field_event(class TOperable_field& f, TField_event e, long jolly) { switch (f.dlg()) { case S_QTADAEVADERE: if (e == fe_modify) { TMask& m = f.mask(); const real qta_residua = m.get_real(S_QTARESIDUA); const real qta_daevadere = m.get_real(S_QTADAEVADERE); if (qta_daevadere > ZERO) { m.set(S_RIGACONSEGNATA, "X"); if (qta_daevadere >= qta_residua) { m.set(S_RIGAEVASA, "X"); m.disable(S_RIGAEVASA); } else m.enable(S_RIGAEVASA); } else { m.set(S_RIGAEVASA, " "); m.enable(S_RIGAEVASA); } } break; case F_CONSEGNA: if (e == fe_button) { 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); } row->add("X", S_RIGACONSEGNATA-FIRST_FIELD); } s.force_update(); } break; case F_ROWS: if (e == se_query_add || e == se_query_del) return FALSE; default:break; } return TRUE; } void TConsegna_mask::doc2mask(const TDocumento& doc) { for (int n = fields()-1; n >= 0; n--) { TMask_field& f = fld(n); const TFieldref* fr = f.field(); if (fr) { const TString& val = doc.get(fr->name()); f.set(val); } } 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 = " "; bool evasa = rec.get_bool(RDOC_RIGAEVASA); const real residuo = rec.get_real(RDOC_QTA) - rec.get_real(RDOC_QTAEVASA); if (residuo <= ZERO) { r.add(" "); evasa = TRUE; } 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)); } } /////////////////////////////////////////////////////////// // TConsegna ordini /////////////////////////////////////////////////////////// TConsegna_ordini::TConsegna_ordini(const char* cod) : TElaborazione(cod) { } bool TConsegna_ordini::elabora(TLista_documenti& doc_in, TLista_documenti& doc_out, const TDate& data_elab, bool interattivo) { const int items_in = doc_in.items(); const int items_out = doc_out.items(); 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'"); bool ok = TRUE; TConsegna_mask m; 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]; m.doc2mask(indoc); 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) { const real qtaevasa = inrec.get_real(RDOC_QTAEVASA) + daeva; inrec.put(RDOC_QTAEVASA, qtaevasa); inrec.put(RDOC_RIGAEVASA, row->get(S_RIGAEVASA - FIRST_FIELD)); } 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); } } if (indoc.is_evaso()) { indoc.stato(stato_finale()[0]); } } return ok; }