Patch level :10.0 820?

Files correlati     :
Ricompilazione Demo : [ ]
Commento            :
riporto dalla 11


git-svn-id: svn://10.65.10.50/branches/R_10_00@20915 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
luca 2010-09-27 14:30:54 +00:00
parent d741c541f9
commit fc5ba87cdd
11 changed files with 226 additions and 118 deletions

View File

@ -14,15 +14,16 @@ int main(int argc,char** argv)
switch (r)
{
case 1:
rt = ha0200(argc, argv) ; break; //configurazione modulo Hardy
rt = ha0200(argc, argv) ; break; //configurazione modulo
break;
case 2:
rt = ha0300(argc, argv) ; break; //gestione documenti premio (contratti premio)
rt = ha0300(argc, argv) ; break; //gestione contratti premio
break;
case 3:
rt = ha0400(argc,argv) ; break; //elaborazione contratti premio pareggiati
break;
//case 3:
//rt = ha0400(argc,argv) ; break; //contabilizzazione contratti premio Hardy
case 4:
rt = ha0500(argc,argv) ; break; //elaborazione documenti Hardy
rt = ha0500(argc,argv) ; break; //elaborazione documenti (NAC - contratti premio)
default:
error_box(usage, argv[0]) ; break;
}

View File

@ -1,4 +1,4 @@
int ha0200(int argc, char* argv[]);
int ha0300(int argc, char* argv[]);
//int ha0400(int argc, char* argv[]);
int ha0400(int argc, char* argv[]);
int ha0500(int argc, char* argv[]);

View File

@ -92,7 +92,7 @@ bool TConf_Hardy::user_destroy( )
int ha0200(int argc, char* argv[])
{
TConf_Hardy app;
app.run(argc, argv, TR("Configurazione Hardy"));
TConf_Hardy configapp;
configapp.run(argc, argv, TR("Configurazione modulo"));
return 0;
}

View File

@ -4,7 +4,7 @@ TOOLBAR "topbar" 0 0 0 2
#include <stdbar.h>
ENDPAGE
PAGE "Configurazione Hardy" -1 -1 78 23
PAGE "Configurazione modulo" -1 -1 78 23
GROUPBOX DLG_NULL 76 4
BEGIN
@ -76,7 +76,7 @@ END
STRING F_CO_ANT_NUM 4
BEGIN
PROMPT 20 6 "Numerazione "
PROMPT 20 6 "Num. "
USE %NUM
INPUT CODTAB F_CO_ANT_NUM
DISPLAY "Codice@8" CODTAB
@ -88,7 +88,7 @@ END
STRING F_CO_ANT_TIP 4
BEGIN
PROMPT 42 6 "Tipo "
PROMPT 33 6 "Tipo "
USE %TIP
INPUT CODTAB F_CO_ANT_TIP
DISPLAY "Codice@8" CODTAB
@ -100,7 +100,7 @@ END
STRING F_CO_ANT_SPE 8
BEGIN
PROMPT 58 6 "Spesa "
PROMPT 49 6 "Spesa riga ant. "
USE SPP
INPUT CODTAB F_CO_ANT_SPE
DISPLAY "Codice@8" CODTAB
@ -117,7 +117,7 @@ END
STRING F_NA_ANT_NUM 4
BEGIN
PROMPT 20 7 "Numerazione "
PROMPT 20 7 "Num. "
USE %NUM
INPUT CODTAB F_NA_ANT_NUM
DISPLAY "Codice@8" CODTAB
@ -129,7 +129,7 @@ END
STRING F_NA_ANT_TIP 4
BEGIN
PROMPT 42 7 "Tipo "
PROMPT 33 7 "Tipo "
USE %TIP
INPUT CODTAB F_NA_ANT_TIP
DISPLAY "Codice@8" CODTAB
@ -141,7 +141,7 @@ END
STRING F_NA_ANT_SPE 8
BEGIN
PROMPT 58 7 "Riga "
PROMPT 49 7 "Spesa riga "
USE SPP
INPUT CODTAB F_NA_ANT_SPE
DISPLAY "Codice@8" CODTAB
@ -166,7 +166,7 @@ END
STRING F_CO_POST_NUM 4
BEGIN
PROMPT 20 10 "Numerazione "
PROMPT 20 10 "Num. "
USE %NUM
INPUT CODTAB F_CO_POST_NUM
DISPLAY "Codice@8" CODTAB
@ -178,7 +178,7 @@ END
STRING F_CO_POST_TIP 4
BEGIN
PROMPT 42 10 "Tipo "
PROMPT 33 10 "Tipo "
USE %TIP
INPUT CODTAB F_CO_POST_TIP
DISPLAY "Codice@8" CODTAB
@ -195,7 +195,7 @@ END
STRING F_NA_POST_NUM 4
BEGIN
PROMPT 20 11 "Numerazione "
PROMPT 20 11 "Num. "
USE %NUM
INPUT CODTAB F_NA_POST_NUM
DISPLAY "Codice@8" CODTAB
@ -207,7 +207,7 @@ END
STRING F_NA_POST_TIP 4
BEGIN
PROMPT 42 11 "Tipo "
PROMPT 33 11 "Tipo "
USE %TIP
INPUT CODTAB F_NA_POST_TIP
DISPLAY "Codice@8" CODTAB
@ -219,7 +219,7 @@ END
STRING F_NA_POST_SPE 8
BEGIN
PROMPT 58 11 "Riga "
PROMPT 49 11 "Spesa riga "
USE SPP
INPUT CODTAB F_NA_POST_SPE
DISPLAY "Codice@8" CODTAB
@ -243,7 +243,7 @@ END
STRING F_CO_RIFA_NUM 4
BEGIN
PROMPT 20 14 "Numerazione "
PROMPT 20 14 "Num. "
USE %NUM
INPUT CODTAB F_CO_RIFA_NUM
DISPLAY "Codice@8" CODTAB
@ -255,7 +255,7 @@ END
STRING F_CO_RIFA_TIP 4
BEGIN
PROMPT 42 14 "Tipo "
PROMPT 33 14 "Tipo "
USE %TIP
INPUT CODTAB F_CO_RIFA_TIP
DISPLAY "Codice@8" CODTAB
@ -267,7 +267,7 @@ END
STRING F_CO_RIFA_SPE 8
BEGIN
PROMPT 58 14 "Spesa "
PROMPT 49 14 "Spesa riga ant. "
USE SPP
INPUT CODTAB F_CO_RIFA_SPE
DISPLAY "Codice@8" CODTAB
@ -284,7 +284,7 @@ END
STRING F_NA_RIFA_NUM 4
BEGIN
PROMPT 20 15 "Numerazione "
PROMPT 20 15 "Num. "
USE %NUM
INPUT CODTAB F_NA_RIFA_NUM
DISPLAY "Codice@8" CODTAB
@ -296,7 +296,7 @@ END
STRING F_NA_RIFA_TIP 4
BEGIN
PROMPT 42 15 "Tipo "
PROMPT 33 15 "Tipo "
USE %TIP
INPUT CODTAB F_NA_RIFA_TIP
DISPLAY "Codice@8" CODTAB
@ -308,7 +308,7 @@ END
STRING F_NA_RIFA_SPE 8
BEGIN
PROMPT 58 15 "Riga "
PROMPT 49 15 "Spesa riga "
USE SPP
INPUT CODTAB F_NA_RIFA_SPE
DISPLAY "Codice@8" CODTAB

View File

@ -208,6 +208,7 @@ protected:
virtual int write(const TMask& m);
virtual int rewrite(const TMask& m);
virtual int read(TMask& m);
virtual bool remove();
virtual void init_query_mode(TMask& m);
virtual void init_insert_mode(TMask& m);
@ -297,9 +298,9 @@ void TDocumenti_premio::read_rows(TMask& m)
else if (tipo == HARDY_TIPORIGA_SOMMA)//se invece è la riga con le somme anticipate/maturate (solo 1 per contratto!) -> va messa in testata
{
const real anticipato = rec.get(RCA_2_ANTICIPATO);
const real maturato = rec.get(RCA_2_RESTITUITO);
const real maturato = rec.get(RCA_2_RESO_STORICO);
m.set(F_ANTICIPATO, anticipato);
m.set(F_RESTITUITO, maturato);
m.set(F_RESO_STORICO, maturato);
}
}
@ -345,22 +346,25 @@ void TDocumenti_premio::write_rows(const TMask& m)
rec.put(RDOC_TIPORIGA, HARDY_TIPORIGA_MERCE);
}
//salva la riga di tipo somme anticipate/rimborsate (H02) che in realtà è in testata
//questo vale solo per i contratti di Anticip/Rifatturazione
TConfig config(CONFIG_DITTA, "ha");
//questo vale solo per i contratti di Anticip/Rifatturazione (lo fa solo se l'anticipo è > 0)
const char tipo_contr = m.get(F_TIPOCONTR)[0];
if (tipo_contr == 'A' || tipo_contr == 'R')
const real anticipato = m.get_real(F_ANTICIPATO);
if (anticipato > ZERO && (tipo_contr == 'A' || tipo_contr == 'R'))
{
const int righedoc_items = righedoc.rows();
TRectype& last_rec = righedoc.row(righedoc_items + 1, true);
const real anticipato = m.get_real(F_ANTICIPATO);
const real maturato = m.get_real(F_RESTITUITO);
const real maturato = m.get_real(F_RESO_STORICO);
last_rec.put(RCA_2_ANTICIPATO, anticipato);
last_rec.put(RCA_2_RESTITUITO, maturato);
last_rec.put(RCA_2_RESO_STORICO, maturato);
last_rec.put(RDOC_TIPORIGA, HARDY_TIPORIGA_SOMMA);
last_rec.put(RDOC_QTA, 1);
//panegirico sul codice iva (che ci va sennò col cavolo che si riesce a contabilizzare il contratto)
TString80 codspp;
TConfig config(CONFIG_DITTA, "ha");
switch (tipo_contr)
{
case 'A': codspp = config.get("CoAntSpe"); break;
@ -399,6 +403,15 @@ void TDocumenti_premio::init_modify_mode(TMask& m)
m.disable(F_TIPOCONTR); //non si può cambiare il tipo contratto una volta stabilito sennò non funziona + un cazzo
}
bool TDocumenti_premio::remove()
{
TSheet_field& righe = _msk->sfield(F_RIGHE);
_msk->reset(F_ANTICIPATO);
righe.destroy();
write_rows(*_msk);
return TRelation_application::remove();
}
int TDocumenti_premio::write(const TMask& m)
{
const int err = TRelation_application::write(m);
@ -439,7 +452,7 @@ bool TDocumenti_premio::user_destroy()
int ha0300(int argc, char* argv[])
{
TDocumenti_premio a;
a.run(argc, argv, TR("Documenti premio Hardy"));
TDocumenti_premio prizedocs;
prizedocs.run(argc, argv, TR("Gestione contratti premio"));
return 0;
}

View File

@ -28,7 +28,7 @@
#define F_NUMREG 227
#define F_COLLEGA 228
#define F_ANTICIPATO 229
#define F_RESTITUITO 230
#define F_RESO_STORICO 230
#define F_RIGHE 500 //questo va messo 500 sennò ve0 si incazza e non funziona più

View File

@ -6,7 +6,7 @@ TOOLBAR "" 0 0 0 2
ENDPAGE
PAGE "Contratto premi Hardy" -1 -1 78 23
PAGE "Gestione contratti premio" -1 -1 78 23
GROUPBOX DLG_NULL 78 13
BEGIN
@ -19,7 +19,6 @@ BEGIN
ITEM "A|Anticipo" MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@
ITEM "P|Posticipo" MESSAGE ENABLE,F_DATAFCOMP|CLEAR,1@
ITEM "R|Rifatturazione" MESSAGE CLEAR,F_DATAFCOMP|ENABLE,1@
FIELD TIPOCFFATT
FLAGS "GZ"
KEY 1
END
@ -120,16 +119,19 @@ NUMBER F_NDOC 6
BEGIN
PROMPT 24 4 "N. contr. premi "
USE LF_DOC SELECT BETWEEN(CODCF,#F_CODCF,#F_CODCF)
JOIN LF_CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF
INPUT CODNUM F_CODNUM SELECT
INPUT PROVV F_PROVV SELECT
INPUT ANNO F_ANNO SELECT
INPUT NDOC F_NDOC
DISPLAY "Numero" NDOC
DISPLAY "Data doc." DATADOC
DISPLAY "Inizio validita" DATACOMP
DISPLAY "Fine validita" DATAFCOMP
DISPLAY "Tipo" TIPOCFFATT
DISPLAY "Inizio@10" DATACOMP
DISPLAY "Fine@10" DATAFCOMP
DISPLAY "Tipo" TIPODOC
DISPLAY "Agente" CODAG
DISPLAY "Cliente" CODCF
DISPLAY "Ragione sociale@50" LF_CLIFO->RAGSOC
OUPUT F_NDOC NDOC
FIELD NDOC
KEY 1
@ -299,10 +301,11 @@ END
CURRENCY F_ANTICIPATO
BEGIN
PROMPT 3 11 "Anticipato "
FLAGS "U"
GROUP 1
END
CURRENCY F_RESTITUITO
CURRENCY F_RESO_STORICO
BEGIN
PROMPT 38 11 "Restituito "
GROUP 1

View File

@ -1,6 +1,5 @@
#include <applicat.h>
#include <automask.h>
#include <dongle.h>
#include <progind.h>
#include <recarray.h>
#include <recset.h>
@ -126,7 +125,7 @@ protected:
void elabora_documenti(const TMask& mask, TISAM_recordset& recset, TLog_report& log);
//metodi medio livello
bool aggiorna_contratti(const TRiga_documento& rdoc, TDocumento& contratto);
bool aggiorna_contratti(const TRiga_documento& rdoc, TContratto_premi& contratto);
bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente);
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TArray& documenti_cliente, TLog_report& log);
@ -318,7 +317,7 @@ int THardy_elab_docs::find_contratti_cliente(const long codcf, const TMask& mask
//deve cercare tutti i contratti del cliente e metterli nell'array
TString query;
query << "USE DOC KEY 4";
query << "\nSELECT ((CODNUM=#A_CODNUM)||(CODNUM=#R_CODNUM)||(CODNUM=#P_CODNUM))";
query << "\nSELECT ((TIPODOC=#A_TIPODOC)||(TIPODOC=#R_TIPODOC)||(TIPODOC=#P_TIPODOC))";
query << "\nFROM TIPOCF=C CODCF=#CODCF";
query << "\nTO TIPOCF=C CODCF=#CODCF";
@ -328,13 +327,13 @@ int THardy_elab_docs::find_contratti_cliente(const long codcf, const TMask& mask
//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& num_ant = config.get("CoAntNum");
const TString& num_rifa = config.get("CoRifaNum");
const TString& num_post = config.get("CoPostNum");
const TString& tip_ant = config.get("CoAntTip");
const TString& tip_rifa = config.get("CoRifaTip");
const TString& tip_post = config.get("CoPostTip");
recset.set_var("#A_CODNUM", num_ant);
recset.set_var("#R_CODNUM", num_rifa);
recset.set_var("#P_CODNUM", num_post);
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", codcf);
@ -343,9 +342,6 @@ int THardy_elab_docs::find_contratti_cliente(const long codcf, const TMask& mask
//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())
{
//controlla il tipo di contratto
const char tipo_contr = recset.get(DOC_TIPOCFFATT).as_string()[0];
//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
@ -364,18 +360,30 @@ int THardy_elab_docs::find_contratti_cliente(const long codcf, const TMask& mask
continue;
//la data fine vale invece solo per i contratti 'P' e potrebbe non esserci (contratti senza scadenza)
TDate data_fine_contratto;
if (tipo_contr == 'P')
//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())
{
data_fine_contratto = recset.get(DOC_DATAFCOMP).as_date();
if (data_fine_contratto.ok())
{
if (data_fine_contratto < data_ini_elab)
continue;
}
if (data_fine_contratto < data_ini_elab)
continue;
}
TDocumento* curr_contratto = new TDocumento(recset.get(DOC_PROVV).as_string()[0], recset.get(DOC_ANNO).as_int(),
recset.get(DOC_CODNUM).as_string(), recset.get(DOC_NDOC).as_int());
//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)
{
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
{
rdoc->zero(RCA_2_RESO_CORRENTE);
break;
}
}
}
contratti_cliente.add(curr_contratto);
}
@ -383,10 +391,10 @@ int THardy_elab_docs::find_contratti_cliente(const long codcf, const TMask& mask
}
bool THardy_elab_docs::aggiorna_contratti(const TRiga_documento& rdoc, TDocumento& contratto)
bool THardy_elab_docs::aggiorna_contratti(const TRiga_documento& rdoc, TContratto_premi& contratto)
{
bool elaborato = false;
const char tipo_contratto = contratto.get(DOC_TIPOCFFATT)[0];
const char tipo_contratto = contratto.tipo_contratto();
//parametri della riga fattura
TString80 rdoc_codart = rdoc.get(RDOC_CODART);
rdoc_codart.trim();
@ -416,14 +424,19 @@ bool THardy_elab_docs::aggiorna_contratti(const TRiga_documento& rdoc, TDocument
//cerca una riga anticipo da evadere sul contratto per aggiornare la somma restituita sull'anticipo
if (rigacontratto->is_spese())
{
//si informa su quale fosse la somma anticipata
const real somma_anticipata = rigacontratto->get_real(RCA_2_ANTICIPATO);
//aggiorna la somma restituita dovuta al contratto (parte da zero per ogni elaborazione di NAC)
real somma_restituita = rigacontratto->get_real(RCA_2_RESTITUITO);
real somma_restituita = rigacontratto->get_real(RCA_2_RESO_CORRENTE);
//controlla che il contratto non sia per caso già stato pareggiato! quindi il reso deve essere < dell'anticipato per procedere
//la somma restituita deve essere incrementata per la qta di merce (caffè) che c'è sulla riga della fattura in esame...
//..moltiplicata per il premio che c'è nella riga di tipo merce del contratto in esame
somma_restituita += normalized_rdoc_qta * rigamerce_premio;
rigacontratto->put(RCA_2_RESTITUITO, somma_restituita);
rigacontratto->put(RCA_2_RESO_CORRENTE, somma_restituita);
elaborato = true;
break;
}
} //FOR_EACH_PHYSICAL.. fine casino sulla riga di tipo spese
@ -466,7 +479,7 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti
//controlla se il codart della riga esiste in uno dei contratti validi
for (int i = 0; i < contratti_cliente.items(); i++)
{
TDocumento& contratto = (TDocumento&)contratti_cliente[i];
TContratto_premi& contratto = (TContratto_premi&)contratti_cliente[i];
elaborato |= aggiorna_contratti(*rdoc, contratto);
} //for(int i..
} //FOR_EACH...
@ -483,16 +496,15 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
//giro su tutti i contratti del cliente che stanno nell'array (ogni contratto genera una NAC)
FOR_EACH_ARRAY_ITEM(contratti_cliente, r, riga)
{
TDocumento& contratto = *(TDocumento*)riga;
TContratto_premi& contratto = *(TContratto_premi*)riga;
const long ndoc = contratto.numero(); //il numdoc del contratto serve nelle segnalazioni
const long codcf = contratto.codcf(); //il codice cliente ci serve nella generazione della NAC..
const char tipo_contratto = contratto.get(DOC_TIPOCFFATT)[0]; //..e pure il tipo di contratto in esame!
const char tipo_contratto = contratto.tipo_contratto(); //..e pure il tipo di contratto in esame!
//segnaliamo l'elaborazione del contratto sul log
TString msg;
msg << "Elaborato contratto premi n." << ndoc << " del cliente " << codcf;
log.log(0, msg);
TString log_msg;
log_msg.format("Contratto:%6ld Cliente:%6ld", ndoc, codcf);
//log_msg << "Contratto: " << ndoc << " Cliente: " << codcf;
// generazione del documento NAC dal contratto
// -------------------------------------------
@ -551,26 +563,24 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
{
const TRiga_documento& riga_contratto = contratto[i]; //le righe di un documento partono da 1! (standard del mercoledì)
const TString& tiporiga = riga_contratto.get(RDOC_TIPORIGA);
const TString& tipo_riga_contratto = cache().get("%TRI", tiporiga, "S7");
TString80 riga_contratto_codart = riga_contratto.get(RDOC_CODART);
//solo le righe di tipo merce (verigh01) dei contratti devono comparire nelle NAC
if (tipo_riga_contratto == "M")
if (tiporiga == HARDY_TIPORIGA_MERCE)
{
TString80 riga_contratto_codart = riga_contratto.get(RDOC_CODART);
riga_contratto_codart.trim();
const real riga_contratto_qta = riga_contratto.get_real(RDOC_QTA);
const TString4 riga_contratto_um = riga_contratto.get(RDOC_UMQTA);
const real riga_contratto_premio = riga_contratto.get_real(RC_1_PREMIO);
// riga (dovrebbe essere un'unica riga per NAC, il cui valore sta in QTAGG3 ed è stato calcolato nella elabora_contratti())
// riga merce NAC
TRiga_documento& nac_row = nac.new_row(tipo_riga);
nac_row.put(RDOC_NRIGA, i);
nac_row.put(RDOC_CODART, cod_riga);
//panegirico della descrizione
nac_row.put(RDOC_DESCR, descr_riga_spp);
msg.cut(0); //risparmiamo sulle stringhe, mica sono gratis
TString msg;
const TDate adata = mask.get_date(F_ADATA);
TDate dadata = mask.get_date(F_DADATA);
if (!dadata.ok())
@ -588,46 +598,103 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
//iva
nac_row.put(RDOC_CODIVA, codiva);
}
//trattazione speciale delle righe spese (verigh02) (solo 'A'nticipi e 'R'ifatturazioni)
if (tiporiga == HARDY_TIPORIGA_SOMMA && (tipo_contratto == 'A' || tipo_contratto == 'R'))
{
const real somma_anticipata = riga_contratto.get_real(RCA_2_ANTICIPATO);
real somma_resa_storica = riga_contratto.get_real(RCA_2_RESO_STORICO);
real somma_resa_corrente = riga_contratto.get_real(RCA_2_RESO_CORRENTE);
const real esubero = somma_resa_storica + somma_resa_corrente - somma_anticipata;
if (esubero > ZERO)
{
somma_resa_corrente -= esubero;
//se c'è un esubero nel rimborso dell'anticipo esisterà solo una riga nella NAC, con una cifra pari alla somma..
//..che mancava a pareggiare l'anticipo (anche se l'esubero eccedesse tale differenza, sulla NAC ci va la somma a..
//..pareggio! così freghiamo qualcosa al cliente)
nac.destroy_rows();
// riga spesa NAC
TRiga_documento& nac_row = nac.new_row(tipo_riga);
nac_row.put(RDOC_CODART, cod_riga);
//panegirico della descrizione
nac_row.put(RDOC_DESCR, descr_riga_spp);
TString msg;
const TDate adata = mask.get_date(F_ADATA);
TDate dadata = mask.get_date(F_DADATA);
if (!dadata.ok())
check_date(adata, dadata);
msg << " " << dadata << " -- " << adata;
nac_row.put(RDOC_DESCEST, msg);
nac_row.put(RDOC_DESCLUNGA, "X");
//importi, qta
nac_row.put(RDOC_QTA, 1);
nac_row.put(RDOC_PREZZO, somma_resa_corrente);
//iva
nac_row.put(RDOC_CODIVA, codiva);
}
}
}
// salvataggi vari
// ---------------
//la NAC viene scritta comunque, con provv='D' se elaborazione definitiva
// NAC
// viene scritta comunque, con provv='D' se elaborazione definitiva
int err = nac.write();
msg.cut(0); //la fase di risparmio stringhe continua
TString wrk_msg;
if (err == NOERR)
msg << "Generata NAC ";
{
wrk_msg.format(" -- Generata NAC: %-4s%-4s%c %7ld", (const char*)nac_codnum, (const char*)nac_tipo, provv, nac.get_long(DOC_NDOC));
log_msg << wrk_msg;
}
else
msg << "Impossibile generare NAC ";
msg << " - provv:" << provv << " - num:" << nac_codnum << " - tipo:" << nac_tipo << " - anno:" << anno << " |" << r;
log.log(0, msg);
log_msg << " -- Impossibile generare NAC !!";
// CONTRATTO
//se il contratto è di tipo A/R aggiorna la riga spese speciale (verigh02)
if ((tipo_contratto == 'A' || tipo_contratto == 'R') && err == NOERR)
{
FOR_EACH_PHYSICAL_RDOC(contratto, r, rdoc)
{
if (rdoc->get(RDOC_TIPORIGA) == HARDY_TIPORIGA_SOMMA)
{
const real anticipato = rdoc->get_real(RCA_2_ANTICIPATO);
real reso_storico = rdoc->get_real(RCA_2_RESO_STORICO);
reso_storico += rdoc->get_real(RCA_2_RESO_CORRENTE);
rdoc->put(RCA_2_RESO_STORICO, reso_storico);
//se il contratto è andato a pareggio avverte dilegentemente l'operatore
if (reso_storico >= anticipato)
log_msg << " -- Contratto pareggiato!";
} //if (rdoc->get(RDOC_TIPORIGA)...
} //FOR_EACH_PHYSICAL_RDOC(contratto...
} //if (tipo_contratto == 'A'..
// se non ci sono errori -> in caso di elaborazione definitiva procede alla registrazione..
//.. del contratto (ricordiamo che in memoria il contratto ha già le righe aggiornate
if (definitivo && err == NOERR)
{
//prima di registrare il contratto vanno svuotati i campi appoggio sulle righe che sono stati usati..
//..per qta e premi vari e riempiti nella elabora_contratti()
for (int i = 1; i <= contratto.rows(); i++)
{
TRiga_documento& riga_contratto = contratto[i];
riga_contratto.put(RDOC_QTAGG3, ZERO);
riga_contratto.put(RDOC_QTA, ZERO);
}
//alla fine della fiera aggiorna il contratto
err = contratto.rewrite();
msg.cut(0);
if (err == NOERR)
msg << "Aggiornato contratto premi n. ";
else
msg << "Impossibile aggiornare il contratto premi n. ";
msg << ndoc << " del cliente " << codcf;
log.log(0, msg);
if (err == NOERR)
log_msg << " -- Contratto aggiornato";
else
log_msg << " -- Impossibile aggiornare contratto";
}
log.log(0, log_msg);
log.log(0, "");
} //FOR_EACH_ARRAY_ITEM(... giro sui contratti cliente
@ -638,9 +705,9 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
}
void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& recset, TLog_report& log)
void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fatture, TLog_report& log)
{
TProgind pi(recset.items(), TR("Elaborazione documenti in corso..."), true, true);
TProgind pi(fatture.items(), TR("Elaborazione documenti in corso..."), true, true);
//inizializza variabili da usare nella scansione del recordset
long old_codcf = 0L;
@ -648,15 +715,21 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& rec
TArray contratti_cliente, documenti_cliente;
//giro sulle fatture (è il giro di più alto livello che viene esteso all'interno delle elabora_contratti)
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
for (bool ok = fatture.move_first(); ok; ok = fatture.move_next())
{
if (!pi.addstatus(1))
break;
const long codcf = recset.get(DOC_CODCF).as_int();
const long codcf = fatture.get(DOC_CODCF).as_int();
//al cambio cliente deve controllare i contratti di quel cliente nel periodo di elaborazione!!
if (codcf != old_codcf)
{
//generazione NAC del cliente precedente (una per contratto cliente)
if (old_codcf > 0)
genera_nac(mask, contratti_cliente, documenti_cliente, log);
CHECK(codcf > old_codcf, "Ordinamento clienti errato!");
//aggiorna old_codcf in modo da poter controllare i contratti solo al cambio codcf
old_codcf = codcf;
@ -672,7 +745,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& rec
if (contratti_cliente.items() > 0)
{
//se ha trovato uno o più contratti validi nel periodo passa alla elaborazione dei documenti del cliente
TDocumento* curr_doc = new TDocumento(recset.cursor()->curr());
TDocumento* curr_doc = new TDocumento(fatture.cursor()->curr());
//elabora il documento corrente aggiornando le somme restituite sui contratti validi
if (elabora_contratti(*curr_doc, contratti_cliente))
documenti_cliente.add(curr_doc);
@ -681,7 +754,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& rec
}
} //for (bool ok = recset.move_first()...
//generazione NAC (una per contratto cliente)
//generazione NAC dell'ultimo cliente (una per contratto cliente)
genera_nac(mask, contratti_cliente, documenti_cliente, log);
//se elaborazione definitiva -> cambia lo stato ai documenti di vendita elaborati, mettendolo uguale..
@ -752,7 +825,7 @@ bool THardy_elab_docs::create()
int ha0500 (int argc, char* argv[])
{
THardy_elab_docs main_app;
main_app.run(argc, argv, TR("Elaborazione documenti Hardy"));
return true;
THardy_elab_docs elabapp;
elabapp.run(argc, argv, TR("Generazione NAC"));
return 0;
}

View File

@ -1,6 +1,6 @@
#include "ha0500a.h"
PAGE "Elaborazione documenti Hardy" -1 -1 78 11
PAGE "Generazione NAC" -1 -1 78 11
GROUPBOX DLG_NULL 76 5
BEGIN

View File

@ -1,3 +1,7 @@
#ifndef __VELIB_H
#include "../ve/velib.h"
#endif
//definizioni delle righe dei contratti premio Hardy (da includere nei .cpp)
#define HARDY_TIPORIGA_MERCE "H01"
#define HARDY_TIPORIGA_SOMMA "H02"
@ -13,6 +17,18 @@
#define RC_1_NSCARICO RDOC_QTAGG2
#define RC_1_BONUS RDOC_QTAGG5
#define RCA_2_ANTICIPATO RDOC_PREZZO
#define RCA_2_RESTITUITO RDOC_QTAGG5
#define RCA_2_ANTICIPATO RDOC_PREZZO
#define RCA_2_RESO_STORICO RDOC_QTAGG5
#define RCA_2_RESO_CORRENTE RDOC_QTAGG3
class TContratto_premi : public TDocumento
{
static TString4 _tipo_ant, _tipo_post, _tipo_rifa;
public:
char tipo_contratto() const;
TContratto_premi(char provv, int anno, const char* codnum, long ndoc);
TContratto_premi(const TRectype& rec_doc);
};

View File

@ -3,8 +3,10 @@ Caption = "Hardy caffe'"
Picture = <ha01>
Module = 46
Flags = "F"
Item_01 = "Configurazione Hardy", "ha0 -1", ""
Item_01 = "Configurazione modulo", "ha0 -1", ""
Item_02 = "Gestione contratti premio", "ha0 -2", ""
Item_03 = "Contabilizzazione contratti premio", "ve6 -1", "F"
Item_04 = "Generazione NAC", "ha0 -4", ""
Item_05 = "Gestione listini", "ve2 -4", ""
Item_05 = "Elaborazione contratti premio pareggiati", "ha0 -3", "F"
Item_06 = "Gestione listini", "ve2 -4", ""
Item_07 = "Stampa listini", "ve3 -4 L", ""