Patch level : 10.0 patch 414
Files correlati : lv2 Ricompilazione Demo : [ ] Commento : Aggiunta la gestione del ritiro automatico della dotazione temporanea git-svn-id: svn://10.65.10.50/trunk@19225 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
parent
19378ae935
commit
e5f88c409a
334
lv/lv2400.cpp
334
lv/lv2400.cpp
@ -4,6 +4,7 @@
|
||||
#include <reprint.h>
|
||||
|
||||
#include "lvlib.h"
|
||||
#include "../mg/clifogiac.h"
|
||||
#include "../ve/velib.h"
|
||||
#include "../ve/rcondv.h"
|
||||
|
||||
@ -201,20 +202,22 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
||||
doc.put("DATAPRCO", dtcons);
|
||||
|
||||
const long ndoc = doc.get_long(DOC_NDOC);
|
||||
|
||||
//preparo la chiave per la tabella righe contratti
|
||||
TToken_string keyrcont;
|
||||
keycont.add(codcli);
|
||||
keycont.add(codcont);
|
||||
|
||||
FOR_EACH_ASSOC_OBJECT(_quantita,h,codart,obj)
|
||||
{
|
||||
crea_riga(codart, modpas, tplis, false, prinbo, doc, rep);
|
||||
//preparo la chiave per la tabella righe contratti
|
||||
TToken_string keyrcont;
|
||||
keyrcont.add(codcli);
|
||||
keyrcont.add(codcont);
|
||||
keyrcont.add(codart);
|
||||
const TRectype& rcont = cache().get(LF_LVRCONDV, keyrcont);
|
||||
const TDate dadata = (TDate)rcont.get(LVRCONDV_INDTTMP);
|
||||
const TDate adata = (TDate)rcont.get(LVRCONDV_FIDTTMP);
|
||||
|
||||
/*const TDate dadata = rcont.get(LVRCONDV_INDTTMP).as_date();
|
||||
const TDate adata = rcont.get(LVRCONDV_FIDTTMP).as_date();
|
||||
if (dadata.ok() && dtcons >= dadata && dtcons <= adata)
|
||||
crea_riga(rcont, modpas, true, doc);*/
|
||||
if (dadata.ok() && dtcons == adata)
|
||||
crea_riga(codart, modpas, tplis, true, prinbo, doc, rep);
|
||||
else
|
||||
crea_riga(codart, modpas, tplis, false, prinbo, doc, rep);
|
||||
}
|
||||
|
||||
if (doc.rows() > 0)
|
||||
@ -238,8 +241,7 @@ bool TGenera_documenti_app::crea_documento(const TISAM_recordset& plan, TLog_rep
|
||||
//CREA_RIGA: questa funzione crea una riga merce per una bolla di consegna
|
||||
void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas, const int tplis, const bool tmp, const bool prinbo, TDocumento& doc, TLog_report& rep)
|
||||
{
|
||||
const int perarr = _configlv->get_int("Perarr");
|
||||
|
||||
const int perarr = ini_get_int(CONFIG_DITTA, "lv", "Perarr");
|
||||
//creo la nuova riga
|
||||
TString4 tiporiga;
|
||||
switch (_buono)
|
||||
@ -249,8 +251,6 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas,
|
||||
default: break;
|
||||
}
|
||||
|
||||
TRiga_documento& rdoc = doc.new_row(tiporiga);
|
||||
|
||||
const long codcli = doc.get_long(DOC_CODCF);
|
||||
const long codcont = doc.get_long(DOC_CODCONT);
|
||||
|
||||
@ -272,7 +272,7 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas,
|
||||
arrot = false;
|
||||
|
||||
const real conguaglio = rcont.get_real(LVRCONDV_QTACONG);
|
||||
const real& qta = *(real*)_quantita.objptr(codart);
|
||||
real& qta = *(real*)_quantita.objptr(codart);
|
||||
const real& qta1 = *(real*)_quantita_ritirata.objptr(codart);
|
||||
|
||||
//instanzio una cache sulla tabella del magazzino
|
||||
@ -280,138 +280,198 @@ void TGenera_documenti_app::crea_riga(const TString& codart, const char modpas,
|
||||
//recupero i dati di interesse dall'anagrafica di magazzino
|
||||
const real ppconf = anamag.get_real(ANAMAG_PPCONF);
|
||||
|
||||
const real quantita_noarr = qta - conguaglio;
|
||||
real quantita_arr = quantita_noarr > ZERO ? quantita_noarr : ZERO;
|
||||
//se devo arrotondare
|
||||
if (quantita_arr > ZERO && arrot)
|
||||
//GESTIONE DOTAZIONE TEMPOARANEA
|
||||
if (tmp && rcont.get_bool(LVRCONDV_RITAUDTTMP))
|
||||
{
|
||||
//calcolo di quanti pezzi sforo
|
||||
long arr = quantita_arr.integer() % ppconf.integer();
|
||||
//se sforo (arr > 0) allora calcolo quanti pezzi in più gli devo dare e aggiorno la quantità
|
||||
if (arr > 0)
|
||||
if (arr > ppconf.integer() * perarr / 100) //arr <= ppconf*perarr/100 -> formula calcolo congualgio di Tassan
|
||||
{
|
||||
arr = ppconf.integer() - arr;
|
||||
quantita_arr += arr;
|
||||
}
|
||||
else
|
||||
quantita_arr -= arr;
|
||||
}
|
||||
TRiga_documento& rdoc = doc.new_row(tiporiga);
|
||||
rdoc.put(RDOC_CODART,codart);
|
||||
rdoc.put(RDOC_CODARTMAG,codart);
|
||||
rdoc.put(RDOC_CHECKED,'X');
|
||||
|
||||
if (prinbo)
|
||||
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP)); //prezzo
|
||||
|
||||
//scrivo le quantità
|
||||
rdoc.put(RDOC_QTA, quantita_arr); //quantità consegnata eventualmente arrotondata
|
||||
rdoc.put(RDOC_QTAGG1, qta1); //quantità ritirata
|
||||
rdoc.put(RDOC_QTAGG2, conguaglio); //conguaglio
|
||||
rdoc.put(RDOC_QTAGG3, quantita_arr); //copia della quantità consegnata
|
||||
rdoc.put(RDOC_QTAGG4, quantita_noarr); //quantità che avrei consegnato se non arrotondavo (qta ritirata)
|
||||
rdoc.put(RDOC_GENERATA, true);
|
||||
//recupero i valori delle dotazione temporanea dal magazzino del cliente
|
||||
TLocalisamfile magcli(LF_CLIFOGIAC);
|
||||
magcli.put(CLIFOGIAC_ANNOES, doc.get_date(DOC_DATADOC).year());
|
||||
magcli.put(CLIFOGIAC_TIPOCF, 'C');
|
||||
magcli.put(CLIFOGIAC_CODCF, codcli);
|
||||
magcli.put(CLIFOGIAC_INDSPED, 0); //in realtà è da leggere dal contratto
|
||||
magcli.put(CLIFOGIAC_CODART, codart);
|
||||
magcli.put(CLIFOGIAC_NRIGA, 1);
|
||||
//leggo il record corrispondente
|
||||
magcli.read();
|
||||
long dottmp = magcli.get_long(CLIFOGIAC_DOTTM);
|
||||
|
||||
const TString4 causale = ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV");
|
||||
rdoc.put(RDOC_CODAGG1, causale); //causale presa dalla configurazione
|
||||
|
||||
//aggiorno il conguaglio sulla riga del contratto
|
||||
if (!rcont.empty())
|
||||
aggiorna_conguaglio((TRectype&)rcont, quantita_arr - quantita_noarr);
|
||||
|
||||
//elaborazione sul prezzo da utilizzare
|
||||
real prezzo;
|
||||
|
||||
if (rcont.empty())
|
||||
{
|
||||
//PROPONI PREZZO
|
||||
TToken_string key;
|
||||
key.add('C');
|
||||
key.add(codcli);
|
||||
const TRectype& cfven = cache().get(LF_CFVEN, key);
|
||||
|
||||
bool trvlst = false;
|
||||
|
||||
if (!cfven.empty())
|
||||
//se ho ritirato un quantitativo di roba maggiore o uguale alla dotazione temporanea
|
||||
//allora creo la nuova riga documento e azzero la dottmp; altrimenti preparo la riga
|
||||
//per la quantità che ho ritirato e tengo traccia della cosa
|
||||
if (qta >= dottmp)
|
||||
{
|
||||
//se è settata la categoria merceologica, leggo sia il listino che la cat merc, altrimenti solo il listino
|
||||
TString8 codlis = cfven.get(CFV_CODLIST);
|
||||
TString8 catven;
|
||||
TConfig* configve = new TConfig(CONFIG_DITTA,"ve");
|
||||
const char gesliscv = configve->get_char("GESLISCV");
|
||||
if (gesliscv != 'X')
|
||||
catven = "";
|
||||
else
|
||||
catven = cfven.get(CFV_CATVEN);
|
||||
|
||||
//cerco il prezzo sul listino
|
||||
key.cut(0);
|
||||
key.add('L'); //tipo
|
||||
key.add(catven); //catven
|
||||
key.add(""); //tipocf
|
||||
key.add(""); //codcf
|
||||
key.add(codlis); //codlis
|
||||
key.add('A'); //tiporiga
|
||||
key.add(codart); //codriga
|
||||
key.add(""); //um
|
||||
key.add(""); //nscagl
|
||||
const TRectype& rcondv = cache().get(LF_RCONDV, key);
|
||||
|
||||
if (!rcondv.empty())
|
||||
{
|
||||
prezzo = rcondv.get_real(RCONDV_PREZZO);
|
||||
trvlst = true;
|
||||
}
|
||||
qta -= dottmp;
|
||||
rdoc.put(RDOC_QTAGG1, dottmp); //quantità ritirata
|
||||
rdoc.put(RDOC_GENERATA, true);
|
||||
rdoc.put(RDOC_CODAGG1, ini_get_string(CONFIG_DITTA, "lv", "CAULVRITDT"));
|
||||
dottmp = 0;
|
||||
}
|
||||
|
||||
//se non ho trovato un listino, o se non c'è un listino impostato
|
||||
//propongo come prezzo il valore convenzionale
|
||||
if (!trvlst)
|
||||
{
|
||||
key.cut(0);
|
||||
key.add(codart);
|
||||
key.add(1);
|
||||
const TRectype& umart = cache().get(LF_UMART, key);
|
||||
prezzo = umart.get_real(UMART_PREZZO);
|
||||
if (umart.get(UMART_PREZZO).full())
|
||||
trvlst = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino
|
||||
if (tplis == 0)
|
||||
prezzo = rcont.get_real(LVRCONDV_PREZZO);
|
||||
else
|
||||
prezzo = anamag.get_real(ANAMAG_COSTSTD);
|
||||
{
|
||||
dottmp -= qta.integer();
|
||||
rdoc.put(RDOC_QTAGG1, qta); //quantità ritirata
|
||||
rdoc.put(RDOC_GENERATA, true);
|
||||
rdoc.put(RDOC_CODAGG1, ini_get_string(CONFIG_DITTA, "lv", "CAULVRITDT"));
|
||||
TString str;
|
||||
str << "L'articolo " << codart << " inserito nel documento " << doc.get(DOC_CODNUM) << "-" << doc.get(DOC_TIPODOC)
|
||||
<< " numero " << doc.get(DOC_NDOC) << " in dotazione temporanea non è stato ritirato completamente."
|
||||
<< " Mancano " << dottmp << "unità";
|
||||
rep.log(1, str);
|
||||
qta = ZERO;
|
||||
}
|
||||
|
||||
//riscrivo la dotazione temporanea aggiornata
|
||||
magcli.put(CLIFOGIAC_ANNOES, doc.get_date(DOC_DATADOC).year());
|
||||
magcli.put(CLIFOGIAC_TIPOCF, 'C');
|
||||
magcli.put(CLIFOGIAC_CODCF, codcli);
|
||||
magcli.put(CLIFOGIAC_INDSPED, 0); //in realtà è da leggere dal contratto
|
||||
magcli.put(CLIFOGIAC_CODART, codart);
|
||||
magcli.put(CLIFOGIAC_NRIGA, 1);
|
||||
magcli.put(CLIFOGIAC_DOTTM, dottmp);
|
||||
magcli.rewrite();
|
||||
}
|
||||
|
||||
rdoc.put(RDOC_CODART,codart);
|
||||
rdoc.put(RDOC_CODARTMAG,codart);
|
||||
rdoc.put(RDOC_CHECKED,'X');
|
||||
if (prinbo)
|
||||
if (qta > ZERO)
|
||||
{
|
||||
if (!tmp)
|
||||
rdoc.put(RDOC_PREZZO, prezzo);
|
||||
else //per adesso per questo ramo non ci passa mai, perchè non sappiamo come gestire le dotazioni temporanee
|
||||
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP));
|
||||
rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto
|
||||
TRiga_documento& rdoc = doc.new_row(tiporiga);
|
||||
|
||||
const real quantita_noarr = qta - conguaglio;
|
||||
real quantita_arr = quantita_noarr > ZERO ? quantita_noarr : ZERO;
|
||||
//se devo arrotondare
|
||||
if (quantita_arr > ZERO && arrot)
|
||||
{
|
||||
//calcolo di quanti pezzi sforo
|
||||
long arr = quantita_arr.integer() % ppconf.integer();
|
||||
//se sforo (arr > 0) allora calcolo quanti pezzi in più gli devo dare e aggiorno la quantità
|
||||
if (arr > 0)
|
||||
if (arr > ppconf.integer() * perarr / 100) //arr <= ppconf*perarr/100 -> formula calcolo congualgio di Tassan
|
||||
{
|
||||
arr = ppconf.integer() - arr;
|
||||
quantita_arr += arr;
|
||||
}
|
||||
else
|
||||
quantita_arr -= arr;
|
||||
}
|
||||
|
||||
//scrivo le quantità
|
||||
rdoc.put(RDOC_QTA, quantita_arr); //quantità consegnata eventualmente arrotondata
|
||||
rdoc.put(RDOC_QTAGG1, qta1); //quantità ritirata
|
||||
rdoc.put(RDOC_QTAGG2, conguaglio); //conguaglio
|
||||
rdoc.put(RDOC_QTAGG3, quantita_arr); //copia della quantità consegnata
|
||||
rdoc.put(RDOC_QTAGG4, quantita_noarr); //quantità che avrei consegnato se non arrotondavo (qta ritirata)
|
||||
rdoc.put(RDOC_GENERATA, true);
|
||||
|
||||
rdoc.put(RDOC_CODAGG1, ini_get_string(CONFIG_DITTA, "lv", "CAUSLAV")); //causale presa dalla configurazione
|
||||
|
||||
//aggiorno il conguaglio sulla riga del contratto
|
||||
if (!rcont.empty())
|
||||
aggiorna_conguaglio((TRectype&)rcont, quantita_arr - quantita_noarr);
|
||||
|
||||
//elaborazione sul prezzo da utilizzare
|
||||
real prezzo;
|
||||
|
||||
if (rcont.empty())
|
||||
{
|
||||
//PROPONI PREZZO
|
||||
TToken_string key;
|
||||
key.add('C');
|
||||
key.add(codcli);
|
||||
const TRectype& cfven = cache().get(LF_CFVEN, key);
|
||||
|
||||
bool trvlst = false;
|
||||
|
||||
if (!cfven.empty())
|
||||
{
|
||||
//se è settata la categoria merceologica, leggo sia il listino che la cat merc, altrimenti solo il listino
|
||||
TString8 codlis = cfven.get(CFV_CODLIST);
|
||||
TString8 catven;
|
||||
TConfig* configve = new TConfig(CONFIG_DITTA,"ve");
|
||||
const char gesliscv = configve->get_char("GESLISCV");
|
||||
if (gesliscv != 'X')
|
||||
catven = "";
|
||||
else
|
||||
catven = cfven.get(CFV_CATVEN);
|
||||
//cerco il prezzo sul listino
|
||||
key.cut(0);
|
||||
key.add('L'); //tipo
|
||||
key.add(catven); //catven
|
||||
key.add(""); //tipocf
|
||||
key.add(""); //codcf
|
||||
key.add(codlis); //codlis
|
||||
key.add('A'); //tiporiga
|
||||
key.add(codart); //codriga
|
||||
key.add(""); //um
|
||||
key.add(""); //nscagl
|
||||
const TRectype& rcondv = cache().get(LF_RCONDV, key);
|
||||
|
||||
if (!rcondv.empty())
|
||||
{
|
||||
prezzo = rcondv.get_real(RCONDV_PREZZO);
|
||||
trvlst = true;
|
||||
}
|
||||
}
|
||||
//se non ho trovato un listino, o se non c'è un listino impostato
|
||||
//propongo come prezzo il valore convenzionale
|
||||
if (!trvlst)
|
||||
{
|
||||
key.cut(0);
|
||||
key.add(codart);
|
||||
key.add(1);
|
||||
const TRectype& umart = cache().get(LF_UMART, key);
|
||||
prezzo = umart.get_real(UMART_PREZZO);
|
||||
if (umart.get(UMART_PREZZO).full())
|
||||
trvlst = true;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//elaborazione per il prezzo: o lo prendo dalle righe contratto, o dall'anagrafica magazzino
|
||||
if (tplis == 0)
|
||||
prezzo = rcont.get_real(LVRCONDV_PREZZO);
|
||||
else
|
||||
prezzo = anamag.get_real(ANAMAG_COSTSTD);
|
||||
}
|
||||
|
||||
rdoc.put(RDOC_CODART,codart);
|
||||
rdoc.put(RDOC_CODARTMAG,codart);
|
||||
rdoc.put(RDOC_CHECKED,'X');
|
||||
if (prinbo)
|
||||
{
|
||||
if (!tmp)
|
||||
rdoc.put(RDOC_PREZZO, prezzo);
|
||||
else //per adesso per questo ramo non ci passa mai, perchè non sappiamo come gestire le dotazioni temporanee
|
||||
rdoc.put(RDOC_PREZZO,rcont.get_real(LVRCONDV_PRZDTTMP));
|
||||
rdoc.put(RDOC_SCONTO,rcont.get(LVRCONDV_SCONTPERC)); //sconto
|
||||
}
|
||||
|
||||
//scrivo il magazzino
|
||||
TString8 magazzino;
|
||||
TString8 magazzinoc;
|
||||
|
||||
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
|
||||
magazzinoc << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGC");
|
||||
|
||||
rdoc.put(RDOC_CODMAG, magazzino);
|
||||
rdoc.put(RDOC_CODMAGC, magazzinoc);
|
||||
|
||||
//se il record di riga contratto è vuoto aggiorno il log
|
||||
if (rcont.empty())
|
||||
{
|
||||
TString str;
|
||||
str << "L'articolo " << codart << " inserito nel documento " << doc.get(DOC_CODNUM) << "-" << doc.get(DOC_TIPODOC)
|
||||
<< " numero " << doc.get(DOC_NDOC) << " per la quantità di " << quantita_arr << " unità"
|
||||
<< " non è prsente sul contratto del cliente " << codcli;
|
||||
rep.log(1, str);
|
||||
}
|
||||
}
|
||||
|
||||
//scrivo il magazzino
|
||||
TString8 magazzino;
|
||||
TString8 magazzinoc;
|
||||
|
||||
magazzino << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGN");
|
||||
magazzinoc << ini_get_string(CONFIG_DITTA, "lv", "CODMAG") << ini_get_string(CONFIG_DITTA, "lv", "CODMAGC");
|
||||
|
||||
rdoc.put(RDOC_CODMAG, magazzino);
|
||||
rdoc.put(RDOC_CODMAGC, magazzinoc);
|
||||
|
||||
//se il record di riga contratto è vuoto aggiorno il log
|
||||
if (rcont.empty())
|
||||
{
|
||||
TString str;
|
||||
str << "L'articolo " << codart << " inserito nel documento " << doc.get(DOC_CODNUM) << "-" << doc.get(DOC_TIPODOC)
|
||||
<< " numero " << doc.get(DOC_NDOC) << " per la quantità di " << quantita_arr << " unità"
|
||||
<< " non è prsente sul contratto del cliente " << codcli;
|
||||
rep.log(1, str);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////
|
||||
|
Loading…
x
Reference in New Issue
Block a user