Patch level : 10.0

Files correlati     : ha0.exe ha0200a.msk
Ricompilazione Demo : [ ]
Commento            :
Aggiunto nuovo tipo documento fatture in configurazione per generazione NAC
Ottimizzata ricerca contratti in generazione NAC (60x)


git-svn-id: svn://10.65.10.50/branches/R_10_00@22549 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2012-01-17 12:08:54 +00:00
parent 30d8384b9c
commit 25b82be4b9
3 changed files with 126 additions and 89 deletions

View File

@ -27,6 +27,11 @@
#define F_NA_RIFA_TIP 232
#define F_NA_RIFA_SPE 233
// Aggiunte il 17/01/2012
#define F_CODTIPO_FAT2 241
#define F_DESCRTIPO_FAT2 242
//==============================
//pagina 2
//esportazione dati

View File

@ -7,14 +7,14 @@ ENDPAGE
//----------------------------
PAGE "Contratti e NAC" 0 2 0 0
GROUPBOX DLG_NULL 76 4
GROUPBOX DLG_NULL 76 5
BEGIN
PROMPT 1 1 "@bTipo documento per fatture"
PROMPT 1 1 "@bTipi documento per fatture"
END
STRING F_CODTIPO_FAT 4
BEGIN
PROMPT 2 2 "Tipo "
PROMPT 2 2 "Immediate "
USE %TIP
INPUT CODTAB F_CODTIPO_FAT
DISPLAY "Codice" CODTAB
@ -28,7 +28,7 @@ END
STRING F_DESCRTIPO_FAT 50
BEGIN
PROMPT 15 2 ""
PROMPT 20 2 ""
USE %TIP KEY 2
INPUT S0 F_DESCRTIPO_FAT
DISPLAY "Descrizione@60" S0
@ -37,9 +37,33 @@ BEGIN
CHECKTYPE NORMAL
END
STRING F_CODTIPO_FAT2 4
BEGIN
PROMPT 2 3 "Differite "
COPY USE F_CODTIPO_FAT
INPUT CODTAB F_CODTIPO_FAT2
COPY DISPLAY F_CODTIPO_FAT
OUTPUT F_CODTIPO_FAT2 CODTAB
OUTPUT F_DESCRTIPO_FAT2 S0
CHECKTYPE REQUIRED
FLAGS "U"
FIELD TipoFatt2
END
STRING F_DESCRTIPO_FAT2 50
BEGIN
PROMPT 20 3 ""
COPY USE F_DESCRTIPO_FAT
INPUT S0 F_DESCRTIPO_FAT2
COPY DISPLAY F_DESCRTIPO_FAT
COPY OUTPUT F_CODTIPO_FAT2
CHECKTYPE NORMAL
END
STRING F_STATO_INI_FAT 1
BEGIN
PROMPT 2 3 "Stato iniziale "
PROMPT 2 4 "Stato iniziale "
USE %STD
INPUT CODTAB F_STATO_INI_FAT
DISPLAY "Codice" CODTAB
@ -52,7 +76,7 @@ END
STRING F_STATO_FIN_FAT 1
BEGIN
PROMPT 25 3 "Stato finale "
PROMPT 25 4 "Stato finale "
USE %STD
INPUT CODTAB F_STATO_FIN_FAT
DISPLAY "Codice" CODTAB
@ -67,17 +91,17 @@ END
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 1 5 "@bAnticipi"
PROMPT 1 7 "@bAnticipi"
END
TEXT DLG_NULL
BEGIN
PROMPT 2 6 "@bContratti premi"
PROMPT 2 8 "@bContratti premi"
END
STRING F_CO_ANT_NUM 4
BEGIN
PROMPT 20 6 "Num. "
PROMPT 20 8 "Num. "
USE %NUM
INPUT CODTAB F_CO_ANT_NUM
DISPLAY "Codice@8" CODTAB
@ -89,7 +113,7 @@ END
STRING F_CO_ANT_TIP 4
BEGIN
PROMPT 33 6 "Tipo "
PROMPT 33 8 "Tipo "
USE %TIP
INPUT CODTAB F_CO_ANT_TIP
DISPLAY "Codice@8" CODTAB
@ -101,7 +125,7 @@ END
STRING F_CO_ANT_SPE 8
BEGIN
PROMPT 49 6 "Spesa riga ant. "
PROMPT 49 8 "Spesa riga ant. "
USE SPP
INPUT CODTAB F_CO_ANT_SPE
DISPLAY "Codice@8" CODTAB
@ -113,12 +137,12 @@ END
TEXT DLG_NULL
BEGIN
PROMPT 2 7 "@bNote di Accredito"
PROMPT 2 9 "@bNote di Accredito"
END
STRING F_NA_ANT_NUM 4
BEGIN
PROMPT 20 7 "Num. "
PROMPT 20 9 "Num. "
USE %NUM
INPUT CODTAB F_NA_ANT_NUM
DISPLAY "Codice@8" CODTAB
@ -130,7 +154,7 @@ END
STRING F_NA_ANT_TIP 4
BEGIN
PROMPT 33 7 "Tipo "
PROMPT 33 9 "Tipo "
USE %TIP
INPUT CODTAB F_NA_ANT_TIP
DISPLAY "Codice@8" CODTAB
@ -142,7 +166,7 @@ END
STRING F_NA_ANT_SPE 8
BEGIN
PROMPT 49 7 "Spesa riga "
PROMPT 49 9 "Spesa riga "
USE SPP
INPUT CODTAB F_NA_ANT_SPE
DISPLAY "Codice@8" CODTAB
@ -152,22 +176,21 @@ BEGIN
FIELD NaAntSpe
END
//--Posticipi-------------
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 1 9 "@bPosticipi"
PROMPT 1 11 "@bPosticipi"
END
TEXT DLG_NULL
BEGIN
PROMPT 2 10 "@bContratti premi"
PROMPT 2 12 "@bContratti premi"
END
STRING F_CO_POST_NUM 4
BEGIN
PROMPT 20 10 "Num. "
PROMPT 20 12 "Num. "
USE %NUM
INPUT CODTAB F_CO_POST_NUM
DISPLAY "Codice@8" CODTAB
@ -179,7 +202,7 @@ END
STRING F_CO_POST_TIP 4
BEGIN
PROMPT 33 10 "Tipo "
PROMPT 33 12 "Tipo "
USE %TIP
INPUT CODTAB F_CO_POST_TIP
DISPLAY "Codice@8" CODTAB
@ -191,12 +214,12 @@ END
TEXT DLG_NULL
BEGIN
PROMPT 2 11 "@bNote di Accredito"
PROMPT 2 13 "@bNote di Accredito"
END
STRING F_NA_POST_NUM 4
BEGIN
PROMPT 20 11 "Num. "
PROMPT 20 13 "Num. "
USE %NUM
INPUT CODTAB F_NA_POST_NUM
DISPLAY "Codice@8" CODTAB
@ -208,7 +231,7 @@ END
STRING F_NA_POST_TIP 4
BEGIN
PROMPT 33 11 "Tipo "
PROMPT 33 13 "Tipo "
USE %TIP
INPUT CODTAB F_NA_POST_TIP
DISPLAY "Codice@8" CODTAB
@ -220,7 +243,7 @@ END
STRING F_NA_POST_SPE 8
BEGIN
PROMPT 49 11 "Spesa riga "
PROMPT 49 13 "Spesa riga "
USE SPP
INPUT CODTAB F_NA_POST_SPE
DISPLAY "Codice@8" CODTAB
@ -234,17 +257,17 @@ END
GROUPBOX DLG_NULL 76 4
BEGIN
PROMPT 1 13 "@bRifatturazione"
PROMPT 1 16 "@bRifatturazione"
END
TEXT DLG_NULL
BEGIN
PROMPT 2 14 "@bContratti premi"
PROMPT 2 17 "@bContratti premi"
END
STRING F_CO_RIFA_NUM 4
BEGIN
PROMPT 20 14 "Num. "
PROMPT 20 17 "Num. "
USE %NUM
INPUT CODTAB F_CO_RIFA_NUM
DISPLAY "Codice@8" CODTAB
@ -256,7 +279,7 @@ END
STRING F_CO_RIFA_TIP 4
BEGIN
PROMPT 33 14 "Tipo "
PROMPT 33 17 "Tipo "
USE %TIP
INPUT CODTAB F_CO_RIFA_TIP
DISPLAY "Codice@8" CODTAB
@ -268,7 +291,7 @@ END
STRING F_CO_RIFA_SPE 8
BEGIN
PROMPT 49 14 "Spesa riga ant. "
PROMPT 49 17 "Spesa riga ant. "
USE SPP
INPUT CODTAB F_CO_RIFA_SPE
DISPLAY "Codice@8" CODTAB
@ -280,12 +303,12 @@ END
TEXT DLG_NULL
BEGIN
PROMPT 2 15 "@bNote di Accredito"
PROMPT 2 18 "@bNote di Accredito"
END
STRING F_NA_RIFA_NUM 4
BEGIN
PROMPT 20 15 "Num. "
PROMPT 20 18 "Num. "
USE %NUM
INPUT CODTAB F_NA_RIFA_NUM
DISPLAY "Codice@8" CODTAB
@ -297,7 +320,7 @@ END
STRING F_NA_RIFA_TIP 4
BEGIN
PROMPT 33 15 "Tipo "
PROMPT 33 18 "Tipo "
USE %TIP
INPUT CODTAB F_NA_RIFA_TIP
DISPLAY "Codice@8" CODTAB
@ -309,7 +332,7 @@ END
STRING F_NA_RIFA_SPE 8
BEGIN
PROMPT 49 15 "Spesa riga "
PROMPT 49 18 "Spesa riga "
USE SPP
INPUT CODTAB F_NA_RIFA_SPE
DISPLAY "Codice@8" CODTAB

View File

@ -45,7 +45,7 @@ bool THardy_elab_docs_mask::on_field_event(TOperable_field& o, TField_event e, l
{
const int dadata_esc = esc.date2esc(dadata);
if (adata_esc != dadata_esc)
return error_box("Le date devono appartenere allo stesso esercizio!");
return error_box(TR("Le date devono appartenere allo stesso esercizio!"));
}
}
break;
@ -223,10 +223,11 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
//in base al tipo documento che si deve elaborare (settato in configurazione), ci possono essere più numerazioni da considerare!
TConfig config(CONFIG_DITTA, "ha");
const TString4 tipo_doc_to_elab = config.get("TipoFatt");
const TString4 tipo_doc_to_elab1 = config.get("TipoFatt");
const TString4 tipo_doc_to_elab2 = config.get("TipoFatt2");
// Inutile testare tutte le numerazioni, basta il tipo documento
query << "&&(" << DOC_TIPODOC << "=='" << tipo_doc_to_elab << "')";
query << "&&((" << DOC_TIPODOC << "=='" << tipo_doc_to_elab1 << "')||(" << DOC_TIPODOC << "=='" << tipo_doc_to_elab2 << "'))";
//se c'è l'agente specificato...
const TString& agente = mask.get(F_CODAGE);
@ -291,79 +292,87 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& mask, TArray& contratti_cliente)
{
contratti_cliente.destroy();
//deve cercare tutti i contratti del cliente e metterli nell'array
TString query;
query << "USE DOC KEY 4";
query << "\nSELECT ((TIPODOC=#A_TIPODOC)||(TIPODOC=#R_TIPODOC)||(TIPODOC=#P_TIPODOC))&&(STR(DOC2=#CODCF))";
query << "\nFROM TIPOCF=C";
query << "\nTO TIPOCF=C";
TISAM_recordset recset(query);
//settaggio delle variabili
//il codice numerazione lo trova nella configurazione Hardy, e lo deve scegliere in base alla tipologia di contratti che sta esaminando!
TConfig config(CONFIG_DITTA, "ha");
const TString& tip_ant = config.get("CoAntTip");
const TString& tip_rifa = config.get("CoRifaTip");
const TString& tip_post = config.get("CoPostTip");
const TString4 tip_ant = config.get("CoAntTip");
const TString4 tip_rifa = config.get("CoRifaTip");
const TString4 tip_post = config.get("CoPostTip");
recset.set_var("#A_TIPODOC", tip_ant);
recset.set_var("#R_TIPODOC", tip_rifa);
recset.set_var("#P_TIPODOC", tip_post);
TAssoc_array cod_num_cont;
cod_num_cont.add(config.get("CoAntNum"));
cod_num_cont.add(config.get("CoRifaNum"));
cod_num_cont.add(config.get("CoPostNum"));
FOR_EACH_ASSOC_OBJECT(cod_num_cont, h, k, o)
{
//deve cercare tutti i contratti del cliente e metterli nell'array
TString query;
query << "USE DOC KEY 5";
query << "\nSELECT ((TIPODOC=#A_TIPODOC)||(TIPODOC=#R_TIPODOC)||(TIPODOC=#P_TIPODOC))&&(STR(DOC2=#CODCF))";
query << "\nFROM PROVV=D CODNUM=" << k;
query << "\nTO PROVV=D CODNUM=" << k;
TISAM_recordset recset(query);
recset.set_var("#A_TIPODOC", tip_ant);
recset.set_var("#R_TIPODOC", tip_rifa);
recset.set_var("#P_TIPODOC", tip_post);
recset.set_var("#CODCF", codcfatt);
recset.set_var("#CODCF", codcfatt);
const long n_contratti = recset.items(); //questo serve solo al sagace programmatore
const long n_contratti = recset.items(); //questo serve solo al sagace programmatore
//aggiunge i contratti all'array: solo quelli in auge nel periodo di calcolo selezionato sulla maschera!
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
//contratti anticipo 'A': datainizio esiste sempre, datafine non esiste (va ad esaurimento)
//contratti posticipo 'P': datainizio esiste sempre, datafine può non esistere
//contratti rifatturazione 'R': come contratti anticipo
//aggiunge i contratti all'array: solo quelli in auge nel periodo di calcolo selezionato sulla maschera!
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
{
//contratti anticipo 'A': datainizio esiste sempre, datafine non esiste (va ad esaurimento)
//contratti posticipo 'P': datainizio esiste sempre, datafine può non esistere
//contratti rifatturazione 'R': come contratti anticipo
//controlla validità del contratto con le date scelte per l'elaborazione dei documenti
const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date();
//controlla validità del contratto con le date scelte per l'elaborazione dei documenti
const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date();
TDate data_ini_elab = mask.get_date(F_DADATA);
const TDate data_fine_elab = mask.get_date(F_ADATA);
if (!data_ini_elab.ok())
check_date(data_fine_elab, data_ini_elab);
TDate data_ini_elab = mask.get_date(F_DADATA);
const TDate data_fine_elab = mask.get_date(F_ADATA);
if (!data_ini_elab.ok())
check_date(data_fine_elab, data_ini_elab);
//quindi la datainizio vale per tutti allo stesso modo (è obbligatoria nei contratti)
//se l'elaborazione finisce prima che cominci il contratto -> il contratto non serve a nulla
if (data_ini_contratto > data_fine_elab)
continue;
//la data fine vale invece solo per i contratti 'P' e potrebbe non esserci (contratti senza scadenza)
TDate data_fine_contratto;
//se la data fine contratto non è valida (ma è presente!) non dobbiamo fare nulla, perchè il contratto non va elaborato
data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date();
if (data_fine_contratto.ok())
{
if (data_fine_contratto < data_ini_elab)
//quindi la datainizio vale per tutti allo stesso modo (è obbligatoria nei contratti)
//se l'elaborazione finisce prima che cominci il contratto -> il contratto non serve a nulla
if (data_ini_contratto > data_fine_elab)
continue;
}
//la data fine vale invece solo per i contratti 'P' e potrebbe non esserci (contratti senza scadenza)
TDate data_fine_contratto;
//ci tocca istanziarci un contratto_premi
TContratto_premi* curr_contratto = new TContratto_premi(recset.cursor()->curr());
//azzeratore del campo con il totale reso per elaborazione, nel caso di contratti Anticipo/Rifatturazione, riga spese
const char tipo_contr = curr_contratto->tipo_contratto();
if (tipo_contr == 'A' || tipo_contr == 'R')
{
FOR_EACH_PHYSICAL_RDOC(*curr_contratto, r, rdoc)
//se la data fine contratto non è valida (ma è presente!) non dobbiamo fare nulla, perchè il contratto non va elaborato
data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date();
if (data_fine_contratto.ok())
{
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
if (data_fine_contratto < data_ini_elab)
continue;
}
//ci tocca istanziarci un contratto_premi
TContratto_premi* curr_contratto = new TContratto_premi(recset.cursor()->curr());
//azzeratore del campo con il totale reso per elaborazione, nel caso di contratti Anticipo/Rifatturazione, riga spese
const char tipo_contr = curr_contratto->tipo_contratto();
if (tipo_contr == 'A' || tipo_contr == 'R')
{
FOR_EACH_PHYSICAL_RDOC(*curr_contratto, r, rdoc)
{
rdoc->zero(RCA_2_RESO_CORRENTE);
break;
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
{
rdoc->zero(RCA_2_RESO_CORRENTE);
break;
}
}
}
contratti_cliente.add(curr_contratto);
}
contratti_cliente.add(curr_contratto);
}
return contratti_cliente.items();
}