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:
parent
dde89c0348
commit
2ab4a131ad
@ -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(); }
|
||||
|
161
tp/tp0102.cpp
161
tp/tp0102.cpp
@ -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
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user