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_TIP 232
#define F_NA_RIFA_SPE 233 #define F_NA_RIFA_SPE 233
// Aggiunte il 17/01/2012
#define F_CODTIPO_FAT2 241
#define F_DESCRTIPO_FAT2 242
//============================== //==============================
//pagina 2 //pagina 2
//esportazione dati //esportazione dati

View File

@ -7,14 +7,14 @@ ENDPAGE
//---------------------------- //----------------------------
PAGE "Contratti e NAC" 0 2 0 0 PAGE "Contratti e NAC" 0 2 0 0
GROUPBOX DLG_NULL 76 4 GROUPBOX DLG_NULL 76 5
BEGIN BEGIN
PROMPT 1 1 "@bTipo documento per fatture" PROMPT 1 1 "@bTipi documento per fatture"
END END
STRING F_CODTIPO_FAT 4 STRING F_CODTIPO_FAT 4
BEGIN BEGIN
PROMPT 2 2 "Tipo " PROMPT 2 2 "Immediate "
USE %TIP USE %TIP
INPUT CODTAB F_CODTIPO_FAT INPUT CODTAB F_CODTIPO_FAT
DISPLAY "Codice" CODTAB DISPLAY "Codice" CODTAB
@ -28,7 +28,7 @@ END
STRING F_DESCRTIPO_FAT 50 STRING F_DESCRTIPO_FAT 50
BEGIN BEGIN
PROMPT 15 2 "" PROMPT 20 2 ""
USE %TIP KEY 2 USE %TIP KEY 2
INPUT S0 F_DESCRTIPO_FAT INPUT S0 F_DESCRTIPO_FAT
DISPLAY "Descrizione@60" S0 DISPLAY "Descrizione@60" S0
@ -37,9 +37,33 @@ BEGIN
CHECKTYPE NORMAL CHECKTYPE NORMAL
END 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 STRING F_STATO_INI_FAT 1
BEGIN BEGIN
PROMPT 2 3 "Stato iniziale " PROMPT 2 4 "Stato iniziale "
USE %STD USE %STD
INPUT CODTAB F_STATO_INI_FAT INPUT CODTAB F_STATO_INI_FAT
DISPLAY "Codice" CODTAB DISPLAY "Codice" CODTAB
@ -52,7 +76,7 @@ END
STRING F_STATO_FIN_FAT 1 STRING F_STATO_FIN_FAT 1
BEGIN BEGIN
PROMPT 25 3 "Stato finale " PROMPT 25 4 "Stato finale "
USE %STD USE %STD
INPUT CODTAB F_STATO_FIN_FAT INPUT CODTAB F_STATO_FIN_FAT
DISPLAY "Codice" CODTAB DISPLAY "Codice" CODTAB
@ -67,17 +91,17 @@ END
GROUPBOX DLG_NULL 76 4 GROUPBOX DLG_NULL 76 4
BEGIN BEGIN
PROMPT 1 5 "@bAnticipi" PROMPT 1 7 "@bAnticipi"
END END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN BEGIN
PROMPT 2 6 "@bContratti premi" PROMPT 2 8 "@bContratti premi"
END END
STRING F_CO_ANT_NUM 4 STRING F_CO_ANT_NUM 4
BEGIN BEGIN
PROMPT 20 6 "Num. " PROMPT 20 8 "Num. "
USE %NUM USE %NUM
INPUT CODTAB F_CO_ANT_NUM INPUT CODTAB F_CO_ANT_NUM
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -89,7 +113,7 @@ END
STRING F_CO_ANT_TIP 4 STRING F_CO_ANT_TIP 4
BEGIN BEGIN
PROMPT 33 6 "Tipo " PROMPT 33 8 "Tipo "
USE %TIP USE %TIP
INPUT CODTAB F_CO_ANT_TIP INPUT CODTAB F_CO_ANT_TIP
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -101,7 +125,7 @@ END
STRING F_CO_ANT_SPE 8 STRING F_CO_ANT_SPE 8
BEGIN BEGIN
PROMPT 49 6 "Spesa riga ant. " PROMPT 49 8 "Spesa riga ant. "
USE SPP USE SPP
INPUT CODTAB F_CO_ANT_SPE INPUT CODTAB F_CO_ANT_SPE
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -113,12 +137,12 @@ END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN BEGIN
PROMPT 2 7 "@bNote di Accredito" PROMPT 2 9 "@bNote di Accredito"
END END
STRING F_NA_ANT_NUM 4 STRING F_NA_ANT_NUM 4
BEGIN BEGIN
PROMPT 20 7 "Num. " PROMPT 20 9 "Num. "
USE %NUM USE %NUM
INPUT CODTAB F_NA_ANT_NUM INPUT CODTAB F_NA_ANT_NUM
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -130,7 +154,7 @@ END
STRING F_NA_ANT_TIP 4 STRING F_NA_ANT_TIP 4
BEGIN BEGIN
PROMPT 33 7 "Tipo " PROMPT 33 9 "Tipo "
USE %TIP USE %TIP
INPUT CODTAB F_NA_ANT_TIP INPUT CODTAB F_NA_ANT_TIP
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -142,7 +166,7 @@ END
STRING F_NA_ANT_SPE 8 STRING F_NA_ANT_SPE 8
BEGIN BEGIN
PROMPT 49 7 "Spesa riga " PROMPT 49 9 "Spesa riga "
USE SPP USE SPP
INPUT CODTAB F_NA_ANT_SPE INPUT CODTAB F_NA_ANT_SPE
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -152,22 +176,21 @@ BEGIN
FIELD NaAntSpe FIELD NaAntSpe
END END
//--Posticipi------------- //--Posticipi-------------
GROUPBOX DLG_NULL 76 4 GROUPBOX DLG_NULL 76 4
BEGIN BEGIN
PROMPT 1 9 "@bPosticipi" PROMPT 1 11 "@bPosticipi"
END END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN BEGIN
PROMPT 2 10 "@bContratti premi" PROMPT 2 12 "@bContratti premi"
END END
STRING F_CO_POST_NUM 4 STRING F_CO_POST_NUM 4
BEGIN BEGIN
PROMPT 20 10 "Num. " PROMPT 20 12 "Num. "
USE %NUM USE %NUM
INPUT CODTAB F_CO_POST_NUM INPUT CODTAB F_CO_POST_NUM
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -179,7 +202,7 @@ END
STRING F_CO_POST_TIP 4 STRING F_CO_POST_TIP 4
BEGIN BEGIN
PROMPT 33 10 "Tipo " PROMPT 33 12 "Tipo "
USE %TIP USE %TIP
INPUT CODTAB F_CO_POST_TIP INPUT CODTAB F_CO_POST_TIP
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -191,12 +214,12 @@ END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN BEGIN
PROMPT 2 11 "@bNote di Accredito" PROMPT 2 13 "@bNote di Accredito"
END END
STRING F_NA_POST_NUM 4 STRING F_NA_POST_NUM 4
BEGIN BEGIN
PROMPT 20 11 "Num. " PROMPT 20 13 "Num. "
USE %NUM USE %NUM
INPUT CODTAB F_NA_POST_NUM INPUT CODTAB F_NA_POST_NUM
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -208,7 +231,7 @@ END
STRING F_NA_POST_TIP 4 STRING F_NA_POST_TIP 4
BEGIN BEGIN
PROMPT 33 11 "Tipo " PROMPT 33 13 "Tipo "
USE %TIP USE %TIP
INPUT CODTAB F_NA_POST_TIP INPUT CODTAB F_NA_POST_TIP
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -220,7 +243,7 @@ END
STRING F_NA_POST_SPE 8 STRING F_NA_POST_SPE 8
BEGIN BEGIN
PROMPT 49 11 "Spesa riga " PROMPT 49 13 "Spesa riga "
USE SPP USE SPP
INPUT CODTAB F_NA_POST_SPE INPUT CODTAB F_NA_POST_SPE
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -234,17 +257,17 @@ END
GROUPBOX DLG_NULL 76 4 GROUPBOX DLG_NULL 76 4
BEGIN BEGIN
PROMPT 1 13 "@bRifatturazione" PROMPT 1 16 "@bRifatturazione"
END END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN BEGIN
PROMPT 2 14 "@bContratti premi" PROMPT 2 17 "@bContratti premi"
END END
STRING F_CO_RIFA_NUM 4 STRING F_CO_RIFA_NUM 4
BEGIN BEGIN
PROMPT 20 14 "Num. " PROMPT 20 17 "Num. "
USE %NUM USE %NUM
INPUT CODTAB F_CO_RIFA_NUM INPUT CODTAB F_CO_RIFA_NUM
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -256,7 +279,7 @@ END
STRING F_CO_RIFA_TIP 4 STRING F_CO_RIFA_TIP 4
BEGIN BEGIN
PROMPT 33 14 "Tipo " PROMPT 33 17 "Tipo "
USE %TIP USE %TIP
INPUT CODTAB F_CO_RIFA_TIP INPUT CODTAB F_CO_RIFA_TIP
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -268,7 +291,7 @@ END
STRING F_CO_RIFA_SPE 8 STRING F_CO_RIFA_SPE 8
BEGIN BEGIN
PROMPT 49 14 "Spesa riga ant. " PROMPT 49 17 "Spesa riga ant. "
USE SPP USE SPP
INPUT CODTAB F_CO_RIFA_SPE INPUT CODTAB F_CO_RIFA_SPE
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -280,12 +303,12 @@ END
TEXT DLG_NULL TEXT DLG_NULL
BEGIN BEGIN
PROMPT 2 15 "@bNote di Accredito" PROMPT 2 18 "@bNote di Accredito"
END END
STRING F_NA_RIFA_NUM 4 STRING F_NA_RIFA_NUM 4
BEGIN BEGIN
PROMPT 20 15 "Num. " PROMPT 20 18 "Num. "
USE %NUM USE %NUM
INPUT CODTAB F_NA_RIFA_NUM INPUT CODTAB F_NA_RIFA_NUM
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -297,7 +320,7 @@ END
STRING F_NA_RIFA_TIP 4 STRING F_NA_RIFA_TIP 4
BEGIN BEGIN
PROMPT 33 15 "Tipo " PROMPT 33 18 "Tipo "
USE %TIP USE %TIP
INPUT CODTAB F_NA_RIFA_TIP INPUT CODTAB F_NA_RIFA_TIP
DISPLAY "Codice@8" CODTAB DISPLAY "Codice@8" CODTAB
@ -309,7 +332,7 @@ END
STRING F_NA_RIFA_SPE 8 STRING F_NA_RIFA_SPE 8
BEGIN BEGIN
PROMPT 49 15 "Spesa riga " PROMPT 49 18 "Spesa riga "
USE SPP USE SPP
INPUT CODTAB F_NA_RIFA_SPE INPUT CODTAB F_NA_RIFA_SPE
DISPLAY "Codice@8" CODTAB 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); const int dadata_esc = esc.date2esc(dadata);
if (adata_esc != dadata_esc) 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; 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! //in base al tipo documento che si deve elaborare (settato in configurazione), ci possono essere più numerazioni da considerare!
TConfig config(CONFIG_DITTA, "ha"); 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 // 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... //se c'è l'agente specificato...
const TString& agente = mask.get(F_CODAGE); 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) int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& mask, TArray& contratti_cliente)
{ {
contratti_cliente.destroy(); 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 //settaggio delle variabili
//il codice numerazione lo trova nella configurazione Hardy, e lo deve scegliere in base alla tipologia di contratti che sta esaminando! //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"); TConfig config(CONFIG_DITTA, "ha");
const TString& tip_ant = config.get("CoAntTip"); const TString4 tip_ant = config.get("CoAntTip");
const TString& tip_rifa = config.get("CoRifaTip"); const TString4 tip_rifa = config.get("CoRifaTip");
const TString& tip_post = config.get("CoPostTip"); const TString4 tip_post = config.get("CoPostTip");
recset.set_var("#A_TIPODOC", tip_ant); TAssoc_array cod_num_cont;
recset.set_var("#R_TIPODOC", tip_rifa); cod_num_cont.add(config.get("CoAntNum"));
recset.set_var("#P_TIPODOC", tip_post); cod_num_cont.add(config.get("CoRifaNum"));
cod_num_cont.add(config.get("CoPostNum"));
recset.set_var("#CODCF", codcfatt); 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;
const long n_contratti = recset.items(); //questo serve solo al sagace programmatore TISAM_recordset recset(query);
//aggiunge i contratti all'array: solo quelli in auge nel periodo di calcolo selezionato sulla maschera! recset.set_var("#A_TIPODOC", tip_ant);
for (bool ok = recset.move_first(); ok; ok = recset.move_next()) recset.set_var("#R_TIPODOC", tip_rifa);
{ recset.set_var("#P_TIPODOC", tip_post);
//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 recset.set_var("#CODCF", codcfatt);
const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date();
TDate data_ini_elab = mask.get_date(F_DADATA); const long n_contratti = recset.items(); //questo serve solo al sagace programmatore
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) //aggiunge i contratti all'array: solo quelli in auge nel periodo di calcolo selezionato sulla maschera!
//se l'elaborazione finisce prima che cominci il contratto -> il contratto non serve a nulla for (bool ok = recset.move_first(); ok; ok = recset.move_next())
if (data_ini_contratto > data_fine_elab) {
continue; //contratti anticipo 'A': datainizio esiste sempre, datafine non esiste (va ad esaurimento)
//la data fine vale invece solo per i contratti 'P' e potrebbe non esserci (contratti senza scadenza) //contratti posticipo 'P': datainizio esiste sempre, datafine può non esistere
TDate data_fine_contratto; //contratti rifatturazione 'R': come contratti anticipo
//se la data fine contratto non è valida (ma è presente!) non dobbiamo fare nulla, perchè il contratto non va elaborato //controlla validità del contratto con le date scelte per l'elaborazione dei documenti
data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date(); const TDate data_ini_contratto = recset.get(DOC_DATACOMP).as_date();
if (data_fine_contratto.ok())
{ TDate data_ini_elab = mask.get_date(F_DADATA);
if (data_fine_contratto < data_ini_elab) 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; 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 //se la data fine contratto non è valida (ma è presente!) non dobbiamo fare nulla, perchè il contratto non va elaborato
TContratto_premi* curr_contratto = new TContratto_premi(recset.cursor()->curr()); data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date();
//azzeratore del campo con il totale reso per elaborazione, nel caso di contratti Anticipo/Rifatturazione, riga spese if (data_fine_contratto.ok())
const char tipo_contr = curr_contratto->tipo_contratto();
if (tipo_contr == 'A' || tipo_contr == 'R')
{
FOR_EACH_PHYSICAL_RDOC(*curr_contratto, r, rdoc)
{ {
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); if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
break; {
rdoc->zero(RCA_2_RESO_CORRENTE);
break;
}
} }
} }
contratti_cliente.add(curr_contratto);
} }
contratti_cliente.add(curr_contratto);
} }
return contratti_cliente.items(); return contratti_cliente.items();
} }