Patch level :10.0

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
prima implementazione upload BR


git-svn-id: svn://10.65.10.50/branches/R_10_00@21519 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2011-01-26 16:56:02 +00:00
parent 129eb8cf76
commit c7b85a1033
4 changed files with 162 additions and 48 deletions

View File

@ -252,6 +252,7 @@ void TFile2Txt::genera_clienti_txt(const long da_codcli)
key_cfven.add(codcf);
const TRectype& rec_cfven = cache().get(LF_CFVEN, key_cfven);
const TString& listino_cliente = rec_cfven.get(CFV_CODLIST);
clienti.set("CodiceListino", listino_cliente);
const TString& str_sconto = archivio_clienti.get(CFV_SCONTO).as_string();
clienti.set("ScontoFineFattura", hd_find_sconto(str_sconto));

View File

@ -3,8 +3,10 @@
#include <progind.h>
#include <reputils.h>
#include "halib.h"
#include "../mg/movmag.h"
#include "../mg/rmovmag.h"
#include "halib.h"
#include "ha1300a.h"
#define UPLOAD_FILE "upload.d"
@ -251,6 +253,11 @@ class TUpload2Campo : public TSkeleton_application
bool _can_write;
protected:
//metodi di basso livello
const TString& check_agente(TString& codice_terminale, TLog_report& log);
const TString& check_articolo(TString& codart, TLog_report& log);
//metodi di alto livello
void elabora_SU(THardy_upload_recordset& recset, TLog_report& log);
void elabora_BR(THardy_upload_recordset& recset, TLog_report& log);
void elabora_VC(THardy_upload_recordset& recset, TLog_report& log);
@ -264,6 +271,42 @@ public:
virtual bool create();
};
//metodo che controlla se il terminale corrisponde ad un agente registrato e restituisce l'agente
const TString& TUpload2Campo::check_agente(TString& codice_terminale, TLog_report& log)
{
codice_terminale.right_just(3, '0');
TString8 codice_agente = codice_terminale;
codice_agente.right_just(5, '0');
const TRectype& rec_age = cache().get(LF_AGENTI, codice_agente);
const TString& codage_campo = rec_age.get(AGE_CODAGE);
if (codage_campo != codice_agente)
{
_can_write = false;
TString msg;
msg << "Codice agente " << codice_agente << " da terminale: sconosciuto";
log.log(2, msg);
}
return codage_campo;
}
//metodo che controlla che l'articolo esista su Campo
const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log)
{
codart.trim();
const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart);
const TString& articolo_campo = rec_anamag.get(ANAMAG_CODART);
if (articolo_campo != codart)
{
_can_write = false;
TString msg;
msg << "Codice articolo " << codart << " sconosciuto su Campo";
log.log(2, msg);
}
return rec_anamag.get(ANAMAG_DESCR);
}
void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log)
{
@ -275,16 +318,6 @@ void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log
log.log(0, msg);
}
void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log)
{
const TString& cod_term = recset.get("CodiceTerminale").as_string();
const long ndoc = recset.get("NumeroDoc").as_int();
TString msg;
msg << "Scartato movimento magazzino. Terminale: " << cod_term << " N.Doc: " << ndoc;
log.log(0, msg);
}
void TUpload2Campo::elabora_VC(THardy_upload_recordset& recset, TLog_report& log)
{
const TString& cod_term = recset.get("CodiceTerminale").as_string();
@ -300,34 +333,113 @@ void TUpload2Campo::elabora_SI(THardy_upload_recordset& recset, TLog_report& log
{
}
void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log)
{
//dati dal recordset di upload
TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
const TString& codice_agente = check_agente(codice_terminale, log);
const TString8 cod_magazzino = cache().get(LF_AGENTI, codice_agente, AGE_CODMAG);
const long curr_movmag = recset.get("NumeroDoc").as_int();
const TString& str_data_mov = recset.get("DataMov").as_string();
const TDate data_mov = upload_format_date6(str_data_mov);
const int anno = data_mov.year();
TString descr;
descr << "Agente: " << codice_terminale;
//1) crea la testata
//movimento di magazzino da riempire
TMov_mag movmag;
//const long numreg = atol(movmag.get_next_key());
//movmag.put(MOVMAG_NUMREG, numreg);
movmag.put(MOVMAG_ANNOES, anno);
movmag.put(MOVMAG_DATAREG, data_mov);
movmag.put(MOVMAG_DATACOMP, data_mov);
movmag.put(MOVMAG_EXNUMDOC, curr_movmag);
movmag.put(MOVMAG_EXDATADOC, data_mov);
movmag.put(MOVMAG_DESCR, descr);
//movmag.put(MOVMAG_CODCAUS, codcaus);
bool go_on = true;
// righe movimento di magazzino
//scansione delle righe documento su record BR
while (go_on)
{
//2) crea le righe (legge tutti i record di tipo BR successivi finchè hanno lo stesso numero documento!)
//agginunge una nuova riga (solo merce, per quanto ne sappiamo)
TRectype& rmovmag = movmag.new_row();
rmovmag.put(RMOVMAG_CODMAG, cod_magazzino);
TString8 codart = recset.get("CodiceArticolo").as_string();
check_articolo(codart, log);
rmovmag.put(RMOVMAG_CODART, codart);
TToken_string key_umart;
key_umart.add(codart);
key_umart.add(1);
const TString& um = cache().get(LF_UMART, key_umart, UMART_UM);
rmovmag.put(RMOVMAG_UM, um);
const TString& lotto = recset.get("CodiceLotto").as_string();
rmovmag.put(RMOVMAG_LIVGIAC, lotto);
real qta = recset.get("Qta[int]").as_real();
qta += recset.get("Qta[dec]").as_real() / CENTO;
rmovmag.put(RMOVMAG_QUANT, qta);
//quando non trova un BR con lo stesso numero di movimento significa che le righe sono finite!
go_on = recset.move_next();
if (go_on && (recset.get("TipoRecord").as_string() != "BR" || curr_movmag != recset.get("NumeroDoc").as_int()))
{
recset.move_prev(); //allora torna indietro di un record per riposizionarsi sull'ultimo non letto
go_on = false;
}
}
//incredibilmente arriva in fondo
TString msg;
msg << "Doc.: " << curr_movmag << " Terminale: " << codice_terminale;
//se può scrivere...
if (_can_write)
{
//alla fine della fiera salva il maggico movimento di magazzino
TLocalisamfile file_movmag(LF_MOVMAG);
int err = movmag.write(file_movmag);
if (err == NOERR)
{
msg.insert("Registrato mov. magazzino: ", 0);
log.log(0, msg);
}
else
{
msg.insert("Impossibile registrare mov. magazzino: ", 0);
log.log(2, msg);
}
}
else //..sennò avverte e basta
{
msg.insert("Controllato mov. magazzino: ", 0);
log.log(0, msg);
}
log.log(0, "");
}
void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log)
{
//1) codice terminale (lungo 3) e codice agente (lungo 5)
TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
codice_terminale.right_just(3, '0');
TString8 codice_agente = codice_terminale;
codice_agente.right_just(5, '0');
const TRectype& rec_age = cache().get(LF_AGENTI, codice_agente);
const TString& codage = rec_age.get(AGE_CODAGE);
const TString8 codmag = rec_age.get(AGE_CODMAG); //magazzino collegato all'agente (serve nelle righe)
if (codage != codice_agente)
{
_can_write = false;
TString msg;
msg << "Codice agente " << codice_agente << " da terminale: sconosciuto";
log.log(2, msg);
}
const TString& codice_agente = check_agente(codice_terminale, log);
const TString8 codmag = cache().get(LF_AGENTI, codice_agente, AGE_CODMAG);
//2) Testata documento
//genera una simpatico documento di cui raccatta la chiave
const TString& str_datadoc = recset.get(DOC_DATADOC).as_string();
int anno = 2000 + atoi(str_datadoc.right(2));
const int mese = atoi(str_datadoc.mid(2,2));
const int giorno = atoi(str_datadoc.left(2));
const TDate datadoc = upload_format_date6(str_datadoc);
char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0];
//2a) tipo documento
@ -350,6 +462,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
}
//2b) numerazione documento
//il codnum dipende dal tipo documento del terminale (F,B,O...) e dal codice del terminale
//se tipo 'V' va cambiato in tipo 'B' in quanto le bolle valorizzate sono normali bolle in Campo
TString4 codnum;
if (rec_tipodoc == 'V')
rec_tipodoc = 'B';
@ -366,7 +479,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
const long ndoc = recset.get(DOC_NDOC).as_int();
TDocumento doc('D', anno, codnum, ndoc);
TDocumento doc('D', datadoc.year(), codnum, ndoc);
//2c) tipo documento e data documento
doc.put(DOC_TIPODOC, tipodoc);
@ -374,7 +487,6 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
const TString& caus_movmag = td.caus_mov();
doc.put(DOC_CAUSMAG, caus_movmag);
TDate datadoc(giorno, mese, anno);
doc.put(DOC_DATADOC, datadoc);
//2d) cliente e campi collegati via cli2doc()
@ -425,21 +537,12 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
//serie delle put sulla riga documento; ricordiamo che la chiave della riga viene riempita dalla new_row
//3a) articolo
TString8 codart = recset.get(RDOC_CODART).as_string();
codart.trim();
const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart);
const TString& articolo = rec_anamag.get(ANAMAG_CODART);
if (articolo != codart)
{
_can_write = false;
TString msg;
msg << "Codice articolo " << codart << " sconosciuto";
log.log(2, msg);
}
const TString& descr = check_articolo(codart, log);
rigadoc.put(RDOC_CODART, codart);
rigadoc.put(RDOC_CODARTMAG, codart);
rigadoc.put(RDOC_CHECKED, "X");
rigadoc.put(RDOC_DESCR, rec_anamag.get(ANAMAG_DESCR));
rigadoc.put(RDOC_DESCR, descr);
//3b) umart
const TString& umqta = recset.get(RDOC_UMQTA).as_string();
@ -510,7 +613,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
//incredibilmente arriva in fondo
TString msg;
msg << anno << "-" << codnum << "-" << ndoc << " Terminale: " << codice_terminale << " Cliente: " << codcf;
msg << datadoc.year() << "-" << codnum << "-" << ndoc << " Terminale: " << codice_terminale << " Cliente: " << codcf;
//se può scrivere...
if (_can_write)
{
@ -550,7 +653,7 @@ void TUpload2Campo::elabora(const TMask& mask)
recset.sort(ordina_upload);
#ifdef DBG
recset.save_as("c:/temp/hardy/cazzone.txt");
recset.save_as("D:/dati/hardy/cazzone.txt");
#endif
//creazione progind e log
@ -592,8 +695,8 @@ void TUpload2Campo::elabora(const TMask& mask)
case 3: //tipo record: SI (incasso documenti)
elabora_SI(recset, log);
break;
case 4: //tipo record: BR (movimenti magazzino)
//elabora_BR(recset, log); //non li importiamo perchè vengono eseguiti alla scrittura dei documenti importati su archivi
case 4: //tipo record: BR (righe movimenti magazzino)
elabora_BR(recset, log);
break;
case 5: //tipo record: VC (Variazioni Cliente)
//elabora_VC(recset, log); //non serve! gli agenti non possono immettere clienti da terminale!

View File

@ -401,6 +401,15 @@ const TString& hd_format_date6(const TDate& data)
return str_data;
}
const TDate upload_format_date6(const TString& str_data)
{
int anno = 2000 + atoi(str_data.right(2));
const int mese = atoi(str_data.mid(2,2));
const int giorno = atoi(str_data.left(2));
TDate data(giorno, mese, anno);
return data;
}
// determina codice cliente campo a partire da codice hardy in base alle regole dettatemi da Robbi
long hd_key2cli(const TString& key)

View File

@ -218,6 +218,7 @@ real hd_find_sconto(const TString& str_sconto);
const TString& hd_find_codag(long codcf); // Da cliente campo ad agente Hardy ("007")
const TString& hd_format_date8(const TDate& data);
const TString& hd_format_date6(const TDate& data);
const TDate upload_format_date6(const TString& str_data);
long hd_key2cli(const TString& key);
long hd_key2forn(const TString& key);
void hd_key2conto(const TString& key, int& gr, int& co, long& so);