Patch level : 10.0 patch 4??
Files correlati : lv2 Ricompilazione Demo : [ ] Commento : Corretta generazione automatica bolle per gestire correttamente "fino a" e per salvare correttamente il codice itinerario Tolte alcune variabili di debug rimaste precedentemente in giro git-svn-id: svn://10.65.10.50/trunk@19243 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
87bd9edd52
commit
ec0d74b604
440
lv/lv2400.cpp
440
lv/lv2400.cpp
@ -17,23 +17,22 @@
|
|||||||
#include "lv2400a.h"
|
#include "lv2400a.h"
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
//// TGENERA_DOCUMENTI_MASK ////
|
//// TGENERA_DOCUMENTI_MSK ////
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
|
|
||||||
//classe TGenera_documenti_mask
|
//classe TGenera_documenti_msk
|
||||||
class TGenera_documenti_mask : public TAutomask
|
class TGenera_documenti_msk : public TAutomask
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
||||||
TGenera_documenti_mask (const char* name) : TAutomask(name) {}
|
TGenera_documenti_msk (const char* name) : TAutomask(name) {}
|
||||||
};
|
};
|
||||||
|
|
||||||
//ON_FIELD_EVENT: questo metodo gestisce i vari eventi che si verificano sui campi della maschera
|
//ON_FIELD_EVENT: questo metodo gestisce i vari eventi che si verificano sui campi della maschera
|
||||||
bool TGenera_documenti_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
bool TGenera_documenti_msk::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
//// TGENERA_DOCUMENTI_APP ////
|
//// TGENERA_DOCUMENTI_APP ////
|
||||||
//////////////////////////////////////
|
//////////////////////////////////////
|
||||||
@ -41,7 +40,7 @@ bool TGenera_documenti_mask::on_field_event(TOperable_field& o, TField_event e,
|
|||||||
//classe TGenera_documenti_app
|
//classe TGenera_documenti_app
|
||||||
class TGenera_documenti_app : public TSkeleton_application
|
class TGenera_documenti_app : public TSkeleton_application
|
||||||
{
|
{
|
||||||
TGenera_documenti_mask* _msk;
|
TGenera_documenti_msk* _msk;
|
||||||
TAssoc_array _quantita;
|
TAssoc_array _quantita;
|
||||||
TAssoc_array _quantita_ritirata;
|
TAssoc_array _quantita_ritirata;
|
||||||
TConfig* _configlv;
|
TConfig* _configlv;
|
||||||
@ -60,7 +59,7 @@ private:
|
|||||||
void cambia_stato(const char ritoant, const TString_array& docarr);
|
void cambia_stato(const char ritoant, const TString_array& docarr);
|
||||||
void elimina_bolle(const long codcli, const long codind, TString_array& docarr);
|
void elimina_bolle(const long codcli, const long codind, TString_array& docarr);
|
||||||
//Metodi per la scansione dei documenti
|
//Metodi per la scansione dei documenti
|
||||||
int scansione_ritiri_anticipi(const long codcli, const long codind, const char ritoant, const TDocumento& docgen);
|
int scansione_ritiri_anticipi(const long codcli, const TDate& data, const char ritoant, const TDocumento& docgen);
|
||||||
void scansione_consegne(const long codcli, const long codind, const TDocumento& docgen);
|
void scansione_consegne(const long codcli, const long codind, const TDocumento& docgen);
|
||||||
//Metodo per il calcolo delle quantità in bolla
|
//Metodo per il calcolo delle quantità in bolla
|
||||||
void calcolo_quantita(const TDocumento& doc, const char ritoant);
|
void calcolo_quantita(const TDocumento& doc, const char ritoant);
|
||||||
@ -85,7 +84,7 @@ public:
|
|||||||
bool TGenera_documenti_app::create()
|
bool TGenera_documenti_app::create()
|
||||||
{
|
{
|
||||||
open_files(LF_DOC, LF_RIGHEDOC, 0);
|
open_files(LF_DOC, LF_RIGHEDOC, 0);
|
||||||
_msk = new TGenera_documenti_mask("lv2400a");
|
_msk = new TGenera_documenti_msk("lv2400a");
|
||||||
_ndoc = 0;
|
_ndoc = 0;
|
||||||
|
|
||||||
_configlv = new TConfig(CONFIG_DITTA,"lv");
|
_configlv = new TConfig(CONFIG_DITTA,"lv");
|
||||||
@ -121,11 +120,11 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
|||||||
const TDate datagen(TODAY);
|
const TDate datagen(TODAY);
|
||||||
|
|
||||||
//per ogni planning recupero i dati di interesse dal planning
|
//per ogni planning recupero i dati di interesse dal planning
|
||||||
const long codcli = plan.get(LVRCONSPLAN_CODCF).as_int();
|
const long codcli = plan.get(LVRCONSPLAN_CODCF).as_int();
|
||||||
const long codcont = plan.get(LVRCONSPLAN_CODCONT).as_int();
|
const long codcont = plan.get(LVRCONSPLAN_CODCONT).as_int();
|
||||||
const TDate dtcons = plan.get(LVRCONSPLAN_DTCONS).as_date(); //che è anche la data documento
|
const TDate dtcons = plan.get(LVRCONSPLAN_DTCONS).as_date(); //che è anche la data documento
|
||||||
const char modpas = plan.get(LVRCONSPLAN_MODPASS).as_string()[0];
|
const char modpas = plan.get(LVRCONSPLAN_MODPASS).as_string()[0];
|
||||||
|
const int coditi = plan.get(LVRCONSPLAN_CODITI).as_int();
|
||||||
const int anno = dtcons.year();
|
const int anno = dtcons.year();
|
||||||
|
|
||||||
//preparo la chiave per la tabella contratti
|
//preparo la chiave per la tabella contratti
|
||||||
@ -138,23 +137,13 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
|||||||
const long codind = tcont.get_long(LVCONDV_CODINDSP); //codice dell'indirizzo di spedizione
|
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
|
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
|
|
||||||
|
|
||||||
/*TString_array docarr; //array che conterrà i riferimenti ai documenti da cancellare
|
|
||||||
elimina_bolle(codcli, codind, docarr);
|
|
||||||
cambia_stato('R', docarr);
|
|
||||||
cambia_stato('A', docarr);*/
|
|
||||||
|
|
||||||
//variabili che conterranno i parametri dei documenti che devo generare...
|
//variabili che conterranno i parametri dei documenti che devo generare...
|
||||||
//...settati dalla funzione numerazione_ddt()
|
//...settati dalla funzione numerazione_ddt()
|
||||||
TString4 codnum;
|
TString4 codnum;
|
||||||
TString4 tpdoc;
|
TString4 tpdoc;
|
||||||
TString4 statoi;
|
TString4 statoi;
|
||||||
TString4 statof;
|
TString4 statof;
|
||||||
|
|
||||||
//se non trovo quale documento generare, evito il resto dell'elaborazione
|
//se non trovo quale documento generare, evito il resto dell'elaborazione
|
||||||
if (!numerazione_ddt(codnum, tpdoc, statoi, statof))
|
if (!numerazione_ddt(codnum, tpdoc, statoi, statof))
|
||||||
return NOERR;
|
return NOERR;
|
||||||
@ -168,41 +157,26 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
|||||||
TISAM_recordset bolle(query2);
|
TISAM_recordset bolle(query2);
|
||||||
bolle.move_last();
|
bolle.move_last();
|
||||||
_ndoc = bolle.get(DOC_NDOC).as_int();
|
_ndoc = bolle.get(DOC_NDOC).as_int();
|
||||||
}
|
}
|
||||||
|
|
||||||
//creo il documento corretto riempiendo i campi che già conosco
|
//creo il documento corretto riempiendo i campi che già conosco
|
||||||
TDocumento doc('D', anno, codnum, ++_ndoc);
|
TDocumento doc('D', anno, codnum, ++_ndoc);
|
||||||
doc.put(DOC_TIPODOC, tpdoc);
|
doc.put(DOC_TIPODOC, tpdoc);
|
||||||
|
doc.put(DOC_DATADOC, dtcons);
|
||||||
|
doc.put(DOC_TIPOCF, 'C');
|
||||||
|
doc.put(DOC_CODCF, codcli);
|
||||||
|
doc.put(DOC_CODCONT, codcont);
|
||||||
|
doc.put("DATAGEN", datagen); //data generazione del documento
|
||||||
|
doc.put("DATAPRCO", dtcons); //data prevista consegna
|
||||||
|
doc.put("CODITI", coditi); //codice itinerario
|
||||||
|
|
||||||
//calcola tutte le quantità riportate sui documenti di ritiro, sui documenti di anticipo e sulle bolle di consegna
|
//calcola tutte le quantità riportate sui documenti di ritiro, sui documenti di anticipo
|
||||||
//...eventualmente modificate a mano
|
int numerodoc = scansione_ritiri_anticipi(codcli, dtcons, 'R', doc);
|
||||||
int numerodoc = scansione_ritiri_anticipi(codcli, codind, 'R', doc);
|
scansione_ritiri_anticipi(codcli, dtcons, 'A', doc);
|
||||||
//scansione_ritiri_anticipi(codcli, codind,'A', doc);
|
|
||||||
//scansione_consegne(codcli, codind, doc);
|
|
||||||
|
|
||||||
int err = 1;
|
int err = 1;
|
||||||
if(numerodoc > 0)
|
if(numerodoc > 0)
|
||||||
{
|
{
|
||||||
//se non trovo quale documento generare, evito il resto dell'elaborazione
|
|
||||||
if (!numerazione_ddt(codnum, tpdoc, statoi, statof))
|
|
||||||
return NOERR;
|
|
||||||
|
|
||||||
doc.put(DOC_STATO, statoi);
|
|
||||||
doc.put(DOC_TIPODOC, tpdoc);
|
|
||||||
doc.put(DOC_DATADOC, dtcons);
|
|
||||||
doc.put(DOC_TIPOCF, 'C');
|
|
||||||
doc.put(DOC_CODCF, codcli);
|
|
||||||
doc.put(DOC_CODCONT, codcont);
|
|
||||||
|
|
||||||
//per evitare che ci metta uno zero
|
|
||||||
if (codind > 0)
|
|
||||||
doc.put(DOC_CODINDSP, codind);
|
|
||||||
|
|
||||||
doc.put("DATAGEN", datagen);
|
|
||||||
doc.put("DATAPRCO", dtcons);
|
|
||||||
|
|
||||||
const long ndoc = doc.get_long(DOC_NDOC);
|
|
||||||
|
|
||||||
FOR_EACH_ASSOC_OBJECT(_quantita,h,codart,obj)
|
FOR_EACH_ASSOC_OBJECT(_quantita,h,codart,obj)
|
||||||
{
|
{
|
||||||
//preparo la chiave per la tabella righe contratti
|
//preparo la chiave per la tabella righe contratti
|
||||||
@ -214,7 +188,7 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
|||||||
const TDate dadata = (TDate)rcont.get(LVRCONDV_INDTTMP);
|
const TDate dadata = (TDate)rcont.get(LVRCONDV_INDTTMP);
|
||||||
const TDate adata = (TDate)rcont.get(LVRCONDV_FIDTTMP);
|
const TDate adata = (TDate)rcont.get(LVRCONDV_FIDTTMP);
|
||||||
|
|
||||||
if (dadata.ok() && dtcons == adata)
|
if (dadata.ok() && dtcons >= adata)
|
||||||
crea_riga(codart, modpas, tplis, true, prinbo, doc, rep);
|
crea_riga(codart, modpas, tplis, true, prinbo, doc, rep);
|
||||||
else
|
else
|
||||||
crea_riga(codart, modpas, tplis, false, prinbo, doc, rep);
|
crea_riga(codart, modpas, tplis, false, prinbo, doc, rep);
|
||||||
@ -231,7 +205,7 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
|||||||
TLocalisamfile& f = plan.cursor()->file();
|
TLocalisamfile& f = plan.cursor()->file();
|
||||||
f.put(LVRCONSPLAN_ANNO, anno);
|
f.put(LVRCONSPLAN_ANNO, anno);
|
||||||
f.put(LVRCONSPLAN_CODNUM, codnum);
|
f.put(LVRCONSPLAN_CODNUM, codnum);
|
||||||
f.put(LVRCONSPLAN_NDOC, ndoc);
|
f.put(LVRCONSPLAN_NDOC, _ndoc);
|
||||||
f.rewrite();
|
f.rewrite();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -501,12 +475,11 @@ bool TGenera_documenti_app::numerazione_ddt(TString& codnum, TString& tpdoc, TSt
|
|||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//instanzio una cache sulla tabella dei tipi documento (cerco lo stato iniziale)
|
//instanzio una cache sulla tabella dei tipi documento (cerco lo stato iniziale)
|
||||||
const TString& s2 = cache().get("%TIP",tpdoc,"S2");
|
const TString& s2 = cache().get("%TIP",tpdoc,"S2");
|
||||||
statoi = s2.left(1);
|
statoi = s2.left(1);
|
||||||
statof = s2.mid(1,1);
|
statof = s2.mid(1,1);
|
||||||
|
|
||||||
return codnum.full() && tpdoc.full();
|
return codnum.full() && tpdoc.full();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -515,19 +488,23 @@ bool TGenera_documenti_app::numerazione_drit(const int cod, TString& codnum, TSt
|
|||||||
{
|
{
|
||||||
codnum = _configlv->get("NUM_RIT", NULL, cod);
|
codnum = _configlv->get("NUM_RIT", NULL, cod);
|
||||||
tpdoc = _configlv->get("TIPODOC_RIT", NULL, cod);
|
tpdoc = _configlv->get("TIPODOC_RIT", NULL, cod);
|
||||||
|
|
||||||
|
codnum = _configlv->get("NUM_RIT", NULL, cod);
|
||||||
|
tpdoc = _configlv->get("TIPODOC_RIT", NULL, cod);
|
||||||
|
|
||||||
//instanzio una cache sulla tabella tipi documento (cerco lo stato iniziale)
|
//instanzio una cache sulla tabella tipi documento (cerco lo stato iniziale)
|
||||||
const TString& s2 = cache().get("%TIP",tpdoc,"S2");
|
const TString& s2 = cache().get("%TIP",tpdoc,"S2");
|
||||||
statoi = s2.left(1);
|
statoi = s2.left(1);
|
||||||
statof = s2.mid(1,1);
|
statof = s2.mid(1,1);
|
||||||
|
|
||||||
return codnum.full() && tpdoc.full();
|
return codnum.full() && tpdoc.full();
|
||||||
}
|
}
|
||||||
|
|
||||||
//NUMERAZIONE_DANT: questa funzione cerca quali sono i codnum e i tpdoc dei documenti di anticipo
|
//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& statoi, TString& statof) 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);
|
codnum = _configlv->get("NUM_ANT", NULL, cod);
|
||||||
tpdoc = _configlv->get("TIPODOC_ANT",NULL,cod);
|
tpdoc = _configlv->get("TIPODOC_ANT", NULL, cod);
|
||||||
|
|
||||||
//instanzio una cache sulla tabella delle righe contratti (cerco lo stato iniziale)
|
//instanzio una cache sulla tabella delle righe contratti (cerco lo stato iniziale)
|
||||||
const TString& s2 = cache().get("%TIP",tpdoc,"S2");
|
const TString& s2 = cache().get("%TIP",tpdoc,"S2");
|
||||||
statoi = s2.left(1);
|
statoi = s2.left(1);
|
||||||
@ -536,130 +513,23 @@ bool TGenera_documenti_app::numerazione_dant(const int cod, TString& codnum, TSt
|
|||||||
return codnum.full() && tpdoc.full();
|
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 char ritoant, const TString_array& docarr)
|
|
||||||
{
|
|
||||||
//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;
|
|
||||||
|
|
||||||
FOR_EACH_ARRAY_ROW(docarr, r, row);
|
|
||||||
{
|
|
||||||
TToken_string(row);
|
|
||||||
|
|
||||||
TString str;
|
|
||||||
str << "USE DOC\n"
|
|
||||||
<< "FROM PROVV=" << row.get(0) << " ANNO=" << row.get(1) << " CODNUM=" << row.get(2) << " NDOC=" << row.get(3) << "\n"
|
|
||||||
<< "TO PROVV=" << row.get(0) << " ANNO=" << row.get(1) << " CODNUM=" << row.get(2) << " NDOC=" << row.get(3);
|
|
||||||
TISAM_recordset docritiro (str);
|
|
||||||
|
|
||||||
if (!docritiro.empty())
|
|
||||||
{
|
|
||||||
TDocumento doc(docritiro.cursor()->curr()); //instanzio il documento
|
|
||||||
doc.put(DOC_STATO, statoi);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//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, TString_array& docarr)
|
|
||||||
{
|
|
||||||
//recupero dalla maschera i campi di interesse
|
|
||||||
const TDate adatabolla = _msk->get_date(F_DTCONS);
|
|
||||||
const long aanno = adatabolla.year();
|
|
||||||
|
|
||||||
TDate dadatabolla = adatabolla; dadatabolla.set_month(adatabolla.month() - 2);
|
|
||||||
const long daanno = dadatabolla.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
|
|
||||||
TString query;
|
|
||||||
query << "USE DOC "
|
|
||||||
<< "SELECT (TIPOCF=\"C\")&&(CODCF=" << codcli
|
|
||||||
<< ")&&(TIPODOC=\"" << tpdoc << "\")&&(STATO=\"" << statoi <<"\")&&(DATADOC>=" << dadatabolla << ")\n"
|
|
||||||
<< "FROM PROVV=\"D\" ANNO=" << daanno << " CODNUM=\"" << codnum << "\"\n"
|
|
||||||
<< "TO PROVV=\"D\" ANNO=" << aanno << " CODNUM=\"" << codnum << "\"\n";
|
|
||||||
|
|
||||||
TISAM_recordset bolle(query);
|
|
||||||
|
|
||||||
//per ogni documento che trovo, aggiorno la quantità e gli cambio stato
|
|
||||||
for (bool ok = bolle.move_first(); ok; ok = bolle.move_next())
|
|
||||||
{
|
|
||||||
TDocumento doc(bolle.cursor()->curr()); //instanzio il documento
|
|
||||||
|
|
||||||
//salvo la chiave del documento che sto cancellando
|
|
||||||
TToken_string key;
|
|
||||||
key.add(doc.get(DOC_PROVV));
|
|
||||||
key.add(doc.get(DOC_ANNO));
|
|
||||||
key.add(doc.get(DOC_CODNUM));
|
|
||||||
key.add(doc.get(DOC_NDOC));
|
|
||||||
docarr.add(key);
|
|
||||||
|
|
||||||
doc.remove(); //stato di bloccato
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
//// Metodi per la scansione dei documenti ////
|
//// Metodi per la scansione dei documenti ////
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
//SCANSIONE_RITIRI_ANTICIPI: questa funzione cerca tutte le bolle di ritiro relative a un certo cliente non ancora evase...
|
//SCANSIONE_RITIRI_ANTICIPI: questa funzione cerca tutte le bolle di ritiro relative a un certo cliente non ancora evase...
|
||||||
//e, dopo l'elaborazione, gli cambia stato
|
//e, dopo l'elaborazione, gli cambia stato
|
||||||
int TGenera_documenti_app::scansione_ritiri_anticipi(const long codcli, const long codind, const char ritoant, const TDocumento& docgen)
|
int TGenera_documenti_app::scansione_ritiri_anticipi(const long codcli, const TDate& data, const char ritoant, const TDocumento& docgen)
|
||||||
{
|
{
|
||||||
//recupero dalla maschera i campi di interesse
|
const long aanno = data.year();
|
||||||
const TDate adatabolla = _msk->get_date(F_DTCONS);
|
TDate dadata = data; dadata.addmonth(-1);
|
||||||
const long aanno = adatabolla.year();
|
const long daanno = dadata.year();
|
||||||
|
|
||||||
TDate dadatabolla = adatabolla; dadatabolla.addmonth(-2);
|
|
||||||
const long daanno = dadatabolla.year();
|
|
||||||
|
|
||||||
TString4 codnum;
|
TString4 codnum;
|
||||||
TString4 tpdoc;
|
TString4 tpdoc;
|
||||||
TString4 statoi;
|
TString4 statoi;
|
||||||
TString4 statof;
|
TString4 statof;
|
||||||
bool err;
|
bool err = NOERR;
|
||||||
//distinguo se sto scandendo i documenti di ritiro o i documenti di anticipo
|
//distinguo se sto scandendo i documenti di ritiro o i documenti di anticipo
|
||||||
switch (ritoant)
|
switch (ritoant)
|
||||||
{
|
{
|
||||||
@ -673,83 +543,39 @@ int TGenera_documenti_app::scansione_ritiri_anticipi(const long codcli, const lo
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!err)
|
||||||
|
return err;
|
||||||
|
|
||||||
//instanzio un recordset che contiene tutti i documenti di interesse
|
//instanzio un recordset che contiene tutti i documenti di interesse
|
||||||
TString query;
|
TString query;
|
||||||
query << "USE DOC "
|
query << "USE DOC "
|
||||||
<< "SELECT (TIPOCF=\"C\")&&(CODCF=" << codcli << ")&&"
|
<< "SELECT (TIPOCF=\"C\")&&(CODCF=" << codcli << ")&&"
|
||||||
<< "(ANSI(G1:DATAPRCO)=#ADATA)&&"
|
<< "(ANSI(G1:DATAPRCO)<=#ADATA)&&"
|
||||||
<< "(STATO=\"" << statoi <<"\")\n"
|
<< "(STATO=\"" << statoi <<"\")\n"
|
||||||
<< "FROM PROVV=\"D\" ANNO=" << daanno << " CODNUM=\"" << codnum << "\"\n"
|
<< "FROM PROVV=\"D\" ANNO=" << daanno << " CODNUM=\"" << codnum << "\"\n"
|
||||||
<< "TO PROVV=\"D\" ANNO=" << aanno << " CODNUM=\"" << codnum << "\"\n";
|
<< "TO PROVV=\"D\" ANNO=" << aanno << " CODNUM=\"" << codnum << "\"\n";
|
||||||
|
|
||||||
//instanzio un recordset che contiene tutti i documenti di interesse
|
//instanzio un recordset che contiene tutti i documenti di interesse
|
||||||
TISAM_recordset docritiri(query);
|
TISAM_recordset docritiri(query);
|
||||||
docritiri.set_var("#ADATA", adatabolla);
|
docritiri.set_var("#ADATA", data);
|
||||||
|
|
||||||
//per ogni documento che trovo, aggiorno la quantità, e poi cambio stato al documento
|
//per ogni documento che trovo, aggiorno la quantità, e poi cambio stato al documento
|
||||||
for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next())
|
for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next())
|
||||||
{
|
{
|
||||||
TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento
|
TDocumento doc(docritiri.cursor()->curr()); //instanzio il documento
|
||||||
calcolo_quantita(doc, ritoant);
|
calcolo_quantita(doc, ritoant);
|
||||||
doc.put(DOC_STATO,statof); //stato di elaborato, preso dallo sheet
|
doc.put(DOC_STATO,statof); //stato di elaborato
|
||||||
//salvo i riferimenti del documento che sto andando a generare
|
//salvo i riferimenti del documento che sto andando a generare
|
||||||
doc.put("PROVVDG", docgen.get(DOC_PROVV));
|
doc.put("PROVVDG", docgen.get(DOC_PROVV));
|
||||||
doc.put("ANNODG", docgen.get(DOC_ANNO));
|
doc.put("ANNODG", docgen.get(DOC_ANNO));
|
||||||
doc.put("CODNUMDG", docgen.get(DOC_CODNUM));
|
doc.put("CODNUMDG", docgen.get(DOC_CODNUM));
|
||||||
doc.put("NDCODG", docgen.get(DOC_NDOC));
|
doc.put("NDCODG", docgen.get(DOC_NDOC));
|
||||||
|
|
||||||
doc.rewrite();
|
doc.rewrite();
|
||||||
|
|
||||||
}
|
}
|
||||||
return docritiri.items();
|
return docritiri.items();
|
||||||
}
|
}
|
||||||
|
|
||||||
//SCANSIONE_CONSEGNE: questa funzione cerca tutte le bolle di consegna relative a un certo cliente ancora...
|
|
||||||
//nello stato iniziale in un certo intervallo di date
|
|
||||||
void TGenera_documenti_app::scansione_consegne(const long codcli, const long codind, const TDocumento& docgen)
|
|
||||||
{
|
|
||||||
//recupero dalla maschera i campi di interesse
|
|
||||||
const TDate adatabolla = _msk->get_date(F_DTCONS);
|
|
||||||
const long aanno = adatabolla.year();
|
|
||||||
|
|
||||||
TDate dadatabolla = adatabolla; dadatabolla.set_month(adatabolla.month() - 2);
|
|
||||||
const long daanno = dadatabolla.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
|
|
||||||
TString query;
|
|
||||||
query << "USE DOC "
|
|
||||||
<< "SELECT (TIPOCF=\"C\")&&(CODCF=" << codcli
|
|
||||||
<< ")&&(TIPODOC=\"" << tpdoc << "\")&&(STATO=\"" << statoi <<"\")\n"
|
|
||||||
<< "FROM PROVV=\"D\" ANNO=" << daanno << " CODNUM=\"" << codnum << "\"\n"
|
|
||||||
<< "TO PROVV=\"D\" ANNO=" << aanno << " CODNUM=\"" << codnum << "\"\n";
|
|
||||||
//instanzio un recordset che contiene tutti i documenti di interesse
|
|
||||||
TISAM_recordset docritiri (query);
|
|
||||||
|
|
||||||
//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
|
|
||||||
//salvo i riferimenti del documento che sto andando a generare
|
|
||||||
doc.put("PROVVDG", docgen.get(DOC_PROVV));
|
|
||||||
doc.put("ANNODG", docgen.get(DOC_ANNO));
|
|
||||||
doc.put("CODNUMDG", docgen.get(DOC_CODNUM));
|
|
||||||
doc.put("NDCODG", docgen.get(DOC_NDOC));
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
//// Metodo per il calcolo delle quantità in bolla ////
|
//// Metodo per il calcolo delle quantità in bolla ////
|
||||||
//////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////
|
||||||
@ -799,14 +625,7 @@ void TGenera_documenti_app::calcolo_quantita(const TDocumento& doc, const char r
|
|||||||
break;
|
break;
|
||||||
case 'A':
|
case 'A':
|
||||||
*qta -= art.convert_to_um(qtardoc, NULL, rdoc.get(RDOC_UMQTA));
|
*qta -= art.convert_to_um(qtardoc, NULL, rdoc.get(RDOC_UMQTA));
|
||||||
break;
|
break;
|
||||||
case 'B':
|
|
||||||
{
|
|
||||||
const real qtagg3 = rdoc.get_real(RDOC_QTAGG3);
|
|
||||||
real modifica = qtardoc - qtagg3;
|
|
||||||
*qta -= art.convert_to_um(modifica, NULL, rdoc.get(RDOC_UMQTA));
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -833,100 +652,97 @@ void TGenera_documenti_app::aggiorna_conguaglio(TRectype& rcondv, const real arr
|
|||||||
|
|
||||||
bool TGenera_documenti_app::transfer()
|
bool TGenera_documenti_app::transfer()
|
||||||
{
|
{
|
||||||
//leggo i campi dalla maschera
|
//leggo i dati dalla maschera
|
||||||
const TDate adatacons = _msk->get_date(F_DTCONS);
|
const TDate adata = _msk->get_date(F_DTCONS);
|
||||||
TDate dadatacons = adatacons;
|
|
||||||
dadatacons.addmonth(-2);
|
TDate dadata(TODAY);
|
||||||
|
if (_msk->get_int(F_TPGEN) == 1)
|
||||||
|
dadata = adata;
|
||||||
|
else
|
||||||
|
++dadata;
|
||||||
|
|
||||||
|
const int daanno = dadata.year();
|
||||||
|
const int aanno = adata.year();
|
||||||
|
|
||||||
const long coditi = _msk->get_long(F_CODITI);
|
const long coditi = _msk->get_long(F_CODITI);
|
||||||
|
const long codaut = _msk->get_long(F_CODAUT);
|
||||||
|
|
||||||
long codcli = _msk->get_long(F_CODCF);
|
long codcli = _msk->get_long(F_CODCF);
|
||||||
long codaut = _msk->get_long(F_CODAUT);
|
|
||||||
|
|
||||||
int daanno = dadatacons.year();
|
|
||||||
int aanno = adatacons.year();
|
|
||||||
|
|
||||||
TString4 codnum;
|
|
||||||
TString4 tpdoc;
|
|
||||||
TString4 statoi;
|
|
||||||
TString4 statof;
|
|
||||||
// bool err;
|
|
||||||
|
|
||||||
TLog_report rep("Articoli non in contratto");
|
TLog_report rep("Articoli non in contratto");
|
||||||
rep.kill_duplicates(true);
|
rep.kill_duplicates(true);
|
||||||
|
|
||||||
numerazione_drit(0, codnum, tpdoc, statoi, statof);
|
//preparo un recordset che contiene tutti planning per cui voglio creare i documenti relativi
|
||||||
|
TString4 codnum;
|
||||||
//instanzio un recordset che contiene tutti i documenti di interesse
|
TString4 tpdoc;
|
||||||
TString query_bolle = "USE DOC\nSELECT ";
|
TString4 statoi;
|
||||||
|
TString4 statof;
|
||||||
if(codcli > 0)
|
numerazione_drit(0, codnum, tpdoc, statoi, statof);
|
||||||
query_bolle << "(TIPOCF=\"C\")&&(CODCF=" << codcli << ")&&";
|
|
||||||
|
|
||||||
if(_msk->get_int(F_TPGEN) == 1)
|
for (dadata; dadata <= adata; ++dadata)
|
||||||
query_bolle << "(ANSI(G1:DATAPRCO)=#ADATA)&&";
|
|
||||||
else
|
|
||||||
query_bolle << "(ANSI(G1:DATAPRCO)<=#ADATA)&&";
|
|
||||||
|
|
||||||
query_bolle << "(STATO=\"" << statoi << "\")\n";
|
|
||||||
|
|
||||||
query_bolle << "FROM PROVV=\"D\" ANNO=" << daanno << " CODNUM=\"" << codnum << "\"\n";
|
|
||||||
query_bolle << "TO PROVV=\"D\" ANNO=" << aanno << " CODNUM=\"" << codnum << "\"\n";
|
|
||||||
|
|
||||||
TISAM_recordset docritiri(query_bolle);
|
|
||||||
docritiri.set_var("#ADATA", adatacons);
|
|
||||||
|
|
||||||
TProgind pi(docritiri.items(), TR("Generazione documenti in corso..."), true, true);
|
|
||||||
|
|
||||||
for (bool ok = docritiri.move_first(); ok; ok = docritiri.move_next())
|
|
||||||
{
|
{
|
||||||
if (!pi.addstatus(1))
|
//per ogni data cerco i documenti e per ogni documento cerco i dati del passaggio
|
||||||
break;
|
TString query;
|
||||||
|
query << "USE DOC "
|
||||||
|
<< "SELECT (ANSI(G1:DATAPRCO)<=#ADATA)&&"
|
||||||
|
<< "(STATO=\"" << statoi <<"\")\n"
|
||||||
|
<< "FROM PROVV=\"D\" ANNO=" << daanno << " CODNUM=\"" << codnum << "\"\n"
|
||||||
|
<< "TO PROVV=\"D\" ANNO=" << aanno << " CODNUM=\"" << codnum << "\"\n";
|
||||||
|
|
||||||
codcli = docritiri.get(DOC_CODCF).as_int();
|
TISAM_recordset docritiri(query);
|
||||||
const TDate data = docritiri.get("G1:DATAPRCO").as_date();
|
docritiri.set_var("#ADATA", adata);
|
||||||
|
|
||||||
//preparo un recordset che contiene tutti planning per cui voglio creare i documenti relativi
|
|
||||||
TString query = "USE LVRCONSPLAN KEY 2";
|
|
||||||
|
|
||||||
if (coditi || codcli || codaut)
|
|
||||||
{
|
|
||||||
query << " SELECT ";
|
|
||||||
if (codcli > 0)
|
|
||||||
query << "(CODCF=" << codcli << ')';
|
|
||||||
if (coditi > 0)
|
|
||||||
{
|
|
||||||
if (codcli > 0)
|
|
||||||
query << "&&";
|
|
||||||
query << "(CODITI=" << coditi << ')';
|
|
||||||
}
|
|
||||||
if (codaut > 0)
|
|
||||||
{
|
|
||||||
if (codcli > 0 || coditi > 0)
|
|
||||||
query << "&&";
|
|
||||||
query << "(CODAUT=" << codaut << ')';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
query << "\n";
|
|
||||||
|
|
||||||
query << "FROM DTCONS=#DATA\n";
|
|
||||||
query << "TO DTCONS=#DATA";
|
|
||||||
|
|
||||||
TISAM_recordset plan(query);
|
|
||||||
plan.set_var("#DATA", data);
|
|
||||||
|
|
||||||
if (plan.move_first())
|
TProgind pi(docritiri.items(), TR("Generazione documenti in corso..."), true, true);
|
||||||
|
|
||||||
|
for(bool ok = docritiri.move_first(); ok; ok = docritiri.move_next())
|
||||||
{
|
{
|
||||||
_quantita.destroy();
|
if (!pi.addstatus(1))
|
||||||
_quantita_ritirata.destroy();
|
break;
|
||||||
crea_documento(plan, rep);
|
|
||||||
|
if (_msk->field(F_CODCF).empty())
|
||||||
|
codcli = docritiri.get(DOC_CODCF).as_int();
|
||||||
|
|
||||||
|
//instanzio un recordset che contiene tutti i documenti di interesse
|
||||||
|
TString query = "USE LVRCONSPLAN KEY 2";
|
||||||
|
query << " SELECT (CODCF=" << codcli << ")";
|
||||||
|
|
||||||
|
if (coditi || codaut)
|
||||||
|
{
|
||||||
|
if (coditi > 0)
|
||||||
|
query << "&&(CODITI=" << coditi << ")";
|
||||||
|
|
||||||
|
if (codaut > 0)
|
||||||
|
query << "&&(CODAUT=" << codaut << ")";
|
||||||
|
}
|
||||||
|
|
||||||
|
query << "\nFROM DTCONS=#DADATA\n";
|
||||||
|
query << "TO DTCONS=#ADATA";
|
||||||
|
|
||||||
|
TISAM_recordset plan(query);
|
||||||
|
plan.set_var("#DADATA", dadata);
|
||||||
|
plan.set_var("#ADATA", dadata);
|
||||||
|
|
||||||
|
if (plan.move_first())
|
||||||
|
{
|
||||||
|
_quantita.destroy();
|
||||||
|
_quantita_ritirata.destroy();
|
||||||
|
crea_documento(plan, rep);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TReport_book buc;
|
if (adata < TODAY)
|
||||||
buc.add(rep);
|
warning_box(TR("Non è stato possibile generare documenti con data prevista consegna nel passato"));
|
||||||
if (buc.pages() > 0)
|
|
||||||
buc.preview();
|
|
||||||
else
|
else
|
||||||
message_box(TR("Generazione terminata"));
|
{
|
||||||
|
TReport_book buc;
|
||||||
|
buc.add(rep);
|
||||||
|
if (buc.pages() > 0)
|
||||||
|
buc.preview();
|
||||||
|
else
|
||||||
|
message_box(TR("Generazione terminata"));
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
void TGenera_documenti_app::main_loop()
|
void TGenera_documenti_app::main_loop()
|
||||||
|
@ -291,8 +291,6 @@ void TAcquisizione_lavanderie_app::elabora_file(const TString& file, TLog_report
|
|||||||
bool found = false;
|
bool found = false;
|
||||||
|
|
||||||
TDocumento& doc = ca.doc(datadoc,codcf);
|
TDocumento& doc = ca.doc(datadoc,codcf);
|
||||||
|
|
||||||
int cazzone = doc.rows();
|
|
||||||
|
|
||||||
//se sto elaborando un nuovo file, ma i documenti che sto importando esistono già, chiedi cosa devo fare
|
//se sto elaborando un nuovo file, ma i documenti che sto importando esistono già, chiedi cosa devo fare
|
||||||
if (doc.rows() > 0 && nuovo_cliente)
|
if (doc.rows() > 0 && nuovo_cliente)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user