From cb52f86f76f178f0776b03557c80c0bfb7e8d92f Mon Sep 17 00:00:00 2001 From: guy Date: Mon, 27 May 2013 12:01:21 +0000 Subject: [PATCH] Generazione fatture + nAC di nolo invece del viceversa git-svn-id: svn://10.65.10.50/branches/R_10_00@22861 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ha/ha0500.cpp | 141 ++++++++++++++++++++++++++----------------------- ha/ha0500a.h | 1 + ha/ha0500a.uml | 10 +++- 3 files changed, 85 insertions(+), 67 deletions(-) diff --git a/ha/ha0500.cpp b/ha/ha0500.cpp index 6232bb4fa..96e46e737 100755 --- a/ha/ha0500.cpp +++ b/ha/ha0500.cpp @@ -491,7 +491,7 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, - TAssoc_array& nac_nolo, TLog_report& log) + TAssoc_array& fat_nolo, TLog_report& log) { if (contratti_cliente.empty()) return false; @@ -552,7 +552,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, cod_riga = codspesa; } - const TDate datadoc = mask.get(F_DATAELAB); + const TDate datadoc = mask.get(tipo_contratto == 'N' ? F_DATANOLO : F_DATAELAB); const int anno = datadoc.year(); //solo in caso di elaborazione definitiva si scrivono NAC di tipo D; //sennò di tipo P, che sono uccidibili all'inizio di ogni nuova elaborazione @@ -567,7 +567,24 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, nac.put(DOC_CODAG, codage); nac.put(DOC_CODPAG, contratto.get(DOC_CODPAG)); nac.put(DOC_DOC1, contratto.get(DOC_DOC1)); - nac.put(DOC_DATADOCRIF, contratto.get(DOC_DATADOCRIF)); + + TToken_string cnkey; // Chiave contratto + cnkey.add(contratto.get(DOC_PROVV)); + cnkey.add(contratto.get(DOC_ANNO)); + cnkey.add(contratto.get(DOC_CODNUM)); + cnkey.add(contratto.get(DOC_NDOC)); + TToken_string* fatkey = (TToken_string*)fat_nolo.objptr(cnkey); + if (fatkey != NULL) + { + // Skip fatkey->get(0) = PROVV + nac.put(DOC_ANNORIF, fatkey->get(1)); + nac.put(DOC_CODNUMRIF, fatkey->get()); + nac.put(DOC_NUMDOCRIF, fatkey->get()); + nac.put(DOC_DATADOCRIF, fatkey->get()); + } + else + nac.put(DOC_DATADOCRIF, contratto.get(DOC_DATADOCRIF)); + // RIGHE @@ -677,7 +694,6 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, } } - // salvataggi vari // --------------- // NAC @@ -718,20 +734,14 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, } break; case 'N': - { - TToken_string nakey; // Chiave NAC - nakey.add(provv); - nakey.add(anno); - nakey.add(nac_codnum); - nakey.add(nac.get(DOC_NDOC)); - - TToken_string cnkey; // Chiave contratto - cnkey.add(contratto.get(DOC_PROVV)); - cnkey.add(contratto.get(DOC_ANNO)); - cnkey.add(contratto.get(DOC_CODNUM)); - cnkey.add(contratto.get(DOC_NDOC)); - - nac_nolo.add(cnkey, nakey); // memorizza la coppia contratto/nac di nolo + if (fatkey != NULL) + { + const char provv = fatkey->get_char(0); + const int anno = fatkey->get_int(); + const char* codnum = fatkey->get(); + const long ndoc = fatkey->get_long(); + const TDocumento fat(provv, anno, codnum, ndoc); + genera_eff(fat, nac.totale_doc(), log); } break; default: @@ -761,7 +771,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, return true; } -bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& nac_nolo, TLog_report& log) +bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& fat_nolo, TLog_report& log) { //si informa se l'elaborazione è definitiva o meno const char provv = mask.get_bool(F_DEFINITIVO) ? 'D' : 'P'; @@ -835,23 +845,11 @@ bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto (const char*)fat_codnum, (const char*)fat_tipodoc, fat.get_char(DOC_PROVV), fat.get_long(DOC_NDOC)); log.log(0, log_msg); - real tot_nac; - if (!nac_nolo.empty_items()) - { - const char provv = nac_nolo.get(0)[0]; - const int anno = nac_nolo.get_int(); - const TString4 codnum = nac_nolo.get(); - const long ndoc = nac_nolo.get_long(); - TDocumento nac(provv, anno, codnum, ndoc); - nac.put(DOC_DATADOCRIF, fat.get(DOC_DATADOC)); - nac.put(DOC_CODNUMRIF, fat.get(DOC_CODNUM)); - nac.put(DOC_ANNORIF, fat.get(DOC_ANNO)); - nac.put(DOC_NUMDOCRIF, fat.get(DOC_NDOC)); - nac.rewrite(); - - tot_nac = nac.totale_doc(); - } - genera_eff(fat, tot_nac, log); + fat_nolo = fat.get(DOC_PROVV); + fat_nolo.add(fat.get(DOC_ANNO)); + fat_nolo.add(fat.get(DOC_CODNUM)); + fat_nolo.add(fat.get(DOC_NDOC)); + fat_nolo.add(fat.get(DOC_DATADOC)); } else { @@ -921,10 +919,31 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat long old_codcf = 0L; //array con l'insieme dei contratti e dei documenti elaborati per un singolo cliente! TArray contratti_cliente, documenti_cliente; - TAssoc_array nac_nolo; + TAssoc_array fat_nolo; const int tc = mask.get_int(F_TIPOCONTR); // 0x7 (tutti tranne nolo) o 0x8 (solo nolo) + if (tc & 0x8) // Elaborazione nolo? + { + // Elabora tutti i contratti di nolo per generare fatture ed effetti + const int cn = find_contratti_cliente(mask.get_long(F_CODCF), mask, 0x8, contratti_cliente); + FOR_EACH_ARRAY_ROW(contratti_cliente, n_nolo, r_nolo) + { + TContratto_premi& contratto = *(TContratto_premi*)r_nolo; + + TToken_string fatkey; + if (genera_fat(mask, contratto, fatkey, log)) + { + TToken_string cnkey; // Chiave contratto + cnkey.add(contratto.get(DOC_PROVV)); + cnkey.add(contratto.get(DOC_ANNO)); + cnkey.add(contratto.get(DOC_CODNUM)); + cnkey.add(contratto.get(DOC_NDOC)); + fat_nolo.add(cnkey, fatkey); + } + } + } + //giro sulle fatture (è il giro di più alto livello che viene esteso all'interno delle elabora_contratti) for (bool ok = fatture.move_first(); ok; ok = fatture.move_next()) { @@ -937,21 +956,32 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat { //generazione NAC del cliente precedente (una per contratto cliente) if (old_codcf > 0 && !documenti_cliente.empty()) - genera_nac(mask, contratti_cliente, nac_nolo, log); + genera_nac(mask, contratti_cliente, fat_nolo, log); //aggiorna old_codcf in modo da poter controllare i contratti solo al cambio codcf old_codcf = codcf; + const int n_contratti = find_contratti_cliente(codcf, mask, tc, contratti_cliente); + TString8 key; key.format("C|%ld", codcf); TString msg; msg << TR("Cliente") << ' ' << codcf << ' ' << cache().get(LF_CLIFO, key, CLI_RAGSOC); - log.log(0, msg); - const int n_contratti = find_contratti_cliente(codcf, mask, tc, contratti_cliente); - if (n_contratti == 0) + if (n_contratti > 0) { - TString msg; - msg << TR("Il cliente non ha un contratto valido nel periodo selezionato pur avendo fatture."); - log.log(1, msg); + log.log(0, msg); + } + else + { + if (tc & 0x8) // Elaborazione nolo? + { + // Nulla di grave se non esistono contratti di nolo + } + else + { + log.log(0, msg); + msg = TR("Non ha un contratto valido nel periodo selezionato pur avendo fatture."); + log.log(1, msg); + } } } @@ -971,7 +1001,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat //generazione NAC dell'ultimo cliente (una per contratto cliente) if (!contratti_cliente.empty()) - genera_nac(mask, contratti_cliente, nac_nolo, log); + genera_nac(mask, contratti_cliente, fat_nolo, log); //se elaborazione definitiva -> cambia lo stato ai documenti di vendita elaborati, mettendolo uguale.. //..a quello deciso in configurazione @@ -986,26 +1016,6 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat fattura.rewrite(); } } - - if (tc & 0x8) // Elaborazino nolo? - { - // Elabora tutti i contratti di nolo per generare fatture ed effetti - const int cn = find_contratti_cliente(mask.get_long(F_CODCF), mask, 0x8, contratti_cliente); - FOR_EACH_ARRAY_ROW(contratti_cliente, n_nolo, r_nolo) - { - TContratto_premi& contratto = *(TContratto_premi*)r_nolo; - - TToken_string cnkey; // Chiave contratto - cnkey.add(contratto.get(DOC_PROVV)); - cnkey.add(contratto.get(DOC_ANNO)); - cnkey.add(contratto.get(DOC_CODNUM)); - cnkey.add(contratto.get(DOC_NDOC)); - - const TToken_string* nk = (const TToken_string*)nac_nolo.objptr(cnkey); - TToken_string nakey = nk ? *nk : EMPTY_STRING; - genera_fat(mask, contratto, nakey, log); - } - } } //metodo di alto livello con i punti principali del programma (come da analisi...) @@ -1055,3 +1065,4 @@ int ha0500 (int argc, char* argv[]) elabapp.run(argc, argv, TR("Generazione NAC")); return 0; } + diff --git a/ha/ha0500a.h b/ha/ha0500a.h index d85bb3ba9..b06205aac 100755 --- a/ha/ha0500a.h +++ b/ha/ha0500a.h @@ -13,3 +13,4 @@ #define F_DATAELAB 214 #define F_DEFINITIVO 215 #define F_KILLPROVV 216 +#define F_DATANOLO 217 \ No newline at end of file diff --git a/ha/ha0500a.uml b/ha/ha0500a.uml index b98c4981b..019f622bd 100755 --- a/ha/ha0500a.uml +++ b/ha/ha0500a.uml @@ -81,16 +81,22 @@ END BOOLEAN F_KILLPROVV BEGIN - PROMPT 2 8 "Eliminare tutte le note di accredito provvisorie" + PROMPT 2 8 "Elimina note di accredito provvisorie" END DATE F_DATAELAB BEGIN - PROMPT 43 7 "Data elaborazione " + PROMPT 45 7 "Data elaborazione " FLAGS "A" CHECKTYPE REQUIRED END +DATE F_DATANOLO +BEGIN + PROMPT 45 8 "Data NAC nolo " + FLAGS "A" + CHECKTYPE REQUIRED +END RADIOBUTTON F_TIPOCONTR 1 76 BEGIN