Patch level : 10.0

Files correlati     : tp0.exe
Ricompilazione Demo : [ ]
Commento            :
Corretta gestione degli articoli il cui imballo sia costituito da materiali diversi come categoria CONAI


git-svn-id: svn://10.65.10.50/trunk@19378 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2009-10-06 13:01:32 +00:00
parent dde89c0348
commit 2ab4a131ad
3 changed files with 129 additions and 69 deletions

View File

@ -108,6 +108,7 @@ class TCache_tp : public TCache
protected:
void log(const char* msg, int sev) const { _pt->log(msg, sev); }
bool test_write(TLocalisamfile& file) const { return _pt->test_write(file); }
bool test_rewrite(TLocalisamfile& file) const { return _pt->test_rewrite(file); }
const TRecordset& recordset() const { return _pt->recordset(); }
TConfig& config() const { return _pt->config(); }
const TString& query_header() const { return _pt->query_header(); }

View File

@ -23,31 +23,40 @@ public:
const TString& conai_subclass(TCONAI_class cc) const { CHECK_CONAI(cc); return _conai_scat[cc]; }
const real& conai_weight(TCONAI_class cc) const { CHECK_CONAI(cc); return _conai_peso[cc]; }
bool set_conai(TCONAI_class cc, const TString& scat, const real& weight);
TArticolo_pack(const TRectype& anamag);
TArticolo_pack();
};
TArticolo_pack::TArticolo_pack(const TRectype& anamag) : TRectype(anamag)
{}
// Assegna sottocategoria e peso di una classe CONAI solo se non vuoti
bool TArticolo_pack::set_conai(TCONAI_class cc, const TString& scat, const real& weight)
{
const bool ok = conai_configured_class(cc) && scat.full() && !weight.is_zero();
if (ok)
{
_conai_scat[cc] = scat;
_conai_peso[cc] = weight;
}
return ok;
}
TArticolo_pack::TArticolo_pack() : TRectype(LF_ANAMAG)
TArticolo_pack::TArticolo_pack(const TRectype& anamag) : TRectype(anamag)
{
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
{
const TFieldref anamag_sotcat(conai_sottocat_name(cc, LF_ANAMAG), LF_ANAMAG);
const TFieldref anamag_weight(conai_peso_name(cc, LF_ANAMAG), LF_ANAMAG);
const TString4 sotcat = anamag_sotcat.read(*this);
const real peso = anamag_weight.read(*this);
if (sotcat.full() && !peso.is_zero())
{
_conai_scat[cc] = sotcat;
_conai_peso[cc] = peso;
}
const TString4 sotcat = anamag_sotcat.read(anamag); // Usually CA40
const real peso = anamag_weight.read(anamag); // Should be > 0
set_conai(cc, sotcat, peso); // Validates all parameters
}
}
TArticolo_pack::TArticolo_pack() : TRectype(LF_ANAMAG)
{ }
class TCache_art : public TCache_tp
{
TLocalisamfile _anamag;
@ -55,28 +64,30 @@ class TCache_art : public TCache_tp
protected:
virtual TObject* key2obj(const char* key);
virtual const TString& decode(const TToken_string& tok);
bool get_extra_info(const char* key, TArticolo_pack& art) const;
int get_extra_info(const char* key, TArticolo_pack& art);
public:
const TArticolo_pack& articolo();
TCache_art(TPack_ddt* ddt) : TCache_tp(ddt), _anamag(LF_ANAMAG) {}
};
bool TCache_art::get_extra_info(const char* key, TArticolo_pack& art) const
int TCache_art::get_extra_info(const char* key, TArticolo_pack& art)
{
TString qry(512);
TString qry(512), article_code;
qry = query_header();
qry << "SELECT Paper_Composition_Group.CompDesc, Mag_Existing_Article.ArticleCustCode\n"
qry << "SELECT Paper_Composition_Group.CompDesc, Mag_Existing_Article.ArticleCustCode, Mag_Existing_Article.ArticleCode\n"
<< "FROM Mag_Existing_Article, Articles_Composition, Paper_Composition_Group\n"
<< "WHERE (Mag_Existing_Article.ArtCode='" << key << "') AND "
<< "(Mag_Existing_Article.ArticleCode=Articles_composition.ArticleCode) AND "
<< "(Articles_Composition.CompCode=Paper_Composition_Group.CompCode);";
TODBC_recordset paperset(qry);
const bool ok = paperset.move_first();
if (ok)
int info = paperset.move_first() ? 1 : 0;
if (info)
{
const TString pc = paperset.get(0u).as_string(); // Paper composition
const TString cc = paperset.get(1).as_string(); // Customer code
article_code = paperset.get(2).as_string(); // ArticleCode for Articles_environmentTax
article_code.trim();
art.set_customer_code(cc);
art.set_paper_composition(pc);
if (cc.full())
@ -103,19 +114,47 @@ bool TCache_art::get_extra_info(const char* key, TArticolo_pack& art) const
}
}
qry = query_header();
qry << "SELECT ClassCode,Weight\n"
<< "FROM Mag_Existing_Article, Articles_environmentTax\n"
<< "WHERE (Mag_Existing_Article.ArtCode='" << key << "') AND "
<< "(Mag_Existing_Article.ArticleCode=Articles_environmentTax.ArticleCode)";
TODBC_recordset envtax(qry);
for (bool et = envtax.move_first(); et; et = envtax.move_next())
if (article_code.full()) // Ho trovato un articolo di magazzino, carico CONAI info
{
const TString& cc = envtax.get(0u).as_string();
const real wkg = envtax.get(1).as_real();
}
qry = query_header();
qry << "SELECT SubclassCode,Weight\n"
<< "FROM Articles_environmentTax\n"
<< "WHERE Articles_environmentTax.ArticleCode=" << article_code << ';';
TODBC_recordset envtax(qry);
for (bool et = envtax.move_first(); et; et = envtax.move_next())
{
const TString& sc = envtax.get(0u).as_string();
const real wkg = envtax.get(1).as_real();
const TCONAI_class cc = conai_str2class(sc);
if (art.set_conai(cc, sc, wkg))
info = 2;
}
return ok;
if (info == 2) // Ho trovato dati sul CONAI
{
bool update = false;
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
{
const TFieldref anamag_sotcat(conai_sottocat_name(cc, LF_ANAMAG), LF_ANAMAG);
const TFieldref anamag_weight(conai_peso_name(cc, LF_ANAMAG), LF_ANAMAG);
const TString4 sotcat = anamag_sotcat.read(art);
const TString8 peso = anamag_weight.read(art); // Faccio i confronti su stringa per evitare decimali impazziti
if (sotcat != art.conai_subclass(cc) || peso != art.conai_weight(cc).string())
{
anamag_sotcat.write(art.conai_subclass(cc), art);
anamag_weight.write(art.conai_weight(cc).string(), art);
update = true;
}
}
if (update) // Aggiorno anagrafica se necessario
{
_anamag.curr() = art;
test_rewrite(_anamag);
}
}
}
return info;
}
TObject* TCache_art::key2obj(const char* key)
@ -125,6 +164,7 @@ TObject* TCache_art::key2obj(const char* key)
return new TArticolo_pack; // Articolo nullo
_anamag.put(ANAMAG_CODART, key);
if (_anamag.read() != NOERR)
{
_anamag.zero();
@ -132,12 +172,23 @@ TObject* TCache_art::key2obj(const char* key)
const TString& desc = get_str("ArtDesc");
_anamag.put(ANAMAG_DESCR, desc);
const TString& conai_class = get_str("ClassCode");
if (conai_class.full())
TString4 conai_class = get_str("SubclassCode");
if (conai_class.blank())
{
const TString& conai_field = config().get(conai_class, "CONAI");
if (conai_field.full())
_anamag.put(conai_field, get_real_str("WeightETUnit"));
conai_class = get_str("ClassCode");
if (conai_class.full())
conai_class << 99;
}
// Basic CONAI info
const TCONAI_class cc = conai_str2class(conai_class);
if (conai_configured_class(cc))
{
const TFieldref fld_sc(conai_sottocat_name(cc, LF_ANAMAG), LF_ANAMAG);
fld_sc.write(conai_class, _anamag.curr());
const TFieldref fld_wt(conai_peso_name(cc, LF_ANAMAG), LF_ANAMAG);
fld_wt.write(get_real_str("WeightETUnit"), _anamag.curr());
}
const long gruconto = get_long("AccountCode");
@ -149,7 +200,7 @@ TObject* TCache_art::key2obj(const char* key)
}
TArticolo_pack* art = new TArticolo_pack(_anamag.curr());
get_extra_info(key, *art); // CustomerCode e PaperComposition
get_extra_info(key, *art); // CustomerCode, PaperComposition, CONAI infos
return art;
}
@ -706,7 +757,7 @@ bool TPack_ddt::trasferisci()
// Copia tutte le sottocategorie CONAI dall'anagrafica alla riga documento
real peso_imballo_anamag;
int pesi_anamag = 0;
FOR_EACH_CONAI_CLASS(cc)
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
{
const TString& cs = art.conai_subclass(cc); // Codice sottocategoria su ANAMAG
if (cs.full()) // la presenza della sottoclasse implica anche un peso positivo
@ -722,27 +773,41 @@ bool TPack_ddt::trasferisci()
}
// La sottocategoria della bolla prevale su quella anagrafica impostata sopra
const TString& conai_class = get_str("ClassCode");
const TCONAI_class ct = conai_str2class(conai_class);
const TString& conai_subclass = get_str("SubclassCode");
rdoc.put(conai_sottocat_name(ct, LF_RIGHEDOC), conai_subclass);
const TString4 conai_subclass = get_str("SubclassCode");
const TCONAI_class ct = conai_str2class(conai_subclass);
if (ct == CONAI_CARTA && conai_subclass.len() == 4)
rdoc.put(conai_sottocat_name(ct, LF_RIGHEDOC), conai_subclass);
const real peso_imballo_ddt = get_real_str("WeightETUnit");
// Con imballi composti da vari materiali devo riproporzionare
if (pesi_anamag > 1 && peso_imballo_ddt != peso_imballo_anamag && !peso_imballo_ddt.is_zero())
real peso_imballo_ddt = get_real_str("WeightETUnit");
if (peso_imballo_ddt.is_zero())
peso_imballo_ddt = peso_imballo_anamag;
if (pesi_anamag > 1) // Con imballi composti da vari materiali devo riportare o riproporzionare
{
TGeneric_distrib d(peso_imballo_ddt, 3);
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
d.add(art.conai_weight(cc));
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
rdoc.put(conai_peso_name(cc), d.get());
// Arrotondo la eventuale differenza di pesi al grammo
real diff = peso_imballo_ddt - peso_imballo_anamag; diff.round(3);
// Il peso in bolla e' diverso da quello in anagrafica: devo riproporzionarli
if (!diff.is_zero() && !peso_imballo_ddt.is_zero())
{
TGeneric_distrib d(peso_imballo_ddt, 3);
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
d.add(art.conai_weight(cc));
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
rdoc.put(conai_peso_name(cc), d.get());
}
else
{
// Il peso in bolla coincide con quello in anagrafica: devo riportarli
FOR_EACH_CONFIGURED_CONAI_CLASS(cc)
rdoc.put(conai_peso_name(cc), art.conai_weight(cc));
}
}
else
{
// Caso semplice della sola carta
rdoc.put(conai_peso_name(ct), peso_imballo_ddt);
rdoc.put(conai_peso_name(CONAI_CARTA), peso_imballo_ddt);
}
rdoc.put("FAMILY", get_str("FamilyCode")); // Uso campo virtuale RG1:FAMILY
}

View File

@ -1,7 +1,7 @@
Nomi dei campi per il CONAI
---------------------------
Nomi campi in configurazione (conai_conf_names)
Nomi campi in configurazione: bool conai_configured_class(TCONAI_class cc)
-----------------------------------------------
Si trovano nel ditta.ini, paragrafo [ve]
@ -13,7 +13,7 @@ CONFLEG
CONFVET
Nomi campi sottocategorie CONAI in righe documento (conai_scat_rdoc)
Nomi campi sottocategorie CONAI: const char* conai_sottocat_name(TCONAI_class cc, int logic_num);
--------------------------------------------------------------------
Si trovano nei campi virtuali del file 34 RDOC
@ -24,22 +24,7 @@ CONSCPLA
CONSCLEG
CONSCVET
Nomi campi pesi unitari CONAI in righe documento (conai_peso_rdoc)
--------------------------------------------------------------------
Si trovano nei campi virtuali del file 34 RDOC
CONPUACC
CONPUALL
CONPUCAR
CONPUPLA
CONPULEG
CONPUVET
Nomi campi sottocategorie CONAI in anagrafica articoli (conai_scat_anamag)
--------------------------------------------------------------------------
E' un campo solo diviso a stringhe di 4: si trova nel file 47 ANAMAG
Si trovano anche come sottoscringhe del campo CONAISC del file 47 ANAMAG
CONAISC[1,4] acciaio
CONAISC[5,8] alluminio
@ -49,9 +34,9 @@ CONAISC[17,20] legno
CONAISC[21,24] vetro
Nomi campi pesi unitari CONAI in anagrafica articoli (conai_peso_anamag)
------------------------------------------------------------------------
Si trovano nei campi del file 47 ANAMAG
Nomi campi pesi unitari CONAI: const char* conai_peso_name(TCONAI_class cc, int logic_num);
--------------------------------------------------------------------
Si trovano nei campi fisici file 47 ANAMAG
CONACC
CONALL
@ -60,4 +45,13 @@ CONPLA
CONLEG
CONVET
Si trovano anche nei campi virtuali del file 34 RDOC
CONPUACC
CONPUALL
CONPUCAR
CONPUPLA
CONPULEG
CONPUVET