diff --git a/lv/lv3200.cpp b/lv/lv3200.cpp index c481e615c..ee9ad3610 100755 --- a/lv/lv3200.cpp +++ b/lv/lv3200.cpp @@ -9,6 +9,7 @@ #include "../mg/clifogiac.h" #include "../ve/velib.h" +#include "clifo.h" #include "lvcondv.h" #include "lvrcondv.h" #include "lvrconsplan.h" @@ -74,6 +75,7 @@ protected: void sistema_quantita(); void sistema_pacchi(); + void evadi_da_barcode(); virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly); @@ -94,7 +96,14 @@ static int sort_by_qta_evasa(TSheet_field& sheet, int r1, int r2) const int qta2 = row2.get_int(6); int dif = qta1 - qta2; - + + if (dif == 0) + { + const TString& codart1 = row1.get(1); + const TString& codart2 = row2.get(1); + + dif = codart1.compare(codart2); + } return dif; } @@ -105,14 +114,20 @@ static int sort_by_codart(TSheet_field& sheet, int r1, int r2) TToken_string& row1 = sheet.row(r1); TToken_string& row2 = sheet.row(r2); - /*const int qta1 = row1.get_int(6); - const int qta2 = row2.get_int(6); + const TString& codart1 = row1.get(1); + const TString& codart2 = row2.get(1); - int dif = qta1 - qta2; + int dif = codart1.compare(codart2); + + if (dif == 0) + { + const int qta1 = row1.get_int(6); + const int qta2 = row2.get_int(6); + + dif = qta2 - qta1; + } - return dif;*/ - - return 0; + return dif; } //SETTA_CAMPI_DATA: metodo che compila tutti i campi legati alla data @@ -138,7 +153,16 @@ void TEvasione_msk::setta_campi_data() set(F_SETTIMANA, settimana); } else - warning_box(TR("Data non valida!")); + { + TString8 str = data.string(); + if (str.empty()) + { + reset(F_GIORNO); + reset(F_SETTIMANA); + } + else + warning_box(TR("Data non valida!")); + } } //SETTA_CAMPI_CLIENTE: metodo che compila tutti i campi legati al cliente @@ -176,6 +200,16 @@ void TEvasione_msk::setta_campi_cliente() reset(F_DATAPRCO); reset(F_CODITI); } + + if (get(F_RAGSOC).empty()) + { + TToken_string key; + key.add('C'); + key.add(codcf); + const TRectype& clifo = cache().get(LF_CLIFO, key); + set(F_RAGSOC, clifo.get(CLI_RAGSOC)); + set(F_RICALT, clifo.get(CLI_RICALT)); + } } else { @@ -190,6 +224,8 @@ void TEvasione_msk::setta_campi_cliente() } else { + reset(F_RICALT); + reset(F_RAGSOC); reset(F_CODCONT); reset(F_DATAPRCO); reset(F_CODITI); @@ -202,9 +238,30 @@ void TEvasione_msk::carica_righe() TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_long(F_NDOC)); TBuono_prelievo doc(kdoc); + const TString4 stato = doc.get(DOC_STATO); + + set(F_STATO, stato); + disable(F_STATO); + + set(F_DATADOC, doc.get_date(DOC_DATADOC)); setta_campi_data(); + set(F_CODCF, doc.get_long(DOC_CODCF)); setta_campi_cliente(); field(F_CODCF).set_dirty(); + _buonori = doc; - TSheet_field sheet = sfield(F_RIGHE); + if(doc.rows() > 0) + { + enable(DLG_SELECT); + enable(DLG_PREVIEW); + + if(stato == "1") + enable(DLG_ELABORA); + + enable(DLG_SAVEREC); + enable(DLG_CANCEL); + show(F_RIGHE); + } + + TSheet_field& sheet = sfield(F_RIGHE); sheet.row(-1); //preparo l'array delle posizioni dei campi nello sheet _posizioni.aggiungi("evaso", sheet.cid2index(S_EVASO)); @@ -227,19 +284,17 @@ void TEvasione_msk::carica_righe() TBuono_prelievo_row rdoc(row); TToken_string& riga = sheet.row(-1); - riga.add(rdoc.evaso(), _posizioni.posizione("evaso")); - riga.add(rdoc.codart(), _posizioni.posizione("codart")); - riga.add(rdoc.desart(), _posizioni.posizione("artdescr")); - riga.add(rdoc.causale(), _posizioni.posizione("causale")); - riga.add(rdoc.qta_ritirata(), _posizioni.posizione("ritirato")); - riga.add(rdoc.qta_dacons(), _posizioni.posizione("dacons")); - riga.add(rdoc.qta_consegnata(), _posizioni.posizione("consegnato")); + riga.add(rdoc.evaso() ? "X" : "", _posizioni.posizione("evaso")); + riga.add(rdoc.codart(), _posizioni.posizione("codart")); + riga.add(rdoc.desart(), _posizioni.posizione("artdescr")); + riga.add(rdoc.causale(), _posizioni.posizione("causale")); + riga.add(rdoc.qta_ritirata(), _posizioni.posizione("ritirato")); + riga.add(rdoc.qta_dacons(), _posizioni.posizione("dacons")); + riga.add(rdoc.qta_consegnata(), _posizioni.posizione("consegnato")); const TRectype& anamag = cache().get(LF_ANAMAG, rdoc.codart()); //recupero i dati di interesse dall'anagrafica di magazzino const long ppconf = anamag.get_long(ANAMAG_PPCONF); - - if (ppconf > 0) riga.add(rdoc.num_pacchi(), _posizioni.posizione("pacchi")); else @@ -253,13 +308,14 @@ void TEvasione_msk::carica_righe() riga.add(rdoc.rifbcon(), _posizioni.posizione("rifbcon")); riga.add(rdoc.rifbrit(), _posizioni.posizione("rifbrit")); } + sheet.sort(sort_by_codart); sheet.force_update(); } //RIORDINA_RIGHE: metodo che riordina le righe dello sheet in base alle quota di evasione void TEvasione_msk::riordina_righe() { - TSheet_field sheet = sfield(F_RIGHE); + TSheet_field& sheet = sfield(F_RIGHE); sheet.sort(sort_by_qta_evasa); sheet.force_update(); } @@ -283,7 +339,7 @@ void TEvasione_msk::genera_documento() //dati documento da generare TString4 codnum = ini_get_string(CONFIG_DITTA, "lv", "NUM_GEN"); TString4 tipodoc = ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_GEN"); - char stato = cache().get("%TIP", tipodoc, "S2").left(1)[0]; + char stato = cache().get("%TIP", tipodoc, "S2").left(1)[0]; const TDate databpre = bpre.datadoc(); const TDate datagen(TODAY); @@ -351,7 +407,7 @@ void TEvasione_msk::genera_documento() long dottmp = magcli.get_long(CLIFOGIAC_DOTTM); long dotod = magcli.get_long(CLIFOGIAC_DOTOD); - TRiga_documento rdoc = doc.new_row("21"); + TRiga_documento& rdoc = doc.new_row("21"); rdoc.put(RDOC_CODART, codart); rdoc.put(RDOC_CODARTMAG,codart); rdoc.put(RDOC_CHECKED,'X'); @@ -395,7 +451,7 @@ void TEvasione_msk::genera_documento() prezzo = anamag.get_real(ANAMAG_COSTSTD); rdoc.put(RDOC_PREZZO, prezzo); - rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto + rdoc.put(RDOC_SCONTO, rcont.get(LVRCONDV_SCONTPERC)); //sconto } //scrivo il magazzino @@ -417,8 +473,10 @@ void TEvasione_msk::genera_documento() if (doc.rows() > 0) { doc.write(); - //bpre.set_stato("evaso"); + const TString4 stato = cache().get("%TIP", ini_get_string(CONFIG_DITTA, "lv", "TIPODOC_PRE", NULL, 0), "S2").mid(1,1); + bpre.put(DOC_STATO, stato); bpre.write(); + set(F_STATO, stato); } } @@ -426,7 +484,7 @@ void TEvasione_msk::genera_documento() void TEvasione_msk::evadi_tutto() { const int posevaso = _posizioni.posizione("evaso"); - TSheet_field sheet = sfield(F_RIGHE); + TSheet_field& sheet = sfield(F_RIGHE); FOR_EACH_SHEET_ROW(sheet, r, riga) { @@ -438,26 +496,28 @@ void TEvasione_msk::evadi_tutto() //SPEZZA_RIGA: metodo che spezza una riga del buono in due righe, una per la quota evasa e una per la quota da evadere void TEvasione_msk::spezza_riga() { - TDoc_key kdoc(get_int(F_ANNO), get(F_CODNUM), get_long(F_NDOC)); - TBuono_prelievo bpre(kdoc); + TSheet_field& sheet = sfield(F_RIGHE); - for(int riga = 1; riga <= bpre.rows(); riga++) + FOR_EACH_SHEET_ROW_BACK(sheet, r, riga1) { - TRiga_documento& row = bpre[riga]; - TBuono_prelievo_row rbpre1(row); + char flgev = riga1->get_char(_posizioni.posizione("evaso")); + if (flgev != 'X') + { + TToken_string& riga2 = sheet.row(-1); + riga2 = *riga1; - if (rbpre1.evaso()) - continue; + const int dacons2 = riga2.get_int(_posizioni.posizione("ritirato")) - riga2.get_int(_posizioni.posizione("consegnato")); + riga2.add(dacons2, _posizioni.posizione("dacons")); + riga2.add(0L, _posizioni.posizione("consegnato")); + riga2.add(0L, _posizioni.posizione("pacchi")); - TRiga_documento rdoc(row); - TBuono_prelievo_row rbpre2(rdoc); - - rbpre2.set_qta_dacons(rbpre2.qta_ritirata() - rbpre2.qta_consegnata()); - rbpre2.set_qta_consegnata(0); - - rbpre1.set_qta_dacons(rbpre1.qta_ritirata() - rbpre1.qta_consegnata()); - rbpre1.set_evaso(true); - } + const int dacons1 = riga1->get_int(_posizioni.posizione("ritirato")) - riga1->get_int(_posizioni.posizione("consegnato")); + riga1->add(dacons1, _posizioni.posizione("dacons")); + riga1->add("X", _posizioni.posizione("evaso")); + } + } + sheet.sort(sort_by_codart); + sheet.force_update(); } //SALVA: metodo che salva il buono di prelievo così com'è, senza compiere altre operazioni @@ -469,7 +529,7 @@ void TEvasione_msk::salva() //nel caso avessi spezzato le righe, riscirvendole da capo mi vengono ordinate per codice doc.destroy_rows(); - TSheet_field sheet = sfield(F_RIGHE); + TSheet_field& sheet = sfield(F_RIGHE); //riordino lo sheet sheet.sort(sort_by_codart); sheet.force_update(); @@ -477,10 +537,17 @@ void TEvasione_msk::salva() //per ogni riga dello sheet genero una riga documento FOR_EACH_SHEET_ROW(sheet, r, riga) { - TRiga_documento& row = doc.new_row(); + TRiga_documento& row = doc.new_row("21"); TBuono_prelievo_row rdoc(row); - rdoc.set_evaso(riga->get(_posizioni.posizione("evaso")) == "X" ? true: false); + const char flgev = riga->get(_posizioni.posizione("evaso"))[0]; + bool flag; + if (flgev == 'X') + flag = true; + else + flag = false; + + rdoc.set_evaso(flag); rdoc.set_codart(riga->get(_posizioni.posizione("codart"))); rdoc.set_desart(riga->get(_posizioni.posizione("artdescr"))); rdoc.set_causale(riga->get(_posizioni.posizione("causale"))); @@ -503,7 +570,7 @@ void TEvasione_msk::annulla_operazioni() //ANNULLA PACCHI //elimino lo sheet senza salvarlo - TSheet_field sheet = sfield(F_RIGHE); + TSheet_field& sheet = sfield(F_RIGHE); sheet.destroy(); for(int i = 1; i <= _buonori.rows(); i++) @@ -512,14 +579,25 @@ void TEvasione_msk::annulla_operazioni() TBuono_prelievo_row rdoc(row); TToken_string& riga = sheet.row(-1); - riga.add(rdoc.evaso(), _posizioni.posizione("evaso")); - riga.add(rdoc.codart(), _posizioni.posizione("codart")); - riga.add(rdoc.desart(), _posizioni.posizione("artdescr")); - riga.add(rdoc.causale(), _posizioni.posizione("causale")); - riga.add(rdoc.qta_ritirata(), _posizioni.posizione("ritirato")); - riga.add(rdoc.qta_dacons(), _posizioni.posizione("dacons")); - riga.add(rdoc.qta_consegnata(), _posizioni.posizione("consegnato")); - riga.add(rdoc.num_pacchi(), _posizioni.posizione("pacchi")); + riga.add(rdoc.evaso() ? "X" : "", _posizioni.posizione("evaso")); + riga.add(rdoc.codart(), _posizioni.posizione("codart")); + riga.add(rdoc.desart(), _posizioni.posizione("artdescr")); + riga.add(rdoc.causale(), _posizioni.posizione("causale")); + riga.add(rdoc.qta_ritirata(), _posizioni.posizione("ritirato")); + riga.add(rdoc.qta_dacons(), _posizioni.posizione("dacons")); + riga.add(rdoc.qta_consegnata(), _posizioni.posizione("consegnato")); + + const TRectype& anamag = cache().get(LF_ANAMAG, rdoc.codart()); + //recupero i dati di interesse dall'anagrafica di magazzino + const long ppconf = anamag.get_long(ANAMAG_PPCONF); + if (ppconf > 0) + riga.add(rdoc.num_pacchi(), _posizioni.posizione("pacchi")); + else + { + riga.add(0, _posizioni.posizione("pacchi")); + sheet.disable_cell(i, _posizioni.posizione("pacchi")); + } + riga.add(rdoc.cong_pre(), _posizioni.posizione("congpre")); riga.add(rdoc.cong_att(), _posizioni.posizione("congatt")); riga.add(rdoc.rifbcon(), _posizioni.posizione("rifbcon")); @@ -531,13 +609,14 @@ void TEvasione_msk::annulla_operazioni() //CONTROLLA: metodo che controlla se tutte le righe sono evase bool TEvasione_msk::controlla() { - TSheet_field sheet = sfield(F_RIGHE); + TSheet_field& sheet = sfield(F_RIGHE); bool evaso = true; FOR_EACH_SHEET_ROW(sheet, r, row) { - if (row->get(_posizioni.posizione("evaso")) != "X") + const char flgev = row->get(_posizioni.posizione("evaso"))[0]; + if (flgev != 'X') evaso = false; } return evaso; @@ -548,7 +627,8 @@ bool TEvasione_msk::controlla() //a mano ed è prevista una evasione a pacchi, allora aggiorno il numero dei pacchi void TEvasione_msk::sistema_quantita() { - TString80 codart = get(S_CODART); + TMask& msk = sfield(F_RIGHE).sheet_mask(); + TString80 codart = msk.get(S_CODART); const TRectype& anamag = cache().get(LF_ANAMAG,codart); //recupero i dati di interesse dall'anagrafica di magazzino @@ -556,20 +636,17 @@ void TEvasione_msk::sistema_quantita() if (ppconf > 0) { - TSheet_field sheet = sfield(F_RIGHE); - TToken_string riga = sheet.row(sheet.selected()); - - int pacchi = get_int(S_PACCHI); + int pacchi = msk.get_int(S_PACCHI); int qta_consegnata = pacchi * ppconf; - riga.add(qta_consegnata, _posizioni.posizione("consegnato")); - sheet.force_update(sheet.selected()); + msk.set(S_CONSEGNATO, qta_consegnata); } } void TEvasione_msk::sistema_pacchi() { - TString80 codart = get(S_CODART); + TMask& msk = sfield(F_RIGHE).sheet_mask(); + TString80 codart = msk.get(S_CODART); const TRectype& anamag = cache().get(LF_ANAMAG,codart); //recupero i dati di interesse dall'anagrafica di magazzino @@ -577,14 +654,10 @@ void TEvasione_msk::sistema_pacchi() if (ppconf > 0) { - TSheet_field sheet = sfield(F_RIGHE); - TToken_string riga = sheet.row(sheet.selected()); - - int qta_consegnata = get_int(S_CONSEGNATO); - - int pacchi = qta_consegnata / ppconf + 1; - riga.add(pacchi, _posizioni.posizione("pacchi")); - sheet.force_update(sheet.selected()); + int qta_consegnata = msk.get_int(S_CONSEGNATO); + + int pacchi = qta_consegnata / ppconf; + msk.set(S_PACCHI, pacchi); } } @@ -636,24 +709,37 @@ bool TEvasione_msk::on_field_event(TOperable_field& f, TField_event e, long joll break; case DLG_SAVEREC: { - salva(); + if (e == fe_button) + salva(); } break; case DLG_CANCEL: { - annulla_operazioni(); + if (e == fe_button) + { + annulla_operazioni(); + return false; + } } break; case F_NDOC: { if (e == fe_modify) if (f.get_long() > 0) - { - enable(F_RIGHE); - carica_righe(); - } + carica_righe(); else - disable(F_RIGHE); + { + sfield(F_RIGHE).destroy(); + disable(DLG_SELECT); + disable(DLG_PREVIEW); + disable(DLG_ELABORA); + disable(DLG_SAVEREC); + disable(DLG_CANCEL); + reset(F_STATO); + reset(F_DATADOC); setta_campi_data(); + reset(F_CODCF); setta_campi_cliente(); + hide(F_RIGHE); + } } break; case F_DATADOC: @@ -667,43 +753,20 @@ bool TEvasione_msk::on_field_event(TOperable_field& f, TField_event e, long joll if (e == fe_modify) setta_campi_cliente(); } - break; - case F_RIGHE: - { - if (e == fe_modify) - { - TSheet_field sheet = sfield(F_RIGHE); - if (sheet.items() > 0) - { - enable(DLG_SELECT); - enable(DLG_PREVIEW); - enable(DLG_ELABORA); - enable(DLG_SAVEREC); - enable(DLG_CANCEL); - } - else - { - disable(DLG_SELECT); - disable(DLG_PREVIEW); - disable(DLG_ELABORA); - disable(DLG_SAVEREC); - disable(DLG_CANCEL); - } - } - } - break; + break; case S_CONSEGNATO: { if (e == fe_modify) { + TMask& msk = sfield(F_RIGHE).sheet_mask(); //la riga risulta evasa se la quantità consegnata è maggiore o uguale alla quantità da consegnare - if(f.get_long() > get_long(S_DACONS)) + if(msk.get_long(S_CONSEGNATO) > msk.get_long(S_DACONS)) { warning_box(TR("ATTENZIONE: stai consegnando un quantitativo maggiore al dovuto")); - set(S_EVASO, "X"); + msk.set(S_EVASO, "X"); } - else if (f.get_long() == get_long(S_DACONS)) - set(S_EVASO, "X"); + else if (msk.get_long(S_CONSEGNATO) == msk.get_long(S_DACONS)) + msk.set(S_EVASO, "X"); sistema_pacchi(); } } @@ -711,9 +774,7 @@ bool TEvasione_msk::on_field_event(TOperable_field& f, TField_event e, long joll case S_PACCHI: { if (e == fe_modify) - { sistema_quantita(); - } } break; default:break; @@ -737,7 +798,7 @@ TEvasione_msk::TEvasione_msk():TAutomask("lv3200a") int annoes = es.date2esc(data); set(F_ANNO, annoes); - disable(F_RIGHE); + hide(F_RIGHE); disable(DLG_SELECT); disable(DLG_PREVIEW); disable(DLG_ELABORA); @@ -769,6 +830,7 @@ public: bool TEvasione_app::create() { _msk = new TEvasione_msk(); + open_files(LF_DOC, LF_RIGHEDOC); return TSkeleton_application::create(); }