campo-sirio/ps/ps0920300.cpp
guy 48d079a2c3 Riportate dalla 3.3 personalizzazioni MRP per cliente DB Service
git-svn-id: svn://10.65.10.50/branches/R_10_00@22678 c028cbd2-c16b-5b4b-a496-9718f37d4682
2012-06-18 14:13:00 +00:00

363 lines
10 KiB
C++
Executable File

#include <applicat.h>
#include <automask.h>
#include <progind.h>
#include <reprint.h>
#include <reputils.h>
#include "../db/dblib.h"
#include "../ve/velib.h"
#include "../mr/mrplib.h"
#include "ps0920.h"
#include "ps0920300a.h"
/////////////////////////////////////////////////////////////////////////////
// MASCHERA
/////////////////////////////////////////////////////////////////////////////
class TPianifica_impianti_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
public:
TPianifica_impianti_mask();
virtual ~TPianifica_impianti_mask();
};
TPianifica_impianti_mask::TPianifica_impianti_mask()
: TAutomask("ps0920300a")
{
}
TPianifica_impianti_mask::~TPianifica_impianti_mask()
{
}
bool TPianifica_impianti_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
const int id = o.dlg();
switch (id)
{
case F_ADATA:
if (e == fe_modify)
{
const TDate dadata = get_date(F_DADATA);
const int daanno = dadata.year();
const TDate adata = o.get();
const int aanno = adata.year();
if (daanno != aanno)
return error_box(TR("Le date devono appartenere allo stesso anno!"));
}
break;
default:
break;
}
return true;
}
/////////////////////////////////////////////////////////////////
// APPLICAZIONE
/////////////////////////////////////////////////////////////////
class TPianifica_impianti : public TSkeleton_application
{
TPianifica_impianti_mask * _mask;
TArray _target_dates;
virtual bool check_autorization() const {return false;}
virtual const char * extra_modules() const {return "ve";}
bool find_my_sister_row(const TRiga_documento& source_row, const TString& a_codnum, const TCodice_articolo& son_codartmag,
const TString& a_impianto, TRectype& sister_row, TLog_report& log) const;
void delete_old_docs();
void create_new_docs(TLog_report& log);
protected:
virtual void main_loop();
virtual bool create();
public:
const TPianifica_impianti_mask & mask() const {return *_mask;}
virtual ~TPianifica_impianti();
};
void TPianifica_impianti::delete_old_docs()
{
TDate dadata = _mask->get_date(F_DADATA);
TDate adata = _mask->get_date(F_ADATA);
const int lastday = adata - dadata;
const int anno = dadata.year();
const TString& codnum = _mask->get(F_NUM); //accoppa i documenti con numerazione sorgente
const TString& impianto = _mask->get(F_AIMP); //..e con l'impianto destinazione
TRelation rel_doc(LF_DOC);
TRectype darec(LF_DOC), arec(LF_DOC);
TDate from(1, 1, anno - 1);
TDate to(31, 12, anno);
darec.put(DOC_DATADOC, from);
darec.put(DOC_PROVV, "D");
darec.put(DOC_ANNO, anno);
darec.put(DOC_CODNUM, codnum);
arec.put(DOC_DATADOC, to);
arec.put(DOC_PROVV, "D");
arec.put(DOC_ANNO, anno);
arec.put(DOC_CODNUM, codnum);
TString filtro;
filtro << "CODNUM='" << codnum << "'";
TCursor cur_doc (&rel_doc, filtro, 3, &darec, &arec);
const long items = cur_doc.items();
cur_doc.freeze();
TProgind progind(items, "Eliminazione vecchi documenti in corso...", false, true);
dadata = (TDate&) _target_dates[0];
adata = (TDate&) _target_dates[lastday];
for (cur_doc = 0; cur_doc.pos() < items; ++cur_doc)
{
progind.addstatus(1);
TDocumento doc(cur_doc.curr());
//trovato un documento che soddisfa il darec/arec deve eliminarlo se la prima riga ha impianto..
//..uguale a quello nel campo F_AIMP sulla maschera
const TDate h_datacons = doc.get_date(DOC_DATACONS);
bool imp_ok =false, datacons_ok = false;
for (int i = 1; i <= doc.physical_rows(); i++)
{
const TRiga_documento& rigadoc = doc[i];
if (rigadoc.get(RDOC_IMPIANTO) == impianto)
imp_ok = true;
const TDate datacons = rigadoc.get_date(RDOC_DATACONS);
if (datacons.ok())
datacons_ok = (datacons >= dadata) && (datacons <= adata);
else
datacons_ok = (h_datacons >= dadata) && (h_datacons <= adata);
if (imp_ok && datacons_ok)
{
doc.remove();
break;
}
} //for(int i =...
} //for(cur_doc..
}
void TPianifica_impianti::create_new_docs(TLog_report& log)
{
const TDate dadata = _mask->get_date(F_DADATA);
const TDate adata = _mask->get_date(F_ADATA);
const int anno = dadata.year();
const TString& codnum = _mask->get(F_NUM); //crea documenti con numerazioni sorgenti...
const TString& da_impianto = _mask->get(F_DAIMP); //..con l'impianto sorgente! (conserva la supersimmetria)
//questi servono dopo!!!
const TString& a_impianto = _mask->get(F_AIMP);
TRelation rel_doc(LF_DOC);
TRectype darec(LF_DOC), arec(LF_DOC);
TLocalisamfile db(LF_RDIST);
TDate from(1, 1, anno - 1);
TDate to(31, 12, anno);
db.setkey(2);
darec.put(DOC_DATADOC, from);
darec.put(DOC_PROVV, "D");
darec.put(DOC_ANNO, anno);
darec.put(DOC_CODNUM, codnum);
arec.put(DOC_DATADOC, to);
arec.put(DOC_PROVV, "D");
arec.put(DOC_ANNO, anno);
arec.put(DOC_CODNUM, codnum);
TString filtro;
TDistinta_tree albero;
filtro << "CODNUM='" << codnum << "'";
TCursor cur_doc (&rel_doc, filtro, 3, &darec, &arec);
const long items = cur_doc.items();
cur_doc.freeze();
TProgind progind(items, "Generazione nuovi documenti in corso...", false, true);
for (cur_doc = 0; cur_doc.pos() < items; ++cur_doc)
{
progind.addstatus(1);
TDocumento doc(cur_doc.curr());
TDocumento nuovo_doc('D', anno, codnum, 0);
// crea un documento...
nuovo_doc.copy_data(nuovo_doc, doc);
nuovo_doc.put(DOC_TIPODOC, codnum); //il tipo deve corrispondere alla numerazione!
nuovo_doc.put(DOC_STATO, 2);
TDate datadoc = nuovo_doc.get(DOC_DATADOC);
TDate h_datacons = nuovo_doc.get(DOC_DATACONS);
if (h_datacons < dadata || h_datacons > adata)
continue;
TDate datacons = h_datacons;
const int ndays = datacons - dadata;
if (ndays > 365)
continue;
datacons = (TDate &)_target_dates[ndays];
nuovo_doc.put(DOC_DATACONS, datacons);
for (int i = 1; i <= doc.rows(); i++)
{
const TRiga_documento& source_row = doc[i]; //riga del documento sorgente
const TString80 codice(source_row.get(RDOC_CODARTMAG));
//il casino va fatto solo se la riga non e' gia' evasa, l'impianto e' quello selezionato e la riga e' riga articolo
if (source_row.get(RDOC_IMPIANTO) == da_impianto && source_row.is_articolo())
{
db.zero();
db.put("CODCOMP", codice);
const int err = db.read(_isgteq);
if (err == NOERR && codice == db.get("CODCOMP"))
{
const TCodice_articolo dest_codart = db.get("CODDIST");
TArray labors;
bool found = false;
albero.set_root(dest_codart);
for (TRiga_esplosione * l = albero.first_labor(labors); l != NULL && !found; l = albero.next_labor(labors))
{
TLavorazione * lav = TDistinta_tree::find_labor(l);
if (lav != NULL && a_impianto == lav->cod_impianto(0))
{
const int priority = source_row.get_int(RDOC_PRIORITY);
TDate datacons = source_row.get_date(RDOC_DATACONS);
if (!datacons.ok())
datacons = h_datacons;
const int ndays = datacons - dadata;
datacons = (TDate &)_target_dates[ndays];
if (datacons < dadata || datacons > adata)
continue;
//..e la sua riga vuota
TRiga_documento& nuova_rigadoc = nuovo_doc.new_row(source_row.get(RDOC_TIPORIGA));
//riempie la nuova riga
nuovo_doc.copy_data(nuova_rigadoc, source_row);
nuova_rigadoc.put(RDOC_CODART, dest_codart);
nuova_rigadoc.put(RDOC_CODARTMAG, dest_codart);
nuova_rigadoc.put(RDOC_PRIORITY, priority);
nuova_rigadoc.zero(nuova_rigadoc.field_qtaevasa());
nuova_rigadoc.zero(RDOC_RIGAEVASA);
datacons = source_row.get_date(RDOC_DATACONS);
if (datacons.ok())
{
datacons = (TDate &)_target_dates[ndays];
nuova_rigadoc.put(RDOC_DATACONS, datacons);
}
nuova_rigadoc.put(RDOC_IMPIANTO, a_impianto);
const TString &linea = lav->cod_linea(0);
nuova_rigadoc.put(RDOC_LINEA, linea);
found = true;
}
}
}
} //if(source_row.get...
} //for(int i...
if (nuovo_doc.physical_rows() > 0)
{
int err = nuovo_doc.write();
if (err != NOERR)
{
TString errore;
errore.format("Errore %d nella scrittura del documento %ld", err, nuovo_doc.get_long(DOC_NDOC));
log.log(2, errore);
}
}
} //for(cur_doc...
}
void TPianifica_impianti::main_loop()
{
while (_mask->run() == K_ENTER)
{
TDate dadata = _mask->get_date(F_DADATA);
TDate adata = _mask->get_date(F_ADATA);
TDate data, end_date;
const TString8 impianto = _mask->get(F_AIMP);
const TString8 linea = _mask->get(F_LIN);
TMRP_calendar c(linea, impianto);
int ndays = adata - dadata + 1;
const int ritardo = _mask->get_int(F_RITARDO);
int min, max;
data = dadata;
end_date = dadata;
end_date += ritardo;
if (!data.is_holiday() && data.wday() != 6)
{
c.turni(end_date, min, max);
while (max == 0 || end_date.is_holiday() || end_date.wday() == 6)
c.turni(++end_date, min, max);
}
_target_dates.add(end_date, 0);
for (int i = 1; i < 366; i++)
{
data = dadata;
data += i;
end_date = (TDate &) _target_dates[i - 1];
++end_date;
if (!data.is_holiday() && data.wday() != 6)
{
c.turni(end_date, min, max);
while (max == 0 || end_date.is_holiday() || end_date.wday() == 6)
{
++end_date;
c.turni(end_date, min, max);
}
}
else
if (end_date - data > ritardo)
--end_date;
_target_dates.add(end_date, i);
}
delete_old_docs(); //intanto accoppa i vecchi documenti di tipo destinazione
//poi crea i nuovi documenti di produzione
TLog_report log("Errori generazione documenti pianificazione");
create_new_docs(log);
TReport_book buc;
buc.add(log);
buc.preview();
}
}
bool TPianifica_impianti::create()
{
open_files(LF_TAB, LF_TABCOM, LF_DOC, LF_RIGHEDOC, LF_DIST, LF_RDIST, LF_ANAMAG, NULL);
_mask = new TPianifica_impianti_mask;
return TSkeleton_application:: create();
}
TPianifica_impianti::~TPianifica_impianti()
{
delete _mask;
}
TPianifica_impianti & app() { return (TPianifica_impianti&) main_app();}
int ps0920300(int argc, char* argv[])
{
TPianifica_impianti a;
a.run(argc, argv, "Pianificazione impianti");
return 0;
}