Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione AGA 1.7 patch 349 git-svn-id: svn://10.65.10.50/trunk@10708 c028cbd2-c16b-5b4b-a496-9718f37d4682
1672 lines
47 KiB
C++
Executable File
1672 lines
47 KiB
C++
Executable File
#include <execp.h>
|
||
#include "mrplib.h"
|
||
#include "../mg/mglib.h"
|
||
#include "../ve/velib.h"
|
||
#include "../ve/veconf.h"
|
||
|
||
#include "mr2100.h"
|
||
#include "mr2200.h"
|
||
|
||
#include "mr2200a.h"
|
||
|
||
// albero per le ricerche sulle dist
|
||
static TDistinta_tree *_dist_tree=NULL;
|
||
|
||
TDistinta_tree &dist_tree()
|
||
{
|
||
if (!_dist_tree)
|
||
_dist_tree=new TDistinta_tree();
|
||
return *_dist_tree;
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// triga ordine
|
||
///////////////////////////////////////////////////////////
|
||
|
||
TMSP_form::TMSP_form (TIsamtempfile * report) :TForm("mr2200a")
|
||
{
|
||
TRelation* rel = relation();
|
||
rel->replace(report);
|
||
|
||
const int hh = 7;
|
||
const int fl = printer().formlen();
|
||
|
||
int rows[4]; // Righe orizzontali
|
||
rows[0] = hh-3;
|
||
rows[1] = hh;
|
||
rows[2] = fl;
|
||
rows[3] = 0;
|
||
genera_intestazioni(odd_page, hh-2);
|
||
genera_fincatura(odd_page, hh-3, fl, rows);
|
||
|
||
}
|
||
|
||
bool TMSP_form::validate(TForm_item &cf, TToken_string &cmd)
|
||
{
|
||
TString s;
|
||
cmd.get(0,s);
|
||
if (s=="_USER")
|
||
{
|
||
TRelation* rel = relation();
|
||
cmd.get(1,s);
|
||
if (s=="CODART")
|
||
{
|
||
TString val;
|
||
if (rel->lfile().get("TIPO")=="C")
|
||
{
|
||
val="Ordini da soddisfare";
|
||
}
|
||
else if (rel->lfile().get("TIPO")=="G")
|
||
val="Giacenza proiettata";
|
||
else
|
||
val="Ordini pianificati";
|
||
cf.set(val);
|
||
}
|
||
return TRUE;
|
||
}
|
||
return TForm::validate(cf,cmd);
|
||
}
|
||
|
||
TCRP_form::TCRP_form(TIsamtempfile* report, TSheet_field& sf)
|
||
: TForm("mr2200b")
|
||
{
|
||
TRelation* rel = relation();
|
||
rel->replace(report);
|
||
|
||
// Modifica oppportunamente le intestazioni dei bucket
|
||
TPrint_section& body = section('B', odd_page);
|
||
for (word i = 2; i < body.fields(); i++)
|
||
{
|
||
TForm_item& fi = body.field(i);
|
||
fi.set_col_head(sf.get_column_header(i+2));
|
||
}
|
||
|
||
const int hh = 7;
|
||
const int fl = printer().formlen();
|
||
|
||
int rows[4]; // Righe orizzontali
|
||
rows[0] = hh-3;
|
||
rows[1] = hh;
|
||
rows[2] = fl;
|
||
rows[3] = 0;
|
||
genera_intestazioni(odd_page, hh-2);
|
||
genera_fincatura(odd_page, hh-3, fl, rows);
|
||
}
|
||
|
||
bool TCRP_form::validate(TForm_item &cf, TToken_string &cmd)
|
||
{
|
||
TString val;
|
||
cmd.get(0,val);
|
||
if (val=="_USER")
|
||
{
|
||
cmd.get(1,val);
|
||
if (val=="CODART")
|
||
{
|
||
const TRectype& curr = relation()->curr();
|
||
const char type = curr.get_char("TIPO");
|
||
switch (type)
|
||
{
|
||
case 'D': val = " Capacit<69> totale"; break;
|
||
case 'd': val = " Carico totale"; break;
|
||
case 'I': val = " Capacit<69> impianto "; val << curr.get("IMPIANTO"); break;
|
||
case 'i': val = " Carico impianto "; val << curr.get("IMPIANTO"); break;
|
||
case 'L': val = " Capacit<69> linea "; val << curr.get("LINEA"); break;
|
||
case 'l': val = " Carico linea "; val << curr.get("LINEA"); break;
|
||
default:
|
||
val = curr.get("CODART");
|
||
val << " " << relation()->curr(LF_ANAMAG).get("DESCR");
|
||
break;
|
||
}
|
||
cf.set(val);
|
||
}
|
||
return TRUE;
|
||
}
|
||
return TForm::validate(cf,cmd);
|
||
}
|
||
|
||
|
||
int TRiga_articolo::order_comparePCAL(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PCAL);}
|
||
int TRiga_articolo::order_comparePCLA(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PCLA);}
|
||
int TRiga_articolo::order_comparePALC(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PALC);}
|
||
int TRiga_articolo::order_comparePACL(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PACL);}
|
||
int TRiga_articolo::order_comparePLAC(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PLAC);}
|
||
int TRiga_articolo::order_comparePLCA(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PLCA);}
|
||
int TRiga_articolo::order_compareCAL(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_CAL);}
|
||
int TRiga_articolo::order_compareCLA(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_CLA);}
|
||
int TRiga_articolo::order_compareALC(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_ALC);}
|
||
int TRiga_articolo::order_compareACL(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_ACL);}
|
||
int TRiga_articolo::order_compareLAC(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_LAC);}
|
||
int TRiga_articolo::order_compareLCA(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_LCA);}
|
||
int TRiga_articolo::order_comparePCA(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PCA);}
|
||
int TRiga_articolo::order_compareCA(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_CA);}
|
||
int TRiga_articolo::order_compareAC(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_AC);}
|
||
int TRiga_articolo::order_comparePAC(TSheet_field & s, int i1, int i2)
|
||
{ return TRiga_articolo::order_compare(s, i1, i2,SORT_BY_PAC);}
|
||
|
||
|
||
///////////////////////////////////////////////////////////
|
||
int TRiga_articolo::find_block_constr(const TSheet_field& sf, const int riga)
|
||
{
|
||
const int narticoli=sf.items();
|
||
const int b1 = sf.cid2index(F_BUCKET1);
|
||
int first_row;
|
||
for (first_row = riga; first_row > 0; first_row--)
|
||
{
|
||
if (sf.cell_disabled(first_row, b1))
|
||
break;
|
||
}
|
||
if (first_row+1 < narticoli && sf.cell_disabled(first_row+1, b1)) first_row++;
|
||
return first_row;
|
||
}
|
||
// ritorna se tutto OK
|
||
bool TRiga_articolo::find_block(const TSheet_field& sf, const int riga, int &first_row, int &last_row )
|
||
{
|
||
const int narticoli=sf.items();
|
||
if (narticoli<=riga)
|
||
return FALSE;
|
||
// Calcola l'indice c della riga coi vincoli
|
||
const int b1 = sf.cid2index(F_BUCKET1);
|
||
|
||
first_row = find_block_constr(sf, riga);
|
||
// Calcola l'indice r dell'ultima riga articoli
|
||
last_row = riga;
|
||
if (last_row <= first_row) last_row=first_row+1;
|
||
for ( ; last_row < narticoli-1; last_row++)
|
||
{
|
||
if (sf.cell_disabled(last_row+1, b1))
|
||
break;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
int TRiga_articolo::order_compare( const TToken_string &r1 , const TToken_string &r2 , int level, bool ascending)
|
||
{
|
||
TString80 str0, str1;
|
||
int cmp = 0;
|
||
|
||
if (level>=0)
|
||
{
|
||
|
||
for (int i = 2; i <= level && cmp == 0; i++)
|
||
{
|
||
r1.get(i, str0);
|
||
r2.get(i, str1);
|
||
cmp=TRiga_articolo::compare_field(str0,str1,short(i+FIRST_FIELD));
|
||
}
|
||
} else {
|
||
// ordinamenti non standard
|
||
short f;
|
||
static const short fields_ACL[] = {F_PRIORITA, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA};
|
||
static const short fields_ALC[] = {F_PRIORITA, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE,F_PRIORITA};
|
||
static const short fields_LAC[] = {F_PRIORITA, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_CLIENTE,F_PRIORITA};
|
||
static const short fields_LCA[] = {F_PRIORITA, F_SORTCODIMP, F_SORTCODLIN, F_CLIENTE, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4,F_PRIORITA};
|
||
static const short fields_CLA[] = {F_PRIORITA, F_CLIENTE, F_SORTCODIMP, F_SORTCODLIN, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4,F_PRIORITA};
|
||
static const short fields_CAL[] = {F_PRIORITA, F_CLIENTE, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_SORTCODIMP, F_SORTCODLIN,F_PRIORITA};
|
||
static const short fields_CA[] = {F_PRIORITA, F_CLIENTE, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_PRIORITA, F_PRIORITA, F_PRIORITA};
|
||
static const short fields_AC[] = {F_PRIORITA, F_ARTICOLO,F_LIV1,F_LIV2,F_LIV3,F_LIV4, F_CLIENTE, F_PRIORITA, F_PRIORITA, F_PRIORITA};
|
||
for (int ii = 0; ii < 8 && cmp == 0; ii++)
|
||
{
|
||
const int i = ii + (-level <= SORT_BY_PRIORITY ? 0 : 1);
|
||
switch (level)
|
||
{
|
||
case SORT_BY_PCAL:
|
||
case SORT_BY_CAL:
|
||
f=fields_CAL[i]; break;
|
||
case SORT_BY_PCLA:
|
||
case SORT_BY_CLA:
|
||
f=fields_CLA[i]; break;
|
||
case SORT_BY_PLCA:
|
||
case SORT_BY_LCA:
|
||
f=fields_LCA[i]; break;
|
||
case SORT_BY_PLAC:
|
||
case SORT_BY_LAC:
|
||
f=fields_LAC[i]; break;
|
||
case SORT_BY_PACL:
|
||
case SORT_BY_ACL:
|
||
f=fields_ACL[i]; break;
|
||
case SORT_BY_PALC:
|
||
case SORT_BY_ALC:
|
||
f=fields_ALC[i]; break;
|
||
case SORT_BY_PAC:
|
||
case SORT_BY_AC:
|
||
f=fields_AC[i]; break;
|
||
case SORT_BY_PCA:
|
||
case SORT_BY_CA:
|
||
f=fields_CA[i]; break;
|
||
default:
|
||
NFCHECK("Ordinamento sconosciuto");
|
||
break;
|
||
}
|
||
r1.get(f-FIRST_FIELD, str0);
|
||
r2.get(f-FIRST_FIELD, str1);
|
||
cmp=TRiga_articolo::compare_field(str0,str1,f) * (ascending && f != F_PRIORITA ? 1 : -1);
|
||
}
|
||
}
|
||
return cmp;
|
||
}
|
||
|
||
|
||
// aggiunge li codici di linea/impianto se non presenti usando i default sulle lavorazioni critiche
|
||
// cio' permette di ordinare per impianto anche le linee di ordine che non hanno solitamente
|
||
// questa indicazione ma solo il codice articolo
|
||
void complete_codlinea(TToken_string &r2, bool ignore_imp)
|
||
{
|
||
TString8 swp;
|
||
r2.get(F_SORTCODLIN-FIRST_FIELD,swp);
|
||
if (swp.blank())
|
||
{
|
||
r2.get(F_CODLIN-FIRST_FIELD,swp);
|
||
if (swp.blank())
|
||
{
|
||
if (dist_tree().set_root(r2.get(F_ARTICOLO-FIRST_FIELD)))
|
||
{
|
||
TString codimp(r2.get(F_CODIMP-FIRST_FIELD));
|
||
dist_tree().set_global("_IMPIANTO",codimp);
|
||
dist_tree().set_global("_LINEA","");
|
||
//dist_tree().set_global("_LIVELLO",);
|
||
//dist_tree().set_global("_MAGDEP",);
|
||
TArray labors;
|
||
TRiga_esplosione * l=dist_tree().first_critical_labor(labors);
|
||
if (l)
|
||
{
|
||
TLavorazione *curr_labor=TDistinta_tree::find_labor(l);
|
||
CHECK(curr_labor,"Lavorazione non trovata");
|
||
for (int nlinea=0; nlinea <curr_labor->linee_standard(); nlinea ++)
|
||
{
|
||
const TRectype &linea_prod= cache().get("LNP",curr_labor->cod_linea(nlinea));
|
||
if ( ignore_imp || codimp.blank() || codimp==linea_prod.get("S6"))
|
||
{
|
||
r2.add(linea_prod.get("CODTAB"), F_SORTCODLIN-FIRST_FIELD);
|
||
r2.add(linea_prod.get("S6"), F_SORTCODIMP-FIRST_FIELD);
|
||
return;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
r2.add('\255', F_SORTCODLIN-FIRST_FIELD);
|
||
}
|
||
else
|
||
{
|
||
r2.add(swp, F_SORTCODLIN-FIRST_FIELD);
|
||
r2.get(F_CODLIN-FIRST_FIELD,swp);
|
||
r2.add(swp, F_SORTCODIMP-FIRST_FIELD);
|
||
}
|
||
}
|
||
}
|
||
|
||
int TRiga_articolo::order_compare(TSheet_field & s, int i1, int i2, int level)
|
||
{
|
||
TMask &m=s.mask();
|
||
const bool ascending=!m.get_bool(F_MSP_SORT_ORDER);
|
||
int first1, first2, last1, last2;
|
||
|
||
if (find_block(s, i1, first1, last1 )) first1--;
|
||
if (find_block(s, i2, first2, last2 )) first2--;
|
||
|
||
const TToken_string &r1 = s.row(i1);
|
||
const TToken_string &r2 = s.row(i2);
|
||
if (s.cell_enabled(i1, F_BUCKET1-FIRST_FIELD) && s.cell_enabled(i2, F_BUCKET1-FIRST_FIELD) )
|
||
{
|
||
// confronto tra righe dello stesso vincolo
|
||
if (first1 == first2 )
|
||
return order_compare( r1 , r2 , level, ascending);
|
||
} else {
|
||
if (first1 != first2 && first1==i1 && first2==i2 )
|
||
{
|
||
TToken_string &blockr1=(TToken_string &)r1;
|
||
TToken_string &blockr2=(TToken_string &)r2;;
|
||
if (!(-level & SORT_WITHOUT_LINE))
|
||
{
|
||
complete_codlinea(blockr1, m.get_bool(F_NOIMP_IN));
|
||
complete_codlinea(blockr2, m.get_bool(F_NOIMP_IN));
|
||
}
|
||
// confronto tra blocchi ed eventuale swap direttamente qui nella compare
|
||
int cmp = order_compare(blockr1 , blockr2 , level, ascending );
|
||
if (cmp > 0)
|
||
{
|
||
for (int bubble=first2; bubble<=last2; bubble++)
|
||
{
|
||
for (int r=bubble; r>bubble+first1-first2; r--)
|
||
{
|
||
s.swap_rows(r, r-1);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return 0;
|
||
}
|
||
int TRiga_articolo::compare_field(TString &str0, TString &str1,short field_no)
|
||
{
|
||
int cmp;
|
||
switch (field_no)
|
||
{
|
||
case F_CLIENTE:
|
||
{
|
||
const long f0 = atol(str0);
|
||
const long f1 = atol(str1);
|
||
cmp = f0 == f1 ? 0 : (f0 > f1 ? +1 : -1);
|
||
}
|
||
break;
|
||
case F_PRIORITA:
|
||
cmp = atoi(str0) - atoi(str1);
|
||
break;
|
||
default:
|
||
cmp = str0.compare(str1);
|
||
break;
|
||
}
|
||
return cmp;
|
||
}
|
||
|
||
TRiga_articolo& TRiga_articolo::operator=(TToken_string& r)
|
||
{
|
||
this->TToken_string::operator=(r);
|
||
return *this;
|
||
}
|
||
|
||
TRiga_articolo& TRiga_articolo::operator+=(TRiga_articolo& r)
|
||
{
|
||
NFCHECK( "Can't add incompatible order line");
|
||
return *this;
|
||
}
|
||
|
||
TRiga_articolo::TRiga_articolo(const TMSP_constraint& line)
|
||
: TToken_string(128)
|
||
{
|
||
format("%ld", line.codclifor());
|
||
add(line.articolo(),F_CLIENTE-FIRST_FIELD);
|
||
add(" ",F_PRIORITA-FIRST_FIELD);
|
||
|
||
const TString& liv = line.livgiac();
|
||
for (int l = 1; l <= 4; l++)
|
||
{
|
||
if (livelli_giacenza().enabled(l))
|
||
add(livelli_giacenza().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD);
|
||
else
|
||
add(" ",F_LIV1+l-1-FIRST_FIELD);
|
||
}
|
||
|
||
add(line.description(),F_DESCART-FIRST_FIELD);
|
||
add(line.codimp(),F_CODIMP-FIRST_FIELD);
|
||
add(line.codlin(),F_CODLIN-FIRST_FIELD);
|
||
|
||
TString8 str = line.codmagdep().left(3);
|
||
add(str,F_MAGAZZINO-FIRST_FIELD);
|
||
str = line.codmagdep().mid(3);
|
||
add(str, F_DEPOSITO-FIRST_FIELD);
|
||
|
||
const TCodice_um um;
|
||
const TQuantita qta_art(line.articolo(), um, ZERO);
|
||
add(qta_art.um(),F_UM-FIRST_FIELD);
|
||
|
||
TMSP_constraint& lin=(TMSP_constraint& )line;
|
||
const int last_buck= line.last();
|
||
for (int bu = 0; bu <= last_buck; bu ++)
|
||
{
|
||
add(lin.qta(bu).string(), bu*2+F_BUCKET0-FIRST_FIELD);
|
||
}
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
////////////////////
|
||
TMSP_record::TMSP_record() :
|
||
_curr_ref(-1), _qta_locked(FALSE), _qta_min(ZERO),_qta(ZERO),_price(ZERO)
|
||
{ }
|
||
|
||
TObject* TMSP_record::dup() const
|
||
{
|
||
TMSP_record* o=new TMSP_record();
|
||
o->_docrefs =_docrefs;
|
||
o->_qta_locked=_qta_locked;
|
||
o->_qta_min=_qta_min;
|
||
o->_qta=_qta;
|
||
o->_price=_price;
|
||
return o;
|
||
}
|
||
void TMSP_record::remove_rigaref()
|
||
{
|
||
CHECK(_curr_ref>0,"Nessun riferimento a riga documento da cancellare");
|
||
_docrefs.remove(_curr_ref-1);
|
||
if (_curr_ref>=_docrefs.items())
|
||
_curr_ref--;
|
||
}
|
||
void TMSP_record::add_rigaref(TMRP_docref *r)
|
||
{
|
||
_docrefs.add(r);
|
||
_curr_ref = _docrefs.items();
|
||
}
|
||
TMRP_docref *TMSP_record::first_rigaref()
|
||
{
|
||
_curr_ref=0;
|
||
return next_rigaref();
|
||
}
|
||
TMRP_docref* TMSP_record::next_rigaref()
|
||
{
|
||
if (_docrefs.items()<=_curr_ref)
|
||
return NULL;
|
||
return _docrefs.get_ref_ptr(_curr_ref++);
|
||
}
|
||
TMRP_docref* TMSP_record::rigaref(int n)
|
||
{
|
||
if (_docrefs.items()<=n)
|
||
return NULL;
|
||
return _docrefs.get_ref_ptr(_curr_ref=n);
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////
|
||
TMSP_record& TMSP_record_array::operator[](int b)
|
||
{
|
||
CHECKD(b >= 0, "Invalid TMSP_record_array ", b);
|
||
TMSP_record* rec = (TMSP_record*)_buckets.objptr(b);
|
||
if (rec == NULL)
|
||
{
|
||
rec = new TMSP_record;
|
||
_buckets.add(rec, b);
|
||
}
|
||
return *rec;
|
||
}
|
||
|
||
TMSP_record_array& TMSP_record_array::operator=(const TMSP_record_array& a)
|
||
{
|
||
_buckets = a._buckets;
|
||
return *this;
|
||
}
|
||
|
||
|
||
|
||
///////////////////////////////////////////////////////////
|
||
TCapacity_record::TCapacity_record() :
|
||
_machine(ZERO), _human(ZERO),_money(ZERO), _pieces(ZERO)
|
||
{}
|
||
TCapacity_record::TCapacity_record(const real & machine, const real & human) :
|
||
_machine(machine), _human(human)
|
||
{}
|
||
TCapacity_record& TCapacity_record::operator= (const TCapacity_record&c)
|
||
{
|
||
_machine = c._machine;
|
||
_human = c._human;
|
||
_pieces = c._pieces;
|
||
_money = c._money;
|
||
return *this;
|
||
}
|
||
TCapacity_record::TCapacity_record(const TCapacity_record&c) :
|
||
_machine(c._machine), _human(c._human), _pieces(c._pieces),_money(c._money)
|
||
{
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
TCapacity_load::TCapacity_load () :
|
||
_capacity(), _load()
|
||
{ }
|
||
|
||
void TCapacity_load::copy(const TCapacity_load & q)
|
||
{
|
||
_capacity=q._capacity;
|
||
_load=q._load;
|
||
}
|
||
|
||
int TCapacity_load::compare(const TSortable& s) const
|
||
{
|
||
TCapacity_load& c=(TCapacity_load&)s;
|
||
real r=_capacity.machine()-c._capacity.machine();
|
||
return r.sign();
|
||
}
|
||
|
||
// calcola al volo la capacit<69>
|
||
const real &TCapacity_load::pieces_capacity()
|
||
{
|
||
if (capacity().pieces().is_zero())
|
||
{
|
||
const real &r = load().machine();
|
||
if (!r.is_zero())
|
||
_capacity.set_pieces(capacity().machine() / r * load().pieces());
|
||
else
|
||
_capacity.set_pieces(1.0);
|
||
}
|
||
return capacity().pieces();
|
||
}
|
||
|
||
|
||
///////////////////////////////////////
|
||
TCRP_line::TCRP_line(const TString& codimp,const TString& codlin,const TString& codart, long codcli)
|
||
: _lineap(codlin),_codart(codart), _codcli(codcli), _on_sheet(FALSE)
|
||
{
|
||
if (!codlin.blank())
|
||
{
|
||
const TRectype & rec = cache().get("LNP",_lineap);
|
||
_desc = rec.get("S0");
|
||
_imp = rec.get("S6");
|
||
}
|
||
else
|
||
{
|
||
_imp = codimp ;
|
||
if (!codimp.blank())
|
||
{
|
||
const TRectype & rec = cache().get("IMP",_imp);
|
||
_desc = rec.get("S0");
|
||
}
|
||
else
|
||
{
|
||
_desc = "Totale ditta";
|
||
}
|
||
}
|
||
if (!codart.blank())
|
||
{
|
||
const TRectype & rec = cache().get(LF_ANAMAG,_codart);
|
||
_desc = rec.get("DESCR");
|
||
}
|
||
}
|
||
|
||
int TCRP_line::compare(const TSortable& s) const
|
||
{
|
||
const TCRP_line& c = (const TCRP_line&)s;
|
||
int cmp = _imp.compare(c._imp);
|
||
if (cmp == 0)
|
||
cmp = _lineap.compare(c._lineap);
|
||
if (cmp == 0)
|
||
cmp = _codart.compare(c._codart);
|
||
return cmp;
|
||
}
|
||
|
||
// carica una riga di sheet con i dati dell'oggetto vincolo
|
||
void TCRP_line::fill_capacity_row(TToken_string& row, char load_type, bool percent)
|
||
{
|
||
row.add(codimp(),F_CODIMPCRP -FIRST_FIELD);
|
||
row.add(codlin(),F_CODLINCRP -FIRST_FIELD);
|
||
row.add("Capacit<EFBFBD>",F_CODARTCRP -FIRST_FIELD);
|
||
|
||
row.add(percent ? "%" : (load_type == '$' ? " $ " :( load_type == 'P' ? "Pz." : "ore")),F_LUM -FIRST_FIELD);
|
||
|
||
real r,l;
|
||
for (int bu = last(); bu > 0; bu = pred(bu))
|
||
{
|
||
switch (load_type)
|
||
{
|
||
case 'H': r = capacity(bu).human() ; break;
|
||
case 'M': r = capacity(bu).machine(); break;
|
||
case 'P': r = pieces_capacity(bu); break;
|
||
case '$': r = ZERO; break;
|
||
default: NFCHECK("Tipo di carico non riconosciuto");
|
||
}
|
||
if (!r.is_zero())
|
||
row.add(percent ? "100" : r.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets
|
||
else
|
||
row.add("", bu + F_LBUCKET0 -FIRST_FIELD);
|
||
}
|
||
}
|
||
|
||
// carica una riga di sheet con i dati dell'oggetto vincolo
|
||
void TCRP_line::fill_load_row(TToken_string& row, char load_type, bool percent)
|
||
{
|
||
row.add(codimp(),F_CODIMPCRP -FIRST_FIELD);
|
||
row.add(codlin(),F_CODLINCRP -FIRST_FIELD);
|
||
if (codart().blank())
|
||
row.add("Carico",F_CODARTCRP -FIRST_FIELD);
|
||
else
|
||
row.add(codart(),F_CODARTCRP -FIRST_FIELD);
|
||
|
||
row.add(percent ? "%" : (load_type == '$' ? " $ " :( load_type == 'P' ? "Pz." : "ore")),F_LUM -FIRST_FIELD);
|
||
|
||
real c,l;
|
||
for (int bu = last(); bu > 0; bu = pred(bu))
|
||
{
|
||
switch (load_type)
|
||
{
|
||
case 'H':
|
||
c = capacity(bu).human() ;
|
||
l = load(bu).human() ;
|
||
break;
|
||
case 'M':
|
||
c = capacity(bu).machine() ;
|
||
l = load(bu).machine() ;
|
||
break;
|
||
case 'P':
|
||
c = pieces_capacity(bu);
|
||
l = load(bu).pieces() ;
|
||
break;
|
||
case '$':
|
||
c = capacity(bu).money();
|
||
l = load(bu).money() ;
|
||
break;
|
||
default:
|
||
NFCHECK("Tipo di carico non riconosciuto");
|
||
}
|
||
if (percent)
|
||
l = c.is_zero() ? ZERO : (100L * l / c);
|
||
row.add(l.string(), bu + F_LBUCKET0 -FIRST_FIELD); // buckets
|
||
}
|
||
}
|
||
|
||
TCapacity_load& TCRP_line::bucket(int n)
|
||
{
|
||
TCapacity_load *o;
|
||
o=(TCapacity_load *)_bucket.objptr(n);
|
||
if (o==NULL)
|
||
{
|
||
o=new TCapacity_load();
|
||
_bucket.add(o,n);
|
||
}
|
||
return *o;
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TCRP_lines ; carichi delle varie linee
|
||
///////////////////////////////////////////////////////////
|
||
|
||
|
||
TSortable* TCRP_lines::new_obj(const TToken_string& key) const
|
||
{
|
||
TString8 codimp, codlin;
|
||
TString codart;
|
||
long codcli;
|
||
key.get(3,codart);
|
||
codcli = atoi(codart);
|
||
key.get(2,codart);
|
||
key.get(1,codlin);
|
||
key.get(0,codimp);
|
||
return new TCRP_line(codimp, codlin, codart, codcli);
|
||
}
|
||
|
||
TCRP_line* TCRP_lines::find(const TLinea_prod& linea_prod, const char * codart, long codcli, bool create)
|
||
{
|
||
TString8 codimp(linea_prod.codimp());
|
||
TString8 codlin(linea_prod.codice());
|
||
return find(codimp, codlin ,codart, codcli, create);
|
||
}
|
||
|
||
TCRP_line* TCRP_lines::find(const char * codimp, const char * codlin, const char * codart, long codcli, bool create)
|
||
{
|
||
_key.add(codimp,0);
|
||
_key.add(codlin,1);
|
||
TCRP_line * l = NULL;
|
||
if (create && codart && *codart)
|
||
{
|
||
l = (TCRP_line*)find_obj(_key);
|
||
CHECK(l,"Impossibile trovare la linea di Capacity review per un articolo");
|
||
}
|
||
_key.add(codart,2); // articolo
|
||
_key.add(format("%ld",codcli),3); // cliente
|
||
TCRP_line *s = (TCRP_line*)(create ? add_obj(_key) : find_obj(_key));
|
||
if (create && l)
|
||
for (int b = l->last(); b >=0; b--)
|
||
{
|
||
s->capacity(b).set_machine(l->capacity(b).machine());
|
||
s->capacity(b).set_human(l->capacity(b).human());
|
||
s->capacity(b).set_pieces(l->capacity(b).pieces());
|
||
}
|
||
|
||
return s;
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TMaster_code
|
||
///////////////////////////////////////////////////////////
|
||
|
||
TMaster_code::TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, const real &leadtime, const char *codimp, const char *codlin, const char *codmag)
|
||
: _code(code), _liv (liv), _um(ummaster), _expr(expr), _leadtime(leadtime),
|
||
_codimp(codimp), _codlin(codlin), _codmag(codmag)
|
||
{
|
||
}
|
||
TMaster_code::TMaster_code(const char *code, const char *liv,const char *ummaster, const real &expr, int leadtime, const char *codimp, const char *codlin, const char *codmag)
|
||
: _code(code), _liv (liv), _um(ummaster), _expr(expr), _leadtime(format("%d",leadtime)),
|
||
_codimp(codimp), _codlin(codlin), _codmag(codmag)
|
||
{
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TMSP_line2
|
||
///////////////////////////////////////////////////////////
|
||
|
||
void TMSP_line2::add_mastercode (TMaster_code *mc)
|
||
{
|
||
_mastercodes.add(mc);
|
||
}
|
||
|
||
TMaster_code *TMSP_line2::get_mastercode (int i)
|
||
{
|
||
if (i>=0 && i < _mastercodes.items())
|
||
return (TMaster_code *) _mastercodes.objptr(i);
|
||
return NULL;
|
||
}
|
||
|
||
TMSP_line2::TMSP_line2(const TMSP_constraint &c)
|
||
{
|
||
_constraint = new TMSP_constraint(c);
|
||
*_constraint = c;
|
||
}
|
||
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TMSP_constraint
|
||
///////////////////////////////////////////////////////////
|
||
TString16 TMSP_constraint::_substr;
|
||
int TMSP_constraint::compare(const TSortable& s) const
|
||
{
|
||
const TMSP_constraint& c = (const TMSP_constraint&)s;
|
||
const long diff = _codclifor - c._codclifor;
|
||
int cmp = diff == 0L ? 0 : (diff > 0 ? +1 : -1);
|
||
if (cmp == 0)
|
||
{
|
||
cmp = _codart.compare(c._codart);
|
||
if (cmp == 0)
|
||
{
|
||
cmp = _livgiac.compare(c._livgiac);
|
||
if (cmp == 0)
|
||
{
|
||
cmp = _codimp.compare(c._codimp);
|
||
if (cmp == 0)
|
||
{
|
||
cmp = _codlin.compare(c._codlin);
|
||
if (cmp == 0)
|
||
cmp = _codmag.compare(c._codmag);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
return cmp;
|
||
}
|
||
|
||
|
||
// carica una riga di sheet con i dati dell'oggetto vincolo
|
||
void TMSP_constraint::fill_sheet_row(TToken_string& row, const TMask & m, bool codes_only)
|
||
{
|
||
TString tipocf(m.get(F_TIPOCF));
|
||
|
||
row.add(m.get_bool(F_NOCLI_IN) ? "" : tipocf,F_TIPOCF_SHEET-FIRST_FIELD);
|
||
|
||
row.add(format("%ld", codclifor()),F_CLIENTE-FIRST_FIELD);
|
||
row.add(articolo(),F_ARTICOLO-FIRST_FIELD);
|
||
row.add(" ",F_PRIORITA-FIRST_FIELD);
|
||
|
||
const TString& liv = livgiac();
|
||
for (int l = 1; l <= 4; l++)
|
||
{
|
||
if (livelli_giacenza().enabled(l))
|
||
row.add(livelli_giacenza().unpack_grpcode(liv,l),F_LIV1+l-1-FIRST_FIELD);
|
||
else
|
||
row.add(" ",F_LIV1+l-1-FIRST_FIELD);
|
||
}
|
||
|
||
row.add(description(),F_DESCART-FIRST_FIELD);
|
||
row.add(codimp(),F_CODIMP-FIRST_FIELD);
|
||
row.add(codlin(),F_CODLIN-FIRST_FIELD);
|
||
|
||
//TString8 str = _codmag.left(3);
|
||
row.add(codmag(), F_MAGAZZINO-FIRST_FIELD);
|
||
row.add(coddep(),F_DEPOSITO-FIRST_FIELD);
|
||
row.add(codmag_coll(), F_MAG_COLL-FIRST_FIELD);
|
||
row.add(coddep_coll(),F_DEP_COLL-FIRST_FIELD);
|
||
|
||
const TCodice_um um;
|
||
const TQuantita qta_art(articolo(), um, ZERO);
|
||
row.add(qta_art.um(),F_UM-FIRST_FIELD);
|
||
|
||
if (codes_only)
|
||
return;
|
||
real needs=ZERO;
|
||
const int last_buck= last();
|
||
for (int bu = 0; bu <= last_buck; bu ++)
|
||
{
|
||
needs=qta(bu);
|
||
row.add(needs.string(), bu*2+F_BUCKET0-FIRST_FIELD);
|
||
needs=price(bu);
|
||
row.add(needs.string(), bu*2+F_BUCKET0+1-FIRST_FIELD);
|
||
}
|
||
row.add(mastercodes2check() ? MASTERCODE_CHAR : ' ',F_MASTERCODE-FIRST_FIELD);
|
||
}
|
||
|
||
TMRP_docref* TMSP_constraint::first_rigaref(int buck)
|
||
{
|
||
TMSP_record& b = _bucket_qta[buck];
|
||
TMRP_docref* rdr=b.first_rigaref();
|
||
return rdr;
|
||
}
|
||
TMRP_docref* TMSP_constraint::next_rigaref(int buck)
|
||
{
|
||
TMSP_record& b = _bucket_qta[buck];
|
||
TMRP_docref* rdr=b.next_rigaref();
|
||
return rdr;
|
||
}
|
||
int TMSP_constraint::rigarefs(int buck)
|
||
{
|
||
return _bucket_qta[buck].rigarefs();
|
||
}
|
||
TMRP_docref * TMSP_constraint::rigaref(int buck, int n)
|
||
{
|
||
return _bucket_qta[buck].rigaref(n);
|
||
}
|
||
const char *TMSP_constraint::um()
|
||
{
|
||
TToken_string key=articolo();
|
||
key.add("1");
|
||
return cache().get(LF_UMART,key).get("UM");
|
||
}
|
||
void TMSP_constraint::add_rigaref(int buck, TString& codnum, int annodoc, long ndoc, int nrig, const char * um, const real & qta, const real &prz)
|
||
{
|
||
TMSP_record& b = _bucket_qta[buck];
|
||
TMRP_docref *rdr= new TMRP_docref(annodoc, codnum, ndoc, nrig, um, qta,prz);
|
||
b.add_rigaref(rdr);
|
||
}
|
||
|
||
void TMSP_constraint::add_rigaref(int buck, TMRP_docref *rdr)
|
||
{
|
||
TMSP_record& b = _bucket_qta[buck];
|
||
b.add_rigaref(rdr);
|
||
}
|
||
|
||
void TMSP_constraint::remove_rigaref(int buck)
|
||
{
|
||
TMSP_record& b = _bucket_qta[buck];
|
||
b.remove_rigaref();
|
||
}
|
||
|
||
int TMSP_constraint::find_distinta_master(const TMSP_constraint & constr, TString & master,TString & livmaster,TString & um, real & expr, TString & imp,TString & lin,TString & magdep, int fromindex)
|
||
{
|
||
TArray sons;
|
||
dist_tree().set_global("_LIVELLO",constr.livgiac());
|
||
dist_tree().set_global("_IMPIANTO",constr.codimp());
|
||
dist_tree().set_global("_LINEA",constr.codlin());
|
||
dist_tree().set_global("_MAGDEP",constr.codmagdep());
|
||
if (dist_tree().set_root(constr.articolo()))
|
||
{
|
||
dist_tree().explode(sons, FALSE, RAGGR_EXP_NONE, 1, "AV");
|
||
TRiga_esplosione* riga;
|
||
while (riga=(TRiga_esplosione* )sons.objptr(fromindex))
|
||
{
|
||
if (distinta_master(riga->articolo(), TRUE))
|
||
{
|
||
master = riga->articolo();
|
||
livmaster = riga->livello();
|
||
um = riga->um();
|
||
expr = riga->val();
|
||
return fromindex;
|
||
}
|
||
fromindex=sons.succ(fromindex);
|
||
}
|
||
}
|
||
master="";
|
||
return -1;
|
||
}
|
||
|
||
|
||
bool TMSP_constraint::mastercodes2check() const
|
||
{
|
||
return _check_master;
|
||
}
|
||
|
||
void TMSP_constraint::set_mastercode_check(bool on)
|
||
{
|
||
_check_master=on;
|
||
}
|
||
|
||
TMSP_line2 *TMSP_constraint::use_mspline2(TToken_string & row)
|
||
{
|
||
TString16 liv;
|
||
TString8 mag,magc,imp,lin;
|
||
long codcli=row.get_long(F_CLIENTE-FIRST_FIELD);
|
||
livelli_giacenza().pack_grpcode(liv, row.get(F_LIV1-FIRST_FIELD),1);
|
||
livelli_giacenza().pack_grpcode(liv, row.get(F_LIV2-FIRST_FIELD),2);
|
||
livelli_giacenza().pack_grpcode(liv, row.get(F_LIV3-FIRST_FIELD),3);
|
||
livelli_giacenza().pack_grpcode(liv, row.get(F_LIV4-FIRST_FIELD),4);
|
||
imp=row.get(F_CODIMP-FIRST_FIELD);
|
||
lin=row.get(F_CODLIN-FIRST_FIELD);
|
||
add_magcode(mag, row.get(F_MAGAZZINO-FIRST_FIELD));
|
||
add_depcode(mag, row.get(F_DEPOSITO-FIRST_FIELD));
|
||
add_magcode(magc, row.get(F_MAG_COLL-FIRST_FIELD));
|
||
add_depcode(magc, row.get(F_DEP_COLL-FIRST_FIELD));
|
||
codcli=row.get_long(F_CLIENTE-FIRST_FIELD);
|
||
TMSP_line mspline(codcli, articolo(), liv, imp, lin, mag, magc);
|
||
for (int b= 0 ; b< LAST_BUCKET ; b++)
|
||
{
|
||
real q(row.get(F_BUCKET0+b*2-FIRST_FIELD));
|
||
mspline.qta(b) = q;
|
||
}
|
||
return use_mspline2(mspline);
|
||
}
|
||
|
||
|
||
TMSP_line2 *TMSP_constraint::use_mspline2(TMSP_constraint &line)
|
||
{
|
||
TMSP_line2 *a=NULL;
|
||
if (_lines2)
|
||
{
|
||
for (int i=_lines2->items()-1; i>=0 && a==NULL; i--)
|
||
{
|
||
a=(TMSP_line2 *) _lines2->objptr(i);
|
||
if (a->constraint() != line)
|
||
a=NULL;
|
||
}
|
||
}
|
||
if (a == NULL)
|
||
{
|
||
TString master;
|
||
TString4 ummaster;
|
||
TString16 livmaster;
|
||
TString8 impmaster(codimp()), linmaster(codlin()),magmaster(codmagdep());
|
||
real expr;
|
||
int dm=0;
|
||
while ((dm=find_distinta_master(line, master, livmaster, ummaster, expr, impmaster, linmaster, magmaster,dm)+1) >0)
|
||
{
|
||
if (a == NULL)
|
||
{
|
||
a = new TMSP_line2(line);
|
||
if (!_lines2) _lines2 = new TArray();
|
||
_lines2->add(a);
|
||
}
|
||
a->add_mastercode(new TMaster_code (master, livmaster, ummaster, expr, cache().get(LF_ANAMAG,master).get_real(ANAMAG_GIORNIRIOR), codimp(), codlin(), codmagdep()));
|
||
}
|
||
}
|
||
if (a)
|
||
{
|
||
a->set_use(TRUE);
|
||
a->constraint() = line;
|
||
}
|
||
return a;
|
||
}
|
||
|
||
void TMSP_constraint::reset_unused_line2()
|
||
{
|
||
if (_lines2)
|
||
{
|
||
TMSP_line2 *a;
|
||
for (int i=_lines2->items()-1; i>=0; i--)
|
||
{
|
||
a=(TMSP_line2 *) _lines2->objptr(i);
|
||
a->set_use(FALSE);
|
||
}
|
||
}
|
||
}
|
||
|
||
TMSP_line2 * TMSP_constraint::get_unused_line2()
|
||
{
|
||
if (_lines2)
|
||
{
|
||
TMSP_line2 *a;
|
||
for (int i=_lines2->items()-1; i>=0; i--)
|
||
{
|
||
a=(TMSP_line2 *) _lines2->objptr(i);
|
||
if (!a->used())
|
||
return a;
|
||
}
|
||
}
|
||
return NULL;
|
||
}
|
||
|
||
void TMSP_constraint::discard_line2(TMSP_line2 * l)
|
||
{
|
||
if (_lines2)
|
||
{
|
||
TMSP_line2 *a;
|
||
int i=_lines2->items();
|
||
while (--i>=0)
|
||
{
|
||
a=(TMSP_line2 *) _lines2->objptr(i);
|
||
if (a==l)
|
||
{
|
||
_lines2->destroy(i,TRUE);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// cerca ed eventualmente aggiunge la linea di articolo non-Master nell'elenco
|
||
// degli articoli "upper", ovvero vincolanti per questo articolo Master
|
||
TMSP_constraint * TMSP_constraint::add_upperline(const TMSP_constraint& mc)
|
||
{
|
||
TMSP_constraint * upl;
|
||
if (_upperlines == NULL)
|
||
_upperlines = new TMSP_constraints();
|
||
if (_upperlines->items()==0)
|
||
{
|
||
// aggiunge se stesso
|
||
upl=_upperlines->find(codclifor(), articolo(), livgiac(),
|
||
codimp(),codlin(),codmagdep(),TRUE);
|
||
*upl=*this;
|
||
}
|
||
return _upperlines->find(mc.codclifor(), mc.articolo(), mc.livgiac(),
|
||
mc.codimp(),mc.codlin(),mc.codmagdep(),TRUE);
|
||
}
|
||
|
||
TMSP_constraint* TMSP_constraint::get_upperline(TMSP_constraint& mc)
|
||
{
|
||
if (_upperlines)
|
||
return _upperlines->find(mc.codclifor(), mc.articolo(), mc.livgiac(),
|
||
mc.codimp(),mc.codlin(),mc.codmagdep(),FALSE);
|
||
else
|
||
return NULL;
|
||
}
|
||
|
||
TMSP_constraint & TMSP_constraint::operator=(const TMSP_constraint & line)
|
||
{
|
||
_codclifor=line.codclifor();
|
||
_codart=line.articolo();
|
||
_livgiac=line.livgiac();
|
||
_codimp=line.codimp();
|
||
_codlin=line.codlin();
|
||
_codmag=line.codmagdep();
|
||
_codmag_coll=line.codmagdep_coll();
|
||
_on_sheet=_on_sheet;
|
||
_descr=line.description();
|
||
_bucket_qta=line._bucket_qta;
|
||
return *this;
|
||
}
|
||
|
||
|
||
TMSP_constraint::TMSP_constraint(long cliente,
|
||
const TCodice_articolo& codart,
|
||
const TString& giac,
|
||
const TString& imp,
|
||
const TString& lin,
|
||
const TString& mag,
|
||
const TString& magc)
|
||
: _codclifor(cliente), _codart(codart), _livgiac(giac),
|
||
_codimp(imp), _codlin(lin), _codmag(mag), _codmag_coll(magc),_on_sheet(FALSE),_check_master(FALSE), _upperlines(NULL), _lines2(NULL)
|
||
|
||
{ }
|
||
|
||
TMSP_constraint::TMSP_constraint(const TMSP_constraint & line)
|
||
: _codclifor(line.codclifor()), _codart(line.articolo()), _livgiac(line.livgiac()),
|
||
_codimp(line.codimp()), _codlin(line.codlin()), _codmag(line.codmagdep()), _codmag_coll(line.codmagdep_coll()),
|
||
_descr(line.description()), _on_sheet(FALSE), _check_master(FALSE), _upperlines(NULL), _lines2(NULL)
|
||
{
|
||
}
|
||
|
||
TMSP_constraint::~TMSP_constraint()
|
||
{
|
||
if (_lines2) delete _lines2;
|
||
if (_upperlines) delete _upperlines;
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TMSP_constraints
|
||
///////////////////////////////////////////////////////////
|
||
|
||
TSortable* TMSP_constraints::new_obj(const TToken_string& key) const
|
||
{
|
||
long cli; key.get(0, cli);
|
||
TCodice_articolo art; key.get(1, art); art.trim();
|
||
TString16 gia; key.get(2, gia); gia.trim();
|
||
TString8 imp; key.get(3, imp); imp.trim();
|
||
TString8 lin; key.get(4, lin); lin.trim();
|
||
TString8 mag; key.get(5, mag); mag.trim();
|
||
return new TMSP_constraint(cli, art, gia, imp, lin, mag, "");
|
||
}
|
||
|
||
TMSP_constraint* TMSP_constraints::find(long cliente,
|
||
const TString& art,
|
||
const TString& gia,
|
||
const TString& imp,
|
||
const TString& lin,
|
||
const TString& mag,
|
||
// const TString& magc,
|
||
bool create)
|
||
{
|
||
_key.format("%ld", cliente);
|
||
_key.add(art);_key.trim();
|
||
_key.add(gia);_key.trim();
|
||
_key.add(imp);_key.trim();
|
||
_key.add(lin);_key.trim();
|
||
_key.add(mag);_key.trim();
|
||
// _key.add(magc);_key.trim();
|
||
TSortable* s = create ? add_obj(_key) : find_obj(_key);
|
||
TMSP_constraint *c=(TMSP_constraint*)s;
|
||
if (create)
|
||
{
|
||
if (c->description().blank())
|
||
c->set_description(cache().get(LF_ANAMAG,art).get("DESCR"));
|
||
}
|
||
return c;
|
||
}
|
||
|
||
TMSP_constraint* TMSP_constraints::find(const TToken_string& row, bool create)
|
||
{
|
||
TString80 str,giaclev;
|
||
_key.cut(0);
|
||
|
||
for (int i = 0; i <= 11; i++)
|
||
{
|
||
row.get(i, str);
|
||
str.trim();
|
||
switch (i+FIRST_FIELD)
|
||
{
|
||
case F_LIV1:
|
||
case F_LIV2:
|
||
case F_LIV3:
|
||
livelli_giacenza().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break;
|
||
case F_LIV4:
|
||
livelli_giacenza().pack_grpcode(giaclev, str, 4);
|
||
_key.add(giaclev);
|
||
break; // Concatena i livelli
|
||
case F_MAGAZZINO:
|
||
// case F_MAG_COLL:
|
||
_key.add(str);
|
||
row.get(i+1, str);
|
||
_key << str;
|
||
break; // Concatena magazzini e depositi
|
||
case F_CLIENTE:
|
||
if (str.blank()) str = "0";
|
||
case F_ARTICOLO:
|
||
case F_CODIMP:
|
||
case F_CODLIN:
|
||
_key.add(str); break; // Aggiungi normalmente
|
||
}
|
||
_key.trim();
|
||
}
|
||
TSortable* s = create ? add_obj(_key) : find_obj(_key);
|
||
TMSP_constraint *c=(TMSP_constraint*)s;
|
||
if (create)
|
||
{
|
||
if (c->description().blank())
|
||
{
|
||
row.get(F_ARTICOLO, str);
|
||
c->set_description(cache().get(LF_ANAMAG,str).get("DESCR"));
|
||
}
|
||
}
|
||
return c;
|
||
}
|
||
|
||
|
||
|
||
//////////////////////////////////////////////////////////
|
||
// TMSP_line
|
||
///////////////////////////////////////////////////////////
|
||
|
||
|
||
void TMSP_line::fill_sheet_row(TToken_string& row, const TMask & m, bool codes_only)
|
||
{
|
||
TMSP_constraint::fill_sheet_row(row, m, codes_only);
|
||
row.add(m.get(F_TIPOCF),F_TIPOCF_SHEET-FIRST_FIELD);
|
||
}
|
||
|
||
TMSP_line::TMSP_line(long cliente, const TCodice_articolo& codart,
|
||
const TString& giac, const TString& imp,
|
||
const TString& lin, const TString& mag, const TString& magc)
|
||
: TMSP_constraint(cliente, codart, giac, imp, lin, mag, magc)
|
||
{ }
|
||
|
||
TMSP_line::TMSP_line(TMSP_constraint & cons)
|
||
:TMSP_constraint(cons)
|
||
{ }
|
||
TMSP_line::TMSP_line(TMSP_line & line)
|
||
:TMSP_constraint((TMSP_constraint &)line)
|
||
{
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TMSP_lines
|
||
///////////////////////////////////////////////////////////
|
||
|
||
TSortable* TMSP_lines::new_obj(const TToken_string& key) const
|
||
{
|
||
long cliente; key.get(0, cliente);
|
||
TCodice_articolo art; key.get(1, art); art.trim();
|
||
TString gia; key.get(2, gia); gia.trim();
|
||
TString imp; key.get(3, imp); imp.trim();
|
||
TString lin; key.get(4, lin); lin.trim();
|
||
TString mag; key.get(5, mag); mag.trim();
|
||
TString magc; key.get(6, magc); magc.trim();
|
||
return new TMSP_line(cliente, art, gia, imp, lin, mag, magc);
|
||
}
|
||
|
||
TMSP_line* TMSP_lines::find(long cliente,
|
||
const TString& art,
|
||
const TString& gia, const TString& imp, const TString& lin,
|
||
const TString& mag, const TString& magc,
|
||
bool create)
|
||
{
|
||
_key.format("%ld", cliente);
|
||
_key.add(art);
|
||
_key.add(gia);
|
||
_key.add(imp);
|
||
_key.add(lin);
|
||
_key.add(mag);
|
||
_key.add(magc);
|
||
TSortable* s = create ? add_obj(_key) : find_obj(_key);
|
||
return (TMSP_line*)s;
|
||
}
|
||
|
||
TMSP_line* TMSP_lines::find(const TToken_string& row, bool create)
|
||
{
|
||
TString80 str,giaclev;
|
||
_key.cut(0);
|
||
|
||
for (int i = 0; i <= 13; i++)
|
||
{
|
||
row.get(i, str);
|
||
str.trim();
|
||
switch (i+FIRST_FIELD)
|
||
{
|
||
case F_LIV1:
|
||
case F_LIV2:
|
||
case F_LIV3:
|
||
livelli_giacenza().pack_grpcode(giaclev, str, i+FIRST_FIELD-F_LIV1+1); break;
|
||
case F_LIV4:
|
||
livelli_giacenza().pack_grpcode(giaclev, str, 4);
|
||
giaclev.trim();
|
||
_key.add(giaclev);
|
||
break; // Concatena i livelli
|
||
case F_MAGAZZINO:
|
||
case F_MAG_COLL:
|
||
_key.add(str);
|
||
row.get(i+1, str);
|
||
str.trim();
|
||
_key << str;
|
||
break; // Concatena magazzini e depositi
|
||
case F_DEPOSITO:
|
||
case F_DEP_COLL:
|
||
break; // Ignora (vedi sopra)
|
||
case F_CLIENTE:
|
||
if (str.blank()) str = "0";
|
||
case F_ARTICOLO:
|
||
case F_CODIMP:
|
||
case F_CODLIN:
|
||
_key.add(str); break; // Aggiungi normalmente
|
||
}
|
||
}
|
||
TSortable* s = create ? add_obj(_key) : find_obj(_key);
|
||
return (TMSP_line*)s;
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// TPlan_docs
|
||
///////////////////////////////////////////////////////////
|
||
|
||
TSortable* TPlan_docs::new_obj(const TToken_string& key) const
|
||
{
|
||
TString8 codnum; key.get(0, codnum);
|
||
int anno; key.get(1, anno);
|
||
long num; key.get(2, num);
|
||
|
||
TDocumento* doc = new TDocumento('D', anno, codnum, num);
|
||
doc->head().put(DOC_TIPODOC, _doc);
|
||
doc->head().put(DOC_CAUSMAG, doc->tipo().caus_mov());
|
||
return doc;
|
||
}
|
||
|
||
TDocumento& TPlan_docs::find(TMRP_docref * rdr)
|
||
{
|
||
if (rdr)
|
||
_key.format("%s|%d|%ld",(const char *)rdr->codnumdoc(), rdr->annodoc(), rdr->numdoc());
|
||
else
|
||
_key = " |0|0";
|
||
return *(TDocumento*)add_obj(_key);
|
||
}
|
||
|
||
TRiga_documento& TPlan_docs::add_to_row(TMRP_docref * rdr, const real& qta)
|
||
{
|
||
CHECK(rdr,"TPlan_docs::add_to_row :passare un rigaref fvalido");
|
||
TDocumento& doc = find(rdr);
|
||
int riga = rdr->numrig();
|
||
if (riga <= 0 || riga > doc.physical_rows())
|
||
{
|
||
TRiga_documento& r = doc.new_row(_rig);
|
||
riga = r.get_int(RDOC_NRIGA);
|
||
rdr->set_numrig(riga);
|
||
}
|
||
TRiga_documento& rdoc = doc[riga];
|
||
real val = rdoc.get(RDOC_QTA);
|
||
val += qta;
|
||
if (val <= ZERO)
|
||
val = ZERO;
|
||
rdoc.put(RDOC_QTA, val);
|
||
rdr->set_qta_residua(val);
|
||
|
||
return rdoc;
|
||
}
|
||
|
||
long TPlan_docs::flush(const TDate& data, const char * codart)
|
||
{
|
||
const long tot = items();
|
||
long retv=tot;
|
||
if (tot > 0L)
|
||
{
|
||
TString msg;
|
||
msg << "Registrazione dei documenti di planning";
|
||
if (codart)
|
||
msg << " articolo " << codart;
|
||
if (data.ok())
|
||
msg << " per il " << data;
|
||
TProgind pi(tot, msg, FALSE, TRUE);
|
||
TLocalisamfile lfdoc(LF_DOC);
|
||
for (long d = 0; d < tot; d++)
|
||
{
|
||
pi.addstatus(1);
|
||
TDocumento& doc = (TDocumento&)find_obj(d);
|
||
lfdoc.curr() = doc.head();
|
||
int err = lfdoc.read(_isequal, _lock);
|
||
if (err == _iseof || err == _iskeynotfound || err == NOERR)
|
||
{
|
||
for (int r = doc.physical_rows(); r > 0; r--)
|
||
{
|
||
const TRiga_documento& riga = doc[r];
|
||
if (riga.is_articolo() && riga.quantita() == ZERO)
|
||
doc.destroy_row(r, TRUE);
|
||
}
|
||
if (doc.physical_rows())
|
||
{
|
||
if (err == NOERR)
|
||
err = doc.rewrite(lfdoc);
|
||
else
|
||
err = doc.write(lfdoc) ;
|
||
}
|
||
else
|
||
err = doc.remove(lfdoc);
|
||
}
|
||
if (err != NOERR)
|
||
{
|
||
error_box("Impossibile riscrivere il documento del %d %s %ld",(int)doc.anno(), (const char *)doc.numerazione(),(long)doc.numero());
|
||
retv=-1;
|
||
}
|
||
}
|
||
destroy();
|
||
}
|
||
return retv;
|
||
}
|
||
|
||
TPlan_docs::TPlan_docs(const char* num, const char* tip, const char* rig)
|
||
: _num(num), _doc(tip), _rig(rig)
|
||
{
|
||
}
|
||
|
||
bool distinta_master(const char *code, bool is_son)
|
||
{
|
||
const TRectype &rec=cache().get(LF_DIST,code);
|
||
if (rec.empty())
|
||
return !is_son;
|
||
return rec.get_bool("MASTER");
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// Sheet ordini / commessse
|
||
///////////////////////////////////////////////////////////
|
||
void TLista_dettagli::set_bucket(int b)
|
||
{
|
||
_curr_bucket=b;
|
||
reset_parked();
|
||
}
|
||
|
||
bool TLista_dettagli::reset_bucket_field()
|
||
{
|
||
int b = 0;
|
||
while (b <= LAST_BUCKET && get_items(b)==0)
|
||
b++;
|
||
TMask_field & f=field(FIRST_FIELD);
|
||
f.set(format("%d",b <= LAST_BUCKET ? b : 0));
|
||
bucket_handler(f, K_SPACE);
|
||
return b <= LAST_BUCKET;
|
||
}
|
||
|
||
bool TLista_dettagli::bucket_handler(TMask_field & f, KEY key)
|
||
{
|
||
if (key == K_SPACE)
|
||
{
|
||
TLista_dettagli &m = (TLista_dettagli &)f.mask();
|
||
const int buck=atoi(f.get());
|
||
if (m.curr_bucket() != buck)
|
||
{
|
||
m.set_bucket(buck);
|
||
int week1=0,week2=0, year1=0, year2=0;
|
||
TDate d;
|
||
if (buck>0)
|
||
{
|
||
d = m._from;
|
||
d += (buck - 1) * m._bucksize;
|
||
if (m._bucksize == 31) // mese solare
|
||
d.set_day(1);
|
||
TPlanning_mask::get_week_year(d, week1, year1);
|
||
}
|
||
m.set(FIRST_FIELD+1, d.string());
|
||
if (buck == LAST_BUCKET)
|
||
d = NULLDATE;
|
||
else
|
||
{
|
||
d = m._from;
|
||
d += (buck - 1) * m._bucksize;
|
||
if (m._bucksize == 31) // mese solare
|
||
d.set_end_month();
|
||
else
|
||
d += m._bucksize-1;
|
||
TPlanning_mask::get_week_year(d, week2, year2);
|
||
}
|
||
m.set(FIRST_FIELD+2, d.string());
|
||
TString ws;
|
||
if (week1)
|
||
{
|
||
ws << (week2 ? "" : ">=");
|
||
ws << week1;
|
||
if (year1 != year2)
|
||
ws << "/" << year1;
|
||
} else
|
||
ws << "<=";
|
||
if (week2)
|
||
{
|
||
if (week1 != week2 || year1 != year2)
|
||
{
|
||
if (week1)
|
||
ws << "-";
|
||
ws << week2;
|
||
}
|
||
ws << "/" << year2;
|
||
}
|
||
m.set(FIRST_FIELD+3, format("%s",(const char *)ws));
|
||
m.select(0);
|
||
m.force_update();
|
||
}
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
void TLista_dettagli::init(const char * title, TDate fromdate, int bucketsize)
|
||
{
|
||
_curr_bucket = -1;
|
||
_from = fromdate;
|
||
_bucksize = bucketsize;
|
||
TMask_field &f= add_list(FIRST_FIELD,0,"Bucket ",1,0,2,"","0|1|2|3|4|5|6|7|8|9|10|11|12|13","0|1|2|3|4|5|6|7|8|9|10|11|12|13");
|
||
f.set_handler(bucket_handler);
|
||
add_date(FIRST_FIELD+1,0,"Dal ",16,0,"D");
|
||
add_date(FIRST_FIELD+2,0,"al ",33,0,"D");
|
||
add_string(FIRST_FIELD+3,0,"Settimana ",49,0,15,"D");
|
||
}
|
||
|
||
TLista_dettagli::TLista_dettagli(const char * title, TDate fromdate, int bucketsize, const char * head) :
|
||
TSheet(-1, 5, 80, 15, title, head,0,2)
|
||
{
|
||
init(title, fromdate, bucketsize);
|
||
}
|
||
|
||
|
||
void TLista_docref::get_row(long r, TToken_string& row)
|
||
{
|
||
row = "";
|
||
if (r < _line->rigarefs(curr_bucket()))
|
||
{
|
||
TMRP_docref * rdr=_line->rigaref(curr_bucket(),(int)r);
|
||
if (rdr)
|
||
{
|
||
TLocalisamfile & rdoc = _r->lfile(LF_RIGHEDOC);
|
||
TLocalisamfile & doc = _r->lfile(LF_DOC);
|
||
rdoc.put(RDOC_PROVV,"D");
|
||
rdoc.put(RDOC_ANNO,rdr->annodoc());
|
||
rdoc.put(RDOC_CODNUM,rdr->codnumdoc());
|
||
rdoc.put(RDOC_NDOC,rdr->numdoc());
|
||
rdoc.put(RDOC_NRIGA,rdr->numrig());
|
||
_r->read();
|
||
row.add(" ");
|
||
row.add(rdr->annodoc());
|
||
row.add(rdr->codnumdoc());
|
||
row.add(rdr->numdoc());
|
||
row.add(rdr->numrig());
|
||
TDate dc(rdoc.get_date(RDOC_DATACONS));
|
||
row.add(dc.ok() ? dc : doc.get_date(RDOC_DATACONS));
|
||
row.add(rdoc.get(RDOC_UMQTA));
|
||
real q(rdoc.get_real(RDOC_QTA));
|
||
row.add(q.string("#######@,@@@"));
|
||
q -= rdoc.get_real(RDOC_QTAEVASA);
|
||
row.add(q.string("#######@,@@@"));
|
||
//const char statodef=cache().get("%TIP",doc.get(DOC_TIPODOC)).get("S2")[1];
|
||
row.add(doc.get(DOC_STATO));
|
||
enable_row(r);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
row = "|||||||";
|
||
row.add(_line->qta(curr_bucket()).string("#######@,@@@"));
|
||
disable_row(r);
|
||
}
|
||
}
|
||
|
||
bool TLista_docref::edit_checked()
|
||
{
|
||
for (long r=0; r < items()-1; r++) if (checked(r))
|
||
{
|
||
TFilename ininame;
|
||
ininame.temp();
|
||
ininame.ext("ini");
|
||
{
|
||
TConfig action(ininame);
|
||
action.set("Action","MODIFY","Transaction");
|
||
action.set_paragraph(format("%d",LF_DOC));
|
||
TToken_string & rw = row(r);
|
||
action.set("PROVV","D");
|
||
action.set("ANNODOC",rw.get(1));
|
||
action.set("CODNUM",rw.get(2));
|
||
action.set("NDOC",rw.get(3));
|
||
}
|
||
TExternal_app editdoc(format("VE0 -1 -i%s",(const char *)ininame));
|
||
editdoc.run();
|
||
remove(ininame);
|
||
// aggiungere qui il feedback sulla rigaref; per ora c'e' un brutale
|
||
/*
|
||
TConfig action(ininame);
|
||
TMRP_docref * rdr=_line->rigaref(_curr_bucket,(int)r);
|
||
*/
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
long TLista_docref::get_items(int b) const
|
||
{
|
||
if (b >= 0 && _line->rigarefs(b))
|
||
return _line->rigarefs(b)+1;
|
||
return 0L;
|
||
}
|
||
|
||
|
||
TLista_docref::TLista_docref(TMSP_constraint * l, const char * title, TDate fromdate, int bucketsize) :
|
||
TLista_dettagli(title, fromdate, bucketsize,
|
||
"@1|Anno|CodNum|Numero|Riga|Consegna@10|UM|Q.ta totale@12|Q.ta residua@12|Stato"),
|
||
_line (l)
|
||
{
|
||
_r= new TRelation(LF_RIGHEDOC);
|
||
_r->add(LF_DOC,"PROVV==PROVV|CODNUM==CODNUM|ANNO==ANNO|NDOC==NDOC");
|
||
enable_check();
|
||
reset_bucket_field();
|
||
// PRESET bucket
|
||
}
|
||
|
||
TLista_docref ::~TLista_docref ()
|
||
{
|
||
if (_r) delete _r;
|
||
}
|
||
|
||
const char *TLista_mastercodes::header()
|
||
{
|
||
static TToken_string h;
|
||
h = "@1|Articolo@20";
|
||
for (int l = 1; l <= livelli_giacenza().last_level() ; l++)
|
||
h << "|" << livelli_giacenza().name(l) << "@" << livelli_giacenza().code_length(l) ;
|
||
h.add("Impianto");
|
||
h.add("Linea|Cod.Mag.|UM|Quantita'@12|Consegna");
|
||
return h;
|
||
}
|
||
|
||
TLista_mastercodes::TLista_mastercodes(TMSP_constraint *c, TToken_string &l, TDate fromdate, int bucketsize):
|
||
TLista_dettagli("Articoli Master interessati", fromdate, bucketsize, header())
|
||
{
|
||
_line_art = c->use_mspline2(l);
|
||
}
|
||
void TLista_mastercodes::get_row(long r, TToken_string& row)
|
||
{
|
||
TMaster_code *mc;
|
||
if (mc = _line_art->get_mastercode(int(r)))
|
||
{
|
||
row = " ";
|
||
row.add(mc->articolo());
|
||
for (int l = 1; l <= livelli_giacenza().last_level() ; l++)
|
||
row.add(livelli_giacenza().unpack_grpcode(mc->livello(),l));
|
||
row.add(mc->codimp());
|
||
row.add(mc->codlin());
|
||
row.add(mc->codmagdep());
|
||
row.add(mc->um());
|
||
real e = mc->expr();
|
||
e *= _line_art->constraint().qta(curr_bucket());
|
||
row.add(e.string("#######@,@@@"));
|
||
TDate d = get_date(FIRST_FIELD+2);
|
||
d -= long(mc->leadtime().integer());
|
||
row.add(d.string());
|
||
}
|
||
}
|
||
long TLista_mastercodes::get_items(int b) const
|
||
{
|
||
if (_line_art)
|
||
if (b >= 0 && b < LAST_BUCKET && !_line_art->constraint().qta(b).is_zero())
|
||
return _line_art->mastercodes();
|
||
return 0L;
|
||
}
|
||
|
||
const char *TLista_upperlines::header()
|
||
{
|
||
static TToken_string h;
|
||
h = "@1|Articolo@20";
|
||
for (int l = 1; l <= livelli_giacenza().last_level() ; l++)
|
||
h << "|" << livelli_giacenza().name(l) << "@" << livelli_giacenza().code_length(l) ;
|
||
h.add("Impianto|Linea|Mag.|Dep.|UM|Quantita'@12");
|
||
return h;
|
||
}
|
||
|
||
TLista_upperlines::TLista_upperlines(TMSP_constraint *l, TDate fromdate, int bucketsize):
|
||
TLista_dettagli("Vincoli da articoli non Master", fromdate, bucketsize,header())
|
||
{
|
||
_line = l;
|
||
}
|
||
void TLista_upperlines::get_row(long r, TToken_string& row)
|
||
{
|
||
TMSP_constraint& c = (*_line->upperlines())[r+1];
|
||
row = " ";
|
||
row.add(c.articolo());
|
||
for (int l = 1; l <= livelli_giacenza().last_level() ; l++)
|
||
row.add(livelli_giacenza().unpack_grpcode(c.livgiac(),l));
|
||
row.add(c.codimp());
|
||
row.add(c.codlin());
|
||
row.add(c.codmag());
|
||
row.add(c.coddep());
|
||
row.add(c.um());
|
||
row.add(c.qta(curr_bucket()).string("#######@,@@@"));
|
||
}
|
||
long TLista_upperlines::get_items(int b) const
|
||
{
|
||
if (_line->upperlines())
|
||
if (b >= 0 && !_line->qta(b).is_zero())
|
||
return _line->upperlines_items()-1;
|
||
return 0L;
|
||
}
|