diff --git a/lv/lv2400.cpp b/lv/lv2400.cpp index a244928bd..2bd1c7783 100755 --- a/lv/lv2400.cpp +++ b/lv/lv2400.cpp @@ -47,11 +47,14 @@ class TGenera_documenti_app : public TSkeleton_application private: //Metodi per la generazione dei documenti bool crea_documento(const TISAM_recordset& plan); - void crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, TDocumento& doc); + void crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, const bool prinbo,TDocumento& doc); //Metodi per il recupero di codnum, tpdoc, stato - bool numerazione_ddt(TString& codnum, TString& tpdoc, TString& stato) const; - bool numerazione_drit(const int cod, TString& codnum, TString& tpdoc, TString& stato) const; - bool numerazione_dant(const int cod, TString& codnum, TString& tpdoc, TString& stato) const; + bool numerazione_ddt(TString& codnum, TString& tpdoc, TString& statoi, TString& statof) const; + bool numerazione_drit(const int cod, TString& codnum, TString& tpdoc, TString& statoi, TString& statof) const; + bool numerazione_dant(const int cod, TString& codnum, TString& tpdoc, TString& statoi, TString& statof) const; + //Metodi per l'eliminazione dei documenti + void cambia_stato(const long codcli, const long codind, const char ritoant); + void elimina_bolle(const long codcli, const long codind); //Metodi per la scansione dei documenti void scansione_ritiri_anticipi(const long codcli, const long codind, const char ritoant); void scansione_consegne(const long codcli, const long codind); @@ -110,7 +113,6 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan) const long codcont = plan.get(LVRCONSPLAN_CODCONT).as_int(); const TDate dtcons = plan.get(LVRCONSPLAN_DTCONS).as_date(); const char modpas = plan.get(LVRCONSPLAN_MODPASS).as_string()[0]; - const int anno = datadoc.year(); @@ -122,7 +124,16 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan) const TRectype& tcont = cache().get(LF_LVCONDV,keycont); //estraggo i dati di interesse dalla cache const long codind = tcont.get_long(LVCONDV_CODINDSP); //codice dell'indirizzo di spedizione - const int tplis = tcont.get_int(LVCONDV_TIPOLIS); //tipo listino + const int tplis = tcont.get_int(LVCONDV_TIPOLIS); //tipo listino + const bool prinbo = tcont.get_bool(LVCONDV_STPRZBOL); //prezzo in bolla + + //elimina eventuali documenti di consegna che sono ancora in stato iniziale + //...e riporta in stato iniziale i documenti di ritiro e di anticipo che concorrono + //...a calcolare le quantità da riportare sulla bolla + cambia_stato(codcli, codind,'R'); + cambia_stato(codcli, codind,'A'); + elimina_bolle(codcli, codind); + //calcola tutte le quantità riportate sui documenti di ritiro, sui documenti di anticipo e sulle bolle di consegna //...eventualmente modificate a mano @@ -134,16 +145,17 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan) //...settati dalla funzione numerazione_ddt() TString4 codnum; TString4 tpdoc; - TString4 stato; + TString4 statoi; + TString4 statof; //se non trovo quale documento generare, evito il resto dell'elaborazione - if (!numerazione_ddt(codnum, tpdoc, stato)) + if (!numerazione_ddt(codnum, tpdoc, statoi, statof)) return NOERR; //creo il documento corretto riempiendo i campi che già conosco TDocumento doc('D',anno,codnum,0); - doc.put(DOC_STATO, stato); + doc.put(DOC_STATO, statoi); doc.put(DOC_TIPODOC, tpdoc); doc.put(DOC_DATADOC, datadoc); doc.put(DOC_TIPOCF, 'C'); @@ -158,7 +170,7 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan) FOR_EACH_ASSOC_OBJECT(_quantita,h,codart,obj) { - crea_riga(codart, modpas, tplis, false, doc); + crea_riga(codart, modpas, tplis, false, prinbo ,doc); /*const TDate dadata = rcont.get(LVRCONDV_INDTTMP).as_date(); const TDate adata = rcont.get(LVRCONDV_FIDTTMP).as_date(); @@ -170,7 +182,7 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan) } //CREA_RIGA: questa funzione crea una riga merce per una bolla di consegna -void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, TDocumento& doc) +void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, const bool prinbo,TDocumento& doc) { //creo la nuova riga TRiga_documento& rdoc = doc.new_row("01"); @@ -221,7 +233,7 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, //aggiorno il conguaglio sulla riga del contratto aggiorna_conguaglio(codcli, codcont, codart, quantita_arr - quantita_noarr); - + //elaborazione sul prezzo da utilizzare real prezzo; //elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino @@ -232,13 +244,15 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, rdoc.put(RDOC_CODART,codart); rdoc.put(RDOC_CODARTMAG,codart); - rdoc.put(RDOC_CHECKED,'X'); - if (!tmp) - rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PREZZO)); - else //per adesso per questo ramo non ci passa mai, perchè non sappiamo come gestire le dotazioni temporanee - rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP)); - - rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto + rdoc.put(RDOC_CHECKED,'X'); + if (prinbo) + { + if (!tmp) + rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PREZZO)); + else //per adesso per questo ramo non ci passa mai, perchè non sappiamo come gestire le dotazioni temporanee + rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP)); + rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto + } } ////////////////////////////////////////////////////////////// @@ -246,36 +260,151 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, ////////////////////////////////////////////////////////////// //NUMERAZIONE_DDT: questa funzione cerca quali sono i codnum e i tpdoc che devo generare -bool TGenera_documenti_app::numerazione_ddt(TString& codnum, TString& tpdoc, TString& stato) const +bool TGenera_documenti_app::numerazione_ddt(TString& codnum, TString& tpdoc, TString& statoi, TString& statof) const { codnum = _configlv->get("NUM_GEN"); tpdoc = _configlv->get("TIPODOC_GEN"); - //instanzio una cache sulla tabella delle righe contratti (creco lo stato iniziale) - stato = cache().get("%TIP",tpdoc,"S2").left(1); + //instanzio una cache sulla tabella delle righe contratti (cerco lo stato iniziale) + statoi = cache().get("%TIP",tpdoc,"S2").left(1); + statof = cache().get("%TIP",tpdoc,"S2").mid(2,1); return codnum.full() && tpdoc.full(); } //NUMERAZIONE_DRIT: questa funzione cerca quali sono i codnum e i tpdoc dei documenti di ritiro -bool TGenera_documenti_app::numerazione_drit(const int cod, TString& codnum, TString& tpdoc, TString& stato) const +bool TGenera_documenti_app::numerazione_drit(const int cod, TString& codnum, TString& tpdoc, TString& statoi, TString& statof) const { codnum = _configlv->get("NUM_RIT",NULL,cod); tpdoc = _configlv->get("TIPODOC_RIT",NULL,cod); - stato = _configlv->get("STATO_RIT",NULL,cod); //è lo stato finale + statof = _configlv->get("STATO_RIT",NULL,cod); //è lo stato finale + //instanzio una cache sulla tabella delle righe contratti (cerco lo stato iniziale) + statoi = cache().get("%TIP",tpdoc,"S2").left(1); return codnum.full() && tpdoc.full(); } //NUMERAZIONE_DANT: questa funzione cerca quali sono i codnum e i tpdoc dei documenti di anticipo -bool TGenera_documenti_app::numerazione_dant(const int cod, TString& codnum, TString& tpdoc, TString& stato) const +bool TGenera_documenti_app::numerazione_dant(const int cod, TString& codnum, TString& tpdoc, TString& statoi, TString& statof) const { codnum = _configlv->get("NUM_ANT",NULL,cod); tpdoc = _configlv->get("TIPODOC_ANT",NULL,cod); - stato = _configlv->get("STATO_ANT",NULL,cod); //è lo stato finale + statof = _configlv->get("STATO_ANT",NULL,cod); //è lo stato finale + //instanzio una cache sulla tabella delle righe contratti (cerco lo stato iniziale) + statoi = cache().get("%TIP",tpdoc,"S2").left(1); return codnum.full() && tpdoc.full(); } + ////////////////////////////////////////////////////////////// + //// Metodi per l'eliminazione dei documenti //// + ////////////////////////////////////////////////////////////// + +//CAMBIA_STATO: questa funzione cerca tutte le bolle di ritiro e anticipo relative a un certo cliente... +//in un certo intervallo di date, e gli cambia stato +void TGenera_documenti_app::cambia_stato(const long codcli, const long codind, const char ritoant) +{ + //recupero dalla maschera i campi di interesse + const TDate dadatabolla = _msk->get_date(F_DADTBOLLE); + const TDate adatabolla = _msk->get_date(F_ADTBOLLE); + + const long daanno = dadatabolla.year(); + const long aanno = adatabolla.year(); + + //per ogni paragrafo scritto in ditta.ini... + //recupero numerazione, tipo documento e stato tramite la funzione apposita + for (int i = 0; ; i++) + { + TString4 codnum; + TString4 tpdoc; + TString4 statoi; + TString4 statof; + bool err; + + //distinguo se sto scandendo i documenti di ritiro o i documenti di anticipo + switch (ritoant) + { + case 'R': + err = numerazione_drit(i, codnum, tpdoc, statoi, statof); + break; + case 'A': + err = numerazione_dant(i, codnum, tpdoc, statoi, statof); + break; + default: + break; + } + + //se non trovo la numerazione richiesta, interrompo il ciclo + if (!err) + break; + + //instanzio un recordset che contiene tutti i documenti di interesse + TISAM_recordset docritiri ("USE DOC KEY 2 SELECT (STATO=#STATO)&&(TIPODOC=#TIPODOC)&&(CODINDSP=#CODINDSP)\nFROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#DAANNO DATADOC=#DADATABOLLA CODNUM=#CODNUM\nTO TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#AANNO DATADOC=#ADATABOLLA CODNUM=#CODNUM"); + docritiri.set_var("#STATO",TVariant(statof)); //lo stato va preso dallo sheet + docritiri.set_var("#TIPODOC",TVariant(tpdoc)); + docritiri.set_var("#CODINDSP",codind); + docritiri.set_var("#TIPOCF","C"); + docritiri.set_var("#CODCF",codcli); + docritiri.set_var("#PROVV","D"); + docritiri.set_var("#DAANNO",daanno); + docritiri.set_var("#DADATABOLLA",dadatabolla); + docritiri.set_var("#CODNUM",TVariant(codnum)); + docritiri.set_var("#AANNO",aanno); + docritiri.set_var("#ADATABOLLA",adatabolla); + + //per ogni documento che trovo, cambio stato al documento + for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next()) + { + TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento + doc.put(DOC_STATO,statoi); //stato iniziale + } + } + return; +} + +//ELIMINA_BOLLE: questa funzione cerca tutte le bolle di consegna relative a un certo cliente ancora... +//nello stato iniziale in un certo intervallo di date e le elimina +void TGenera_documenti_app::elimina_bolle(const long codcli, const long codind) +{ + //recupero dalla maschera i campi di interesse + const TDate dadatabolla = _msk->get_date(F_DADTBOLLE); + const TDate adatabolla = _msk->get_date(F_ADTBOLLE); + + const long daanno = dadatabolla.year(); + const long aanno = adatabolla.year(); + + //recupero numerazione, tipo documento e stato tramite la funzione apposita + TString4 codnum; + TString4 tpdoc; + TString4 statoi; + TString4 statof; + + //se non trovo la numerazione richiesta, interrompo la funzione + if (!numerazione_ddt(codnum, tpdoc, statoi, statof)) + return; + + //instanzio un recordset che contiene tutti i documenti di interesse + TISAM_recordset docritiri ("USE DOC KEY 2 SELECT (STATO=#STATO)&&(TIPODOC=#TIPODOC)&&(CODINDSP=#CODINDSP)\nFROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#DAANNO DATADOC=#DADATABOLLA CODNUM=#CODNUM\nTO TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#AANNO DATADOC=#ADATABOLLA CODNUM=#CODNUM"); + docritiri.set_var("#STATO",TVariant(statof)); + docritiri.set_var("#TIPODOC",TVariant(tpdoc)); + docritiri.set_var("#CODINDSP",codind); + docritiri.set_var("#TIPOCF","C"); + docritiri.set_var("#CODCF",codcli); + docritiri.set_var("#PROVV","D"); + docritiri.set_var("#DAANNO",daanno); + docritiri.set_var("#DADATABOLLA",dadatabolla); + docritiri.set_var("#CODNUM",TVariant(codnum)); + docritiri.set_var("#AANNO",aanno); + docritiri.set_var("#ADATABOLLA",adatabolla); + + //per ogni documento che trovo, aggiorno la quantità e gli cambio stato + for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next()) + { + TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento + doc.remove(); //stato di bloccato + } + return; +} + ////////////////////////////////////////////////////////////// //// Metodi per la scansione dei documenti //// ////////////////////////////////////////////////////////////// @@ -297,17 +426,18 @@ void TGenera_documenti_app::scansione_ritiri_anticipi(const long codcli, const l { TString4 codnum; TString4 tpdoc; - TString4 stato; + TString4 statoi; + TString4 statof; bool err; //distinguo se sto scandendo i documenti di ritiro o i documenti di anticipo switch (ritoant) { case 'R': - err = numerazione_drit(i, codnum, tpdoc, stato); + err = numerazione_drit(i, codnum, tpdoc, statoi, statof); break; case 'A': - err = numerazione_dant(i, codnum, tpdoc, stato); + err = numerazione_dant(i, codnum, tpdoc, statoi, statof); break; default: break; @@ -319,7 +449,7 @@ void TGenera_documenti_app::scansione_ritiri_anticipi(const long codcli, const l //instanzio un recordset che contiene tutti i documenti di interesse TISAM_recordset docritiri ("USE DOC KEY 2 SELECT (STATO!=#STATO)&&(TIPODOC=#TIPODOC)&&(CODINDSP=#CODINDSP)\nFROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#DAANNO DATADOC=#DADATABOLLA CODNUM=#CODNUM\nTO TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#AANNO DATADOC=#ADATABOLLA CODNUM=#CODNUM"); - docritiri.set_var("#STATO",TVariant(stato)); //lo stato va preso dallo sheet + docritiri.set_var("#STATO",TVariant(statof)); //lo stato va preso dallo sheet docritiri.set_var("#TIPODOC",TVariant(tpdoc)); docritiri.set_var("#CODINDSP",codind); docritiri.set_var("#TIPOCF","C"); @@ -336,7 +466,7 @@ void TGenera_documenti_app::scansione_ritiri_anticipi(const long codcli, const l { TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento calcolo_quantita(doc,ritoant); - doc.put(DOC_STATO,stato); //stato di elaborato, preso dallo sheet + doc.put(DOC_STATO,statof); //stato di elaborato, preso dallo sheet } } return; @@ -356,15 +486,16 @@ void TGenera_documenti_app::scansione_consegne(const long codcli, const long cod //recupero numerazione, tipo documento e stato tramite la funzione apposita TString4 codnum; TString4 tpdoc; - TString4 stato; + TString4 statoi; + TString4 statof; //se non trovo la numerazione richiesta, interrompo la funzione - if (!numerazione_ddt(codnum, tpdoc, stato)) + if (!numerazione_ddt(codnum, tpdoc, statoi, statof)) return; //instanzio un recordset che contiene tutti i documenti di interesse - TISAM_recordset docritiri ("USE DOC KEY 2 SELECT (STATO=#STATO)&&(TIPODOC=#TIPODOC)&&(CODINDSP=#CODINDSP)\nFROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#DAANNO DATADOC=#DADATABOLLA CODNUM=#CODNUM\nTO TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#AANNO DATADOC=#ADATABOLLA CODNUM=#CODNUM"); - docritiri.set_var("#STATO",TVariant(stato)); + TISAM_recordset docritiri ("USE DOC KEY 2 SELECT (STATO!=#STATO)&&(TIPODOC=#TIPODOC)&&(CODINDSP=#CODINDSP)\nFROM TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#DAANNO DATADOC=#DADATABOLLA CODNUM=#CODNUM\nTO TIPOCF=#TIPOCF CODCF=#CODCF PROVV=#PROVV ANNO=#AANNO DATADOC=#ADATABOLLA CODNUM=#CODNUM"); + docritiri.set_var("#STATO",TVariant(statof)); docritiri.set_var("#TIPODOC",TVariant(tpdoc)); docritiri.set_var("#CODINDSP",codind); docritiri.set_var("#TIPOCF","C"); @@ -376,17 +507,18 @@ void TGenera_documenti_app::scansione_consegne(const long codcli, const long cod docritiri.set_var("#AANNO",aanno); docritiri.set_var("#ADATABOLLA",adatabolla); - //per ogni documento che trovo, aggiorno la quantità + //per ogni documento che trovo, aggiorno la quantità e gli cambio stato for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next()) { TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento calcolo_quantita(doc,'B'); + doc.put(DOC_STATO,statof); //stato di bloccato } return; } ////////////////////////////////////////////////////////////// - //// Metodo per il calcolo delle quantità in bolla //// + //// Metodo per il calcolo delle quantità in bolla //// ////////////////////////////////////////////////////////////// //CALCOLO_QUANTITA: questa funzione scorre tutte le righe documento di una bolla di ritiro, riempiendo un...