Patch level : 10.0 patch 208

Files correlati     : lv2 - lv0 - lvlib - tracciati record
Ricompilazione Demo : [ ]
Commento            :
0001104: Le date di stagionalità nei passaggi per contratto non devono contenere l'anno
Descrizione 	Spiegazione: La stagionalità si intende già all'interno dell'anno ed è un dato che normalmente si protrae di anno in anno
Se lasciato l'anno in queste date, la stagionalità non si potrà riporporre pergli anni successivi. è questo non è corretto.


git-svn-id: svn://10.65.10.50/trunk@18003 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca83 2009-01-12 10:35:20 +00:00
parent 180d418b70
commit fa2a06601c
5 changed files with 62 additions and 28 deletions

View File

@ -1,3 +1,3 @@
164
0
$lvpasplan|0|0|116|0|Tabella passaggi planning per contratto|||
$lvpasplan|0|0|120|0|Tabella passaggi planning per contratto|||

View File

@ -9,8 +9,8 @@ ORDFERM|2|3|0|Indica l'ordine di fermata dell'autista
FREQ|1|2|0|Codice per il calcolo delle consegne
MODPASS|1|1|0|Indica la modalità di passaggio
FLSTAG|8|1|0|Flag che indica se un passaggio è stagionale o meno
DTSTAGIN|5|8|0|Inizio stagionalita'
DTSTAGSC|5|8|0|Fine stagionalita'
DTSTAGIN|1|10|0|Inizio stagionalita'
DTSTAGSC|1|10|0|Fine stagionalita'
ORARPRV|1|5|0|Ora di arrivo prevista
UTCREAZ|1|16|0|Utente d'inserimento
DTCREAZ|5|8|0|Data d'inserimento

View File

@ -189,14 +189,14 @@ BEGIN
MESSAGE TRUE ENABLE,F_S_DASTAG|ENABLE,F_S_ASTAG
END
DATE F_S_DASTAG
STRING F_S_DASTAG 10
BEGIN
PROMPT 15 4 "Valido dal "
FIELD DTSTAGIN
CHECKTYPE REQUIRED
END
DATE F_S_ASTAG
STRING F_S_ASTAG 10
BEGIN
PROMPT 40 4 " al "
FIELD DTSTAGSC

View File

@ -64,15 +64,16 @@ class TGenera_planning_app : public TSkeleton_application
protected:
virtual bool create();
virtual bool destroy();
bool elimina_planning(const TDate& dadata, const TDate& adata) const;
bool elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi) const;
bool elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf) const;
bool elimina_planning(const TDate& dadata, const TDate& adata, const bool elimina) const;
bool elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi, const bool elimina) const;
bool elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf, const bool elimina) const;
bool kill_planning (TISAM_recordset& selrighe) const;
int prossimo_codriga(const TDate& data);
TDate cerca_ultima_consegna(long codcf, long codcont, const TDate& data) const;
int conta_consegne_mese(long codcf, long codcont, const TDate& adata) const;
void arrotonda_al_giorno(TDate& data, const int ggcons) const;
void elabora_passaggio(const TDate& dadata, const TDate& adata, const TISAM_recordset& pplan);
const TDate str2date(const TString& data, int year) const;
public:
bool transfer();
@ -97,14 +98,16 @@ bool TGenera_planning_app::destroy()
////////////////////////////////////////////////////////////////
//ELIMINA_PLANNING: funzione che estrae dalla tabella dei planning tutte le righe comprese tra le due date indicate
bool TGenera_planning_app::elimina_planning(const TDate& dadata, const TDate& adata) const
bool TGenera_planning_app::elimina_planning(const TDate& dadata, const TDate& adata, const bool elimina_manuali) const
{
//creo il recordset
TISAM_recordset selrighe("USE LVRCONSPLAN KEY 2\nFROM DTCONS=#DADATA\nTO DTCONS=#ADATA");
//setto le variabili
selrighe.set_var("#DADATA",dadata);
selrighe.set_var("#ADATA",adata);
TString query;
if (elimina_manuali)
query << "USE LVRCONSPLAN KEY 2\nFROM DTCONS=" << dadata << "\nTO DTCONS=" << adata;
else
query << "USE LVRCONSPLAN KEY 2 SELECT CONSSTD!=\"\"\nFROM DTCONS=" << dadata << "\nTO DTCONS=" << adata;
TISAM_recordset selrighe(query);
//richiamo la funzione che effettivamente fa la cancellazione delle righe interessate
kill_planning(selrighe);
@ -113,7 +116,7 @@ bool TGenera_planning_app::elimina_planning(const TDate& dadata, const TDate& ad
//ELIMINA_PLANNING_ITINERARIO: funzione che estrae dalla tabella dei planning tutte le righe comprese tra...
//...le due date indicate relative ad un itinerario specifico
bool TGenera_planning_app::elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi) const
bool TGenera_planning_app::elimina_planning_itinerario(const TDate& dadata, const TDate& adata, const long& coditi, const bool elimina_manuali) const
{
TString4 itinerario;
itinerario.format("%03d",coditi);
@ -132,7 +135,7 @@ bool TGenera_planning_app::elimina_planning_itinerario(const TDate& dadata, cons
//ELIMINA_PLANNING_CLIENTE: funzione che estrae dalla tabella dei planning tutte le righe comprese tra
//...le due date indicate relative ad un cliente specifico
bool TGenera_planning_app::elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf) const
bool TGenera_planning_app::elimina_planning_cliente(const TDate& dadata, const TDate& adata, const long& codcf, const bool elimina_manuali) const
{
//creo il recordset
TISAM_recordset selrighe("USE LVRCONSPLAN KEY 2\nSELECT CODCF=#CODCF\nFROM DTCONS=#DADATA\nTO DTCONS=#ADATA");
@ -237,6 +240,21 @@ void TGenera_planning_app::arrotonda_al_giorno(TDate& data, const int ggcons) co
}
}
//STR2DATE: converte una stringa in una data o non inizilizzata o sicuramente valida
const TDate TGenera_planning_app::str2date(const TString& data, int year) const
{
TDate date;
const int g = atoi(data.left(2));
const int m = atoi(data.mid(3,2));
const int a = data.len() < 10 ? year : atoi(data.right(4));
if (m >= 1 && m <= 12 && a > 2000 && g >= 1 && g <= date.last_day(m,a))
date = TDate(g,m,a);
return date;
}
//ELABORA_PASSAGGIO: questa funzione effettivamente genera il passaggio e lo salva nella tabella
void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& adata, const TISAM_recordset& pplan)
{
@ -249,8 +267,10 @@ void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& a
const int ordfer = pplan.get(LVPASPLAN_ORDFERM).as_int(); //ordine di fermata
const TString4 freq = pplan.get(LVPASPLAN_FREQ).as_string(); //codice della tabella di frequenze di consegna
char modpass = pplan.get(LVPASPLAN_MODPASS).as_string()[0]; //modalità di passaggio
const TDate dastag = pplan.get(LVPASPLAN_DTSTAGIN).as_date(); //data di inizio del periodo di stagionalità
const TDate astag = pplan.get(LVPASPLAN_DTSTAGSC).as_date(); //data di fine del periodo di stagionalità
//recupero la data di inizio e fine stagionalità
const TString16 strdastag = pplan.get(LVPASPLAN_DTSTAGIN).as_string();
const TString16 strastag = pplan.get(LVPASPLAN_DTSTAGSC).as_string();
//cache sulle testate dei contratti, selezionati per CODCF e CODCONT
TToken_string keycont;
@ -317,12 +337,18 @@ void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& a
if(lv_is_holiday(d))
continue;
//...e/o in un periodo di stagionalità (se necessario)...
//...e/o in un periodo distagionalità (se necessario)...
////la riga va elaborata se il flag di stagionalità è TRUE
////e se se la data del periodo di stagionalità è coerente
////e la data in considerazione è compresa tra le date della stagionalità
if (flstag && (!astag.ok() || d < dastag || d > astag))
continue;
if (flstag && strdastag.full() && strastag.full())
{
const TDate dastag = str2date(strdastag,d.year());
const TDate astag = str2date(strastag,d.year());
if (!astag.ok() || d < dastag || d > astag)
continue;
}
//...e/o in un periodo di sospensione...
//...per cui c'è da verificare se è da saltare completamente o...
@ -382,13 +408,16 @@ void TGenera_planning_app::elabora_passaggio(const TDate& dadata, const TDate& a
bool TGenera_planning_app::transfer()
{
const TDate dadata = _msk->get(F_DADATA);
const TDate adata = _msk->get(F_ADATA);
const TDate adata = _msk->get(F_ADATA);
TString query = "USE LVPASPLAN";
if (_msk->get(F_CODCF).full())
{
const long codcf = _msk->get_long(F_CODCF);
elimina_planning_cliente(dadata,adata,_msk->get_long(F_CODCF));
if (yesno_box(TR("Si desidera cancellare i giri modificati manualmente?")))
elimina_planning_cliente(dadata,adata,codcf,true);
else
elimina_planning_cliente(dadata,adata,codcf,false);
query << " SELECT CODCF=" << codcf;
}
else if (_msk->get(F_CODITI).full())
@ -396,12 +425,17 @@ bool TGenera_planning_app::transfer()
const long coditi = _msk->get_long(F_CODITI);
TString4 itinerario;
itinerario.format("%03d",coditi);
elimina_planning_itinerario(dadata,adata,coditi);
if (yesno_box(TR("Si desidera cancellare i giri modificati manualmente?")))
elimina_planning_itinerario(dadata,adata,coditi,true);
else
elimina_planning_itinerario(dadata,adata,coditi,false);
query << " SELECT CODITI=" << itinerario;
}
else
elimina_planning(dadata,adata);
if (yesno_box(TR("Si desidera cancellare i giri modificati manualmente?")))
elimina_planning(dadata,adata,true);
else
elimina_planning(dadata,adata,false);
_codriga.destroy(); //azzera il numero delle righe del planning già generati
TISAM_recordset pplan(query);

View File

@ -41,13 +41,13 @@ bool lv_is_holiday(const TDate& data)
cal = new TString(366);
calendari.add(key,cal);
*cal = ini.get("CAL", "lv", anno);
cal->left_just(366);
cal->left_just(366,'-');
}
const TDate primo(1,1,anno);
const long index = data - primo;
return (*cal)[index] != 'X';
return (*cal)[index] == 'X';
}
//funzione che restituisce un codice contratto valido dato cliente, indirizzo di spedizione e data