Patch level :10.0 917

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
hardy


git-svn-id: svn://10.65.10.50/branches/R_10_00@21572 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2011-02-02 15:04:06 +00:00
parent 8d45d91119
commit 3753641f11
4 changed files with 195 additions and 94 deletions

View File

@ -31,10 +31,10 @@
//pagina 2
//esportazione dati
#define F_OUTPUT_PATH 250
#define F_CARDOC_NUM 251
#define F_CARDOC_TIP 252
#define F_CARDOC_STA 253
#define F_BARCODE_TIP 254
#define F_OU_CARDOC_NUM 251
#define F_OU_CARDOC_TIP 252
#define F_OU_CARDOC_STA 253
#define F_OU_BARCODE_TIP 254
//importazione dati
#define F_INPUT_PATH 260
@ -42,6 +42,8 @@
#define F_IN_TIPODOC_B 262
#define F_IN_TIPODOC_O 263
#define F_IN_TIPODOC_V 264
#define F_IN_CODCAUS 265
#define F_IN_DESCRCAUS 266
//comuni inportazione-esportazione
#define F_CODICI_IVA 270

View File

@ -327,7 +327,7 @@ BEGIN
PROMPT 1 1 "@bEsportazione"
END
STRING F_OUTPUT_PATH 255 38
STRING F_OUTPUT_PATH 255 39
BEGIN
PROMPT 2 2 "Percorso files .txt da esportare "
DSELECT
@ -342,45 +342,45 @@ BEGIN
PROMPT 2 3 "@bDocumenti di carico"
END
STRING F_CARDOC_NUM 4
STRING F_OU_CARDOC_NUM 4
BEGIN
PROMPT 3 4 "Numerazione "
USE %NUM
INPUT CODTAB F_CARDOC_NUM
INPUT CODTAB F_OU_CARDOC_NUM
DISPLAY "Codice@8" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CARDOC_NUM CODTAB
OUTPUT F_OU_CARDOC_NUM CODTAB
CHECKTYPE REQUIRED
FIELD CarDocNum
END
STRING F_CARDOC_TIP 4
STRING F_OU_CARDOC_TIP 4
BEGIN
PROMPT 23 4 "Tipo "
USE %TIP
INPUT CODTAB F_CARDOC_TIP
INPUT CODTAB F_OU_CARDOC_TIP
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CARDOC_TIP CODTAB
OUTPUT F_OU_CARDOC_TIP CODTAB
CHECKTYPE REQUIRED
FLAGS "U"
FIELD CarDocTip
END
STRING F_CARDOC_STA 1
STRING F_OU_CARDOC_STA 1
BEGIN
PROMPT 36 4 "Stato "
USE %STD
INPUT CODTAB F_CARDOC_STA
INPUT CODTAB F_OU_CARDOC_STA
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CARDOC_STA CODTAB
OUTPUT F_OU_CARDOC_STA CODTAB
FLAGS "U"
CHECKTYPE REQUIRED
FIELD CarDocSta
END
LISTBOX F_BARCODE_TIP 10
LISTBOX F_OU_BARCODE_TIP 10
BEGIN
PROMPT 2 6 "Tipo di barcode "
ITEM "N|Normale"
@ -391,12 +391,12 @@ BEGIN
FIELD "TipoBarcode"
END
GROUPBOX DLG_NULL 76 12
GROUPBOX DLG_NULL 76 14
BEGIN
PROMPT 1 8 "@bImportazione"
END
STRING F_INPUT_PATH 255 38
STRING F_INPUT_PATH 255 44
BEGIN
PROMPT 2 9 "Percorso files da importare "
DSELECT
@ -461,22 +461,47 @@ END
TEXT DLG_NULL
BEGIN
PROMPT 2 13 "Le numerazioni sono generate automaticamente in base al tipo documento ricevuto"
PROMPT 2 12 "Le numerazioni sono generate automaticamente in base al tipo documento ricevuto"
END
TEXT DLG_NULL
BEGIN
PROMPT 2 14 "ed al codice terminale, secondo la regola: 'TipoDocumento'+'CodiceTerminale. Es. 'F'+'001' -> F001"
PROMPT 2 13 "ed al codice terminale, secondo la regola: 'TipoDocumento'+'CodiceTerminale. Es. 'F'+'001' -> F001"
END
STRING F_IN_CODCAUS 3
BEGIN
PROMPT 2 14 "Causale movimenti da incassi "
FLAGS "UZ"
USE LF_CAUSALI
INPUT CODCAUS F_IN_CODCAUS
DISPLAY "Cod." CODCAUS
DISPLAY "Descrizione@50" DESCR
OUTPUT F_IN_CODCAUS CODCAUS
OUTPUT F_IN_DESCRCAUS DESCR
CHECKTYPE REQUIRED
FIELD InpCausale
END
STRING F_IN_DESCRCAUS 50 37
BEGIN
PROMPT 37 14 ""
USE LF_CAUSALI KEY 2
INPUT DESCR F_IN_DESCRCAUS
DISPLAY "Descrizione @50" DESCR
DISPLAY "Cod." CODCAUS
COPY OUTPUT F_IN_CODCAUS
CHECKTYPE NORMAL
END
TEXT DLG_NULL
BEGIN
PROMPT 2 15 "@bCodici IVA Campo da utilizzare in base alle aliquote"
PROMPT 2 16 "@bCodici IVA Campo da utilizzare in base alle aliquote"
END
SPREADSHEET F_CODICI_IVA 74 3
SPREADSHEET F_CODICI_IVA 74 4
BEGIN
PROMPT 2 16 ""
PROMPT 2 17 ""
ITEM "%IVA@6"
ITEM "Cod.IVA"
ITEM "Descrizione"

View File

@ -610,8 +610,8 @@ void TFile2Txt::genera_carico_txt(const TMask& mask)
TString query;
query << "USE RDOC";
query << "\nSELECT (DOC.TIPODOC=#TIPODOC)&&(DOC.STATO=#STATO)";
query << "\nJOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC";
query << "\nBY DOC.CODAG";
query << "\nBY DOC.CODAG NDOC";
query << "\nJOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC";
query << "\nFROM CODNUM=#CODNUM ANNO=#ANNO PROVV=D NDOC=#DA_NDOC";
query << "\nTO CODNUM=#CODNUM ANNO=#ANNO PROVV=D NDOC=#A_NDOC";

View File

@ -3,6 +3,9 @@
#include <progind.h>
#include <reputils.h>
#include "../cg/cg2101.h"
#include "../cg/cg2103.h"
#include "../cg/cgsaldac.h"
#include "../mg/movmag.h"
#include "../mg/rmovmag.h"
@ -14,51 +17,44 @@
//funzione di ordinamento del file di upload una volta caricato in memoria
static TToken_string tipi_record("SU|VC|TF|RF|SI|BR|RC");
int ordina_upload(const TObject** o1, const TObject** o2)
{
const TString& s1 = *(TString*)*o1;
const TString& s2 = *(TString*)*o2;
if (s1[0] == 'V' || s2[0] == 'V')
//ordinatore dei record Testata e Riga fattura
if (s1[1] == 'F' && s2[1] == 'F')
{
if (s1[0] != 'V' || s2[0] != 'V')
return s1[0] == 'V' ? -1 : +1;
}
else
{
//ordinatore dei record Testata e Riga fattura
if (s1[1] == 'F' && s2[1] == 'F')
TToken_string k[2];
for (int i = 0; i < 2; i++)
{
TToken_string k[2];
for (int i = 0; i < 2; i++)
const TString& rec = i == 0 ? s1 : s2;
TToken_string& key = k[i];
if (rec[0] == 'T')
{
const TString& rec = i == 0 ? s1 : s2;
TToken_string& key = k[i];
if (rec[0] == 'T')
{
key.add(rec.mid(14,2)); //anno
key.add(rec.mid(16,1)); //tipodoc
key.add(rec.mid(5,5)); //numdoc
}
else
{
key.add(rec.mid(14,2)); //anno
key.add(rec.mid(28,1)); //tipodoc
key.add(rec.mid(5,5)); //numdoc
key.add(rec.mid(29,5)); //codart
}
key.add(rec.mid(14,2)); //anno
key.add(rec.mid(16,1)); //tipodoc
key.add(rec.mid(5,5)); //numdoc
}
else
{
key.add(rec.mid(14,2)); //anno
key.add(rec.mid(28,1)); //tipodoc
key.add(rec.mid(5,5)); //numdoc
key.add(rec.mid(29,5)); //codart
}
return k[0].compare(k[1]);
}
else
{
if (s1[1] == 'F')
return +1;
if (s2[1] == 'F')
return -1;
}
return k[0].compare(k[1]);
}
const int pos1 = tipi_record.get_pos(s1.left(2));
const int pos2 = tipi_record.get_pos(s2.left(2));
if (pos1 != pos2)
return pos1 - pos2;
return s1.compare(s2);
}
@ -101,13 +97,13 @@ THardy_upload_recordset::THardy_upload_recordset(const TFilename& filename)
//--------------
add_trc_field("SU", "TipoRecord", T_X, 1, 2); //x
add_trc_field("SU", "CodiceTerminale", T_N, 3, 3); //x
add_trc_field("SU", AGE_CODAGE, T_N, 6, 3); //x
add_trc_field("SU", "CodiceAgente", T_N, 6, 3); //x
add_trc_field("SU", "NonUsato", T_X, 9, 6);
add_trc_field("SU", "Targa", T_X, 15, 8);
add_trc_field("SU", "nDDT", T_N, 23, 5);
add_trc_field("SU", "nFATT", T_N, 28, 5);
add_trc_field("SU", "nBOLLA", T_N, 33, 5);
add_trc_field("SU", AGE_RAGSOC, T_X, 38, 30); //x
add_trc_field("SU", "NomeAgente", T_X, 38, 30); //x
//Tipo record TF
//--------------
@ -297,10 +293,11 @@ protected:
//metodi di basso livello
const TString& check_agente(TString& codice_terminale, TLog_report& log);
const TString& check_articolo(TString& codart, TLog_report& log);
long check_cliente(const TString& str_codcf, TLog_report& log);
void check_magazzino(const TString& codmag_age, TLog_report& log);
void check_causale(TString& codcaus, TLog_report& log);
//metodi di alto livello
//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);
@ -315,7 +312,11 @@ public:
virtual bool create();
};
//metodo che controlla se il terminale corrisponde ad un agente registrato e restituisce l'agente
/////////////////////////////////////////////////////////////////////////////////////////////////
// Metodi di basso livello
/////////////////////////////////////////////////////////////////////////////////////////////////
//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');
@ -336,7 +337,7 @@ const TString& TUpload2Campo::check_agente(TString& codice_terminale, TLog_repor
}
//metodo che controlla che l'articolo esista su Campo
//controlla che l'articolo esista su Campo
const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log)
{
codart.trim();
@ -352,7 +353,7 @@ const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log)
return rec_anamag.get(ANAMAG_DESCR);
}
//controlla l'esistenza del magazzino su Campo
void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log)
{
const TString& codmag_campo = cache().get("MAG", codmag_age, "CODTAB");
@ -365,6 +366,43 @@ void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log)
}
}
//controlla il cliente;se nuovo controlla che sia già stato importato nella lista dei nuovi clienti,se..
//esistente controlla che ci sia negli archivi Campo
long TUpload2Campo::check_cliente(const TString& str_codcf, TLog_report& log)
{
long codcf = 0L;
const bool new_cliente = str_codcf.find('*') >= 0;
if (new_cliente)
{
const real* ptr = (const real*)_nuovi_clienti.objptr(str_codcf);
codcf = ptr ? ptr->integer() : 0L;
}
else
{
TToken_string key_clifo;
key_clifo.add("C");
key_clifo.add(str_codcf);
codcf = atol(cache().get(LF_CLIFO, key_clifo, CLI_CODCF));
}
//controllo effettuabile solo se il cliente è già presente (vecchio o nuovo aggiunto con la importa_VC se era _can_write)
if (codcf <= 0)
{
_can_write = false;
TString msg;
msg << "Codice cliente " << str_codcf << " sconosciuto";
log.log(2, msg);
}
return codcf;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
// Metodi di alto livello
/////////////////////////////////////////////////////////////////////////////////////////////////
//SU non è un tipo record di qualche utilità
void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log)
{
@ -375,7 +413,7 @@ void TUpload2Campo::elabora_VC(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 codice_agente = check_agente(codice_terminale, log);
long codcf = recset.get("CodiceCliente").as_int();
@ -534,9 +572,63 @@ void TUpload2Campo::elabora_VC(THardy_upload_recordset& recset, TLog_report& log
}
}
//movimenti di incasso
void TUpload2Campo::elabora_SI(THardy_upload_recordset& recset, TLog_report& log)
{
//dati dal recordset di upload (con i relativi controlli)
TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
const TString& codice_agente = check_agente(codice_terminale, log);
const TString& str_codcf = recset.get("CodiceCliente").as_string();
long codcf = check_cliente(str_codcf, log);
//crea un movimento contabile pescando i dati dal recordset (e inventandosene qualcuno!)
//testata
const char tipo_cf = 'C';
const TDate data_incasso = recset.get("DataIncasso").as_date();
const TDate datareg = data_incasso;
const TDate datacomp = data_incasso;
TEsercizi_contabili esc;
const int annoes = esc.date2esc(data_incasso);
const long numdoc = recset.get("NumeroFattura").as_int();
const TDate datadoc = recset.get("DataFattura").as_date();
const TString4 tipodoc = recset.get("TipoDocumento").as_string();
const real incasso = recset.get("ImportoIncassato").as_real() / CENTO;
TConfig config(CONFIG_DITTA, "ha");
const TString& codcaus = config.get("InpCausale");
const TCausale caus(codcaus, datareg.year());
const int riga_abb = RIGA_ABBUONI_PASSIVI;
TBill conto_abbuoni; caus.bill(riga_abb, conto_abbuoni);
TMovimentoPN mov;
TRectype& head = mov.curr();
head.put(MOV_CODCAUS, codcaus);
head.put(MOV_DATAREG, datareg);
head.put(MOV_DATACOMP, datacomp);
TString descr;
descr << "Incasso. Cliente: " << codcf << " - Agente: " << codice_agente;
head.put(MOV_DESCR, descr);
head.put(MOV_ANNOES, annoes);
head.put(MOV_DATADOC, datadoc);
head.put(MOV_NUMDOC, numdoc);
head.put(MOV_TIPODOC, tipodoc);
if (_can_write)
{
if (mov.write() != NOERR)
_can_write = false;
TString msg;
msg << "Movimento di incasso non registrato. Cliente: " << codcf << " - Agente: " << codice_agente << " - Data: " << data_incasso;
log.log(2, msg);
}
const long numreg = head.get_long(MOV_NUMREG);
//righe
//crea i pagamenti aggiornando anche la partita
}
@ -649,6 +741,11 @@ void TUpload2Campo::elabora_BR(THardy_upload_recordset& recset, TLog_report& log
void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log)
{
char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0];
//i documenti di vendita annullati vanno ignorati
if (rec_tipodoc == 'A' || rec_tipodoc == 'N')
return;
//1) codice terminale (lungo 3) e codice agente (lungo 5)
TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
const TString& codice_agente = check_agente(codice_terminale, log);
@ -660,7 +757,7 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
const TString& str_datadoc = recset.get(DOC_DATADOC).as_string();
const TDate datadoc = upload_format_date6(str_datadoc);
char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0];
//2a) tipo documento
TString4 tipodoc;
TConfig hardy(CONFIG_DITTA, "ha");
@ -711,33 +808,10 @@ void TUpload2Campo::elabora_TF(THardy_upload_recordset& recset, TLog_report& log
//2d) cliente e campi collegati via cli2doc()
doc.put(DOC_TIPOCF, "C");
//se il cliente è nuovo, ovvero aggiunto in un record di tipo VC precedentemente letto,..
//..deve stabilire quale è il suo codcf campesco già determinato (è il caso dei codcf con *)
long codcf = 0L;
//dato il codice cliente sul recordset (stringa di 6) risale al codice di Campo (long di 6) stabilendo..
//..eventuali relazioni con i clienti nuovi (con '*') importati nei record VC all'inizio della procedura
const TString& str_codcf = recset.get(DOC_CODCF).as_string();
const bool new_cliente = str_codcf.find('*') >= 0;
if (new_cliente)
{
const real* ptr = (const real*)_nuovi_clienti.objptr(str_codcf);
codcf = ptr ? ptr->integer() : 0L;
}
else
{
TToken_string key_clifo;
key_clifo.add("C");
key_clifo.add(str_codcf);
codcf = atol(cache().get(LF_CLIFO, key_clifo, CLI_CODCF));
}
//controllo effettuabile solo se il cliente è già presente (vecchio o nuovo aggiunto con la importa_VC se era _can_write)
if (codcf <= 0)
{
_can_write = false;
TString msg;
msg << "Codice cliente " << str_codcf << " sconosciuto";
log.log(2, msg);
}
long codcf = check_cliente(str_codcf, log);
doc.put(DOC_CODCF, codcf);
doc.put(DOC_CODCFFATT, recset.get(DOC_CODCFFATT).as_int());
@ -891,7 +965,7 @@ void TUpload2Campo::elabora_RC(THardy_upload_recordset& recset, TLog_report& log
//2a) numerazione e tipo documento
TConfig hardy(CONFIG_DITTA, "ha");
const TString4 codnum = hardy.get("CarDocNum");
const TString4 tipodoc = hardy.get("CarDoctip");
const TString4 tipodoc = hardy.get("CarDocTip");
const TString4 stato = hardy.get("CarDocSta");
//2b) documento vero e proprio (stessi campi del caso tipo record = TF)
@ -986,7 +1060,7 @@ void TUpload2Campo::elabora_RC(THardy_upload_recordset& recset, TLog_report& log
void TUpload2Campo::elabora(const TMask& mask)
{
TToken_string tipi_record("SU|TF|RF|SI|BR|VC|RC");
//creazione del filename del file da importare
TFilename src_file = mask.get(F_PATH);