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

View File

@ -327,7 +327,7 @@ BEGIN
PROMPT 1 1 "@bEsportazione" PROMPT 1 1 "@bEsportazione"
END END
STRING F_OUTPUT_PATH 255 38 STRING F_OUTPUT_PATH 255 39
BEGIN BEGIN
PROMPT 2 2 "Percorso files .txt da esportare " PROMPT 2 2 "Percorso files .txt da esportare "
DSELECT DSELECT
@ -342,45 +342,45 @@ BEGIN
PROMPT 2 3 "@bDocumenti di carico" PROMPT 2 3 "@bDocumenti di carico"
END END
STRING F_CARDOC_NUM 4 STRING F_OU_CARDOC_NUM 4
BEGIN BEGIN
PROMPT 3 4 "Numerazione " PROMPT 3 4 "Numerazione "
USE %NUM USE %NUM
INPUT CODTAB F_CARDOC_NUM INPUT CODTAB F_OU_CARDOC_NUM
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
DISPLAY "Descrizione@50" S0 DISPLAY "Descrizione@50" S0
OUTPUT F_CARDOC_NUM CODTAB OUTPUT F_OU_CARDOC_NUM CODTAB
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
FIELD CarDocNum FIELD CarDocNum
END END
STRING F_CARDOC_TIP 4 STRING F_OU_CARDOC_TIP 4
BEGIN BEGIN
PROMPT 23 4 "Tipo " PROMPT 23 4 "Tipo "
USE %TIP USE %TIP
INPUT CODTAB F_CARDOC_TIP INPUT CODTAB F_OU_CARDOC_TIP
DISPLAY "Codice" CODTAB DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0 DISPLAY "Descrizione@50" S0
OUTPUT F_CARDOC_TIP CODTAB OUTPUT F_OU_CARDOC_TIP CODTAB
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
FLAGS "U" FLAGS "U"
FIELD CarDocTip FIELD CarDocTip
END END
STRING F_CARDOC_STA 1 STRING F_OU_CARDOC_STA 1
BEGIN BEGIN
PROMPT 36 4 "Stato " PROMPT 36 4 "Stato "
USE %STD USE %STD
INPUT CODTAB F_CARDOC_STA INPUT CODTAB F_OU_CARDOC_STA
DISPLAY "Codice" CODTAB DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0 DISPLAY "Descrizione@50" S0
OUTPUT F_CARDOC_STA CODTAB OUTPUT F_OU_CARDOC_STA CODTAB
FLAGS "U" FLAGS "U"
CHECKTYPE REQUIRED CHECKTYPE REQUIRED
FIELD CarDocSta FIELD CarDocSta
END END
LISTBOX F_BARCODE_TIP 10 LISTBOX F_OU_BARCODE_TIP 10
BEGIN BEGIN
PROMPT 2 6 "Tipo di barcode " PROMPT 2 6 "Tipo di barcode "
ITEM "N|Normale" ITEM "N|Normale"
@ -391,12 +391,12 @@ BEGIN
FIELD "TipoBarcode" FIELD "TipoBarcode"
END END
GROUPBOX DLG_NULL 76 12 GROUPBOX DLG_NULL 76 14
BEGIN BEGIN
PROMPT 1 8 "@bImportazione" PROMPT 1 8 "@bImportazione"
END END
STRING F_INPUT_PATH 255 38 STRING F_INPUT_PATH 255 44
BEGIN BEGIN
PROMPT 2 9 "Percorso files da importare " PROMPT 2 9 "Percorso files da importare "
DSELECT DSELECT
@ -461,22 +461,47 @@ END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN 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 END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN 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 END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN 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 END
SPREADSHEET F_CODICI_IVA 74 3 SPREADSHEET F_CODICI_IVA 74 4
BEGIN BEGIN
PROMPT 2 16 "" PROMPT 2 17 ""
ITEM "%IVA@6" ITEM "%IVA@6"
ITEM "Cod.IVA" ITEM "Cod.IVA"
ITEM "Descrizione" ITEM "Descrizione"

View File

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

View File

@ -3,6 +3,9 @@
#include <progind.h> #include <progind.h>
#include <reputils.h> #include <reputils.h>
#include "../cg/cg2101.h"
#include "../cg/cg2103.h"
#include "../cg/cgsaldac.h"
#include "../mg/movmag.h" #include "../mg/movmag.h"
#include "../mg/rmovmag.h" #include "../mg/rmovmag.h"
@ -14,18 +17,14 @@
//funzione di ordinamento del file di upload una volta caricato in memoria //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) int ordina_upload(const TObject** o1, const TObject** o2)
{ {
const TString& s1 = *(TString*)*o1; const TString& s1 = *(TString*)*o1;
const TString& s2 = *(TString*)*o2; const TString& s2 = *(TString*)*o2;
if (s1[0] == 'V' || s2[0] == 'V')
{
if (s1[0] != 'V' || s2[0] != 'V')
return s1[0] == 'V' ? -1 : +1;
}
else
{
//ordinatore dei record Testata e Riga fattura //ordinatore dei record Testata e Riga fattura
if (s1[1] == 'F' && s2[1] == 'F') if (s1[1] == 'F' && s2[1] == 'F')
{ {
@ -50,14 +49,11 @@ int ordina_upload(const TObject** o1, const TObject** o2)
} }
return k[0].compare(k[1]); return k[0].compare(k[1]);
} }
else
{ const int pos1 = tipi_record.get_pos(s1.left(2));
if (s1[1] == 'F') const int pos2 = tipi_record.get_pos(s2.left(2));
return +1; if (pos1 != pos2)
if (s2[1] == 'F') return pos1 - pos2;
return -1;
}
}
return s1.compare(s2); 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", "TipoRecord", T_X, 1, 2); //x
add_trc_field("SU", "CodiceTerminale", T_N, 3, 3); //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", "NonUsato", T_X, 9, 6);
add_trc_field("SU", "Targa", T_X, 15, 8); add_trc_field("SU", "Targa", T_X, 15, 8);
add_trc_field("SU", "nDDT", T_N, 23, 5); add_trc_field("SU", "nDDT", T_N, 23, 5);
add_trc_field("SU", "nFATT", T_N, 28, 5); add_trc_field("SU", "nFATT", T_N, 28, 5);
add_trc_field("SU", "nBOLLA", T_N, 33, 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 //Tipo record TF
//-------------- //--------------
@ -297,6 +293,7 @@ protected:
//metodi di basso livello //metodi di basso livello
const TString& check_agente(TString& codice_terminale, TLog_report& log); const TString& check_agente(TString& codice_terminale, TLog_report& log);
const TString& check_articolo(TString& codart, 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_magazzino(const TString& codmag_age, TLog_report& log);
void check_causale(TString& codcaus, TLog_report& log); void check_causale(TString& codcaus, TLog_report& log);
@ -315,7 +312,11 @@ public:
virtual bool create(); 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) const TString& TUpload2Campo::check_agente(TString& codice_terminale, TLog_report& log)
{ {
codice_terminale.right_just(3, '0'); 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) const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log)
{ {
codart.trim(); codart.trim();
@ -352,7 +353,7 @@ const TString& TUpload2Campo::check_articolo(TString& codart, TLog_report& log)
return rec_anamag.get(ANAMAG_DESCR); return rec_anamag.get(ANAMAG_DESCR);
} }
//controlla l'esistenza del magazzino su Campo
void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log) void TUpload2Campo::check_magazzino(const TString& codmag_age, TLog_report& log)
{ {
const TString& codmag_campo = cache().get("MAG", codmag_age, "CODTAB"); 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à //SU non è un tipo record di qualche utilità
void TUpload2Campo::elabora_SU(THardy_upload_recordset& recset, TLog_report& log) 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 //dati dal recordset di upload
TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); 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(); 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) 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) 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) //1) codice terminale (lungo 3) e codice agente (lungo 5)
TString4 codice_terminale = recset.get("CodiceTerminale").as_string(); TString4 codice_terminale = recset.get("CodiceTerminale").as_string();
const TString& codice_agente = check_agente(codice_terminale, log); 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 TString& str_datadoc = recset.get(DOC_DATADOC).as_string();
const TDate datadoc = upload_format_date6(str_datadoc); const TDate datadoc = upload_format_date6(str_datadoc);
char rec_tipodoc = recset.get(DOC_TIPODOC).as_string()[0];
//2a) tipo documento //2a) tipo documento
TString4 tipodoc; TString4 tipodoc;
TConfig hardy(CONFIG_DITTA, "ha"); 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() //2d) cliente e campi collegati via cli2doc()
doc.put(DOC_TIPOCF, "C"); doc.put(DOC_TIPOCF, "C");
//se il cliente è nuovo, ovvero aggiunto in un record di tipo VC precedentemente letto,.. //dato il codice cliente sul recordset (stringa di 6) risale al codice di Campo (long di 6) stabilendo..
//..deve stabilire quale è il suo codcf campesco già determinato (è il caso dei codcf con *) //..eventuali relazioni con i clienti nuovi (con '*') importati nei record VC all'inizio della procedura
long codcf = 0L;
const TString& str_codcf = recset.get(DOC_CODCF).as_string(); const TString& str_codcf = recset.get(DOC_CODCF).as_string();
const bool new_cliente = str_codcf.find('*') >= 0; long codcf = check_cliente(str_codcf, log);
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);
}
doc.put(DOC_CODCF, codcf); doc.put(DOC_CODCF, codcf);
doc.put(DOC_CODCFFATT, recset.get(DOC_CODCFFATT).as_int()); 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 //2a) numerazione e tipo documento
TConfig hardy(CONFIG_DITTA, "ha"); TConfig hardy(CONFIG_DITTA, "ha");
const TString4 codnum = hardy.get("CarDocNum"); const TString4 codnum = hardy.get("CarDocNum");
const TString4 tipodoc = hardy.get("CarDoctip"); const TString4 tipodoc = hardy.get("CarDocTip");
const TString4 stato = hardy.get("CarDocSta"); const TString4 stato = hardy.get("CarDocSta");
//2b) documento vero e proprio (stessi campi del caso tipo record = TF) //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) void TUpload2Campo::elabora(const TMask& mask)
{ {
TToken_string tipi_record("SU|TF|RF|SI|BR|VC|RC");
//creazione del filename del file da importare //creazione del filename del file da importare
TFilename src_file = mask.get(F_PATH); TFilename src_file = mask.get(F_PATH);