From fc5ba87cdda971863fc1f5e27a1fb7e5501607de Mon Sep 17 00:00:00 2001 From: luca Date: Mon, 27 Sep 2010 14:30:54 +0000 Subject: [PATCH] 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 --- ha/ha0.cpp | 11 +-- ha/ha0.h | 2 +- ha/ha0200.cpp | 4 +- ha/ha0200a.uml | 36 ++++----- ha/ha0300.cpp | 33 +++++--- ha/ha0300a.h | 2 +- ha/ha0300a.uml | 15 ++-- ha/ha0500.cpp | 213 +++++++++++++++++++++++++++++++++---------------- ha/ha0500a.uml | 2 +- ha/halib.h | 20 ++++- ha/hamenu.men | 6 +- 11 files changed, 226 insertions(+), 118 deletions(-) diff --git a/ha/ha0.cpp b/ha/ha0.cpp index 867514175..f87e08c2b 100755 --- a/ha/ha0.cpp +++ b/ha/ha0.cpp @@ -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; } diff --git a/ha/ha0.h b/ha/ha0.h index 3cfeea74a..8b3a1ad9d 100755 --- a/ha/ha0.h +++ b/ha/ha0.h @@ -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[]); diff --git a/ha/ha0200.cpp b/ha/ha0200.cpp index ffdb9d526..af1f2aa1b 100755 --- a/ha/ha0200.cpp +++ b/ha/ha0200.cpp @@ -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; } \ No newline at end of file diff --git a/ha/ha0200a.uml b/ha/ha0200a.uml index 933e1a361..c36fb79f1 100755 --- a/ha/ha0200a.uml +++ b/ha/ha0200a.uml @@ -4,7 +4,7 @@ TOOLBAR "topbar" 0 0 0 2 #include 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 diff --git a/ha/ha0300.cpp b/ha/ha0300.cpp index c6e787d01..5e16a8ffd 100755 --- a/ha/ha0300.cpp +++ b/ha/ha0300.cpp @@ -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; } diff --git a/ha/ha0300a.h b/ha/ha0300a.h index f5ec91c73..e285bf24f 100755 --- a/ha/ha0300a.h +++ b/ha/ha0300a.h @@ -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ù diff --git a/ha/ha0300a.uml b/ha/ha0300a.uml index 6b9757fc5..46cb2db1a 100755 --- a/ha/ha0300a.uml +++ b/ha/ha0300a.uml @@ -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 diff --git a/ha/ha0500.cpp b/ha/ha0500.cpp index 9b14950d0..30c7ada75 100755 --- a/ha/ha0500.cpp +++ b/ha/ha0500.cpp @@ -1,6 +1,5 @@ #include #include -#include #include #include #include @@ -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; } \ No newline at end of file diff --git a/ha/ha0500a.uml b/ha/ha0500a.uml index c97019837..85a9642f3 100755 --- a/ha/ha0500a.uml +++ b/ha/ha0500a.uml @@ -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 diff --git a/ha/halib.h b/ha/halib.h index bcb9b1b43..e3fa88b7c 100755 --- a/ha/halib.h +++ b/ha/halib.h @@ -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); +}; \ No newline at end of file diff --git a/ha/hamenu.men b/ha/hamenu.men index 54c2f68fd..26e873709 100755 --- a/ha/hamenu.men +++ b/ha/hamenu.men @@ -3,8 +3,10 @@ Caption = "Hardy caffe'" Picture = 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", ""