From f6f643fa96d10db31ab68825e872286ffb26ada4 Mon Sep 17 00:00:00 2001 From: guy Date: Fri, 26 Jul 2013 15:44:47 +0000 Subject: [PATCH] Correzioni per Aerea git-svn-id: svn://10.65.10.50/branches/R_10_00@22883 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- ha/ha0200a.uml | 5 +- ha/ha0500.cpp | 185 ++++++++++++++++++++++++++++++++++++------------- ha/ha0500a.uml | 1 + 3 files changed, 142 insertions(+), 49 deletions(-) diff --git a/ha/ha0200a.uml b/ha/ha0200a.uml index 3d8e4f05b..8daab37f0 100755 --- a/ha/ha0200a.uml +++ b/ha/ha0200a.uml @@ -752,7 +752,7 @@ END STRING F_E_PIVA_HARDY 12 BEGIN - PROMPT 2 4 "Partita IVA Hardy " + PROMPT 2 4 "Partita IVA Hardy/Aerea " HELP "Partita IVA Hardy" FIELD Esselunga_PIvaHardy END @@ -766,9 +766,10 @@ END NUMBER F_E_COD_HARDY 6 BEGIN - PROMPT 2 6 "Cod. fornitore Hardy " + PROMPT 2 6 "Cod. fornitore Hardy/Aerea" HELP "Codice fornitore Hardy presso Esselunga" FIELD Esselunga_CodHardy + FLAGS "Z" END NUMBER F_E_COD_ESSELUNGA 6 diff --git a/ha/ha0500.cpp b/ha/ha0500.cpp index 96e46e737..e777d947c 100755 --- a/ha/ha0500.cpp +++ b/ha/ha0500.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -32,22 +33,77 @@ bool THardy_elab_docs_mask::on_field_event(TOperable_field& o, TField_event e, l { switch (o.dlg()) { - case F_ADATA: - if (e == fe_close || e == fe_modify) + case F_DADATA: + if ((e == fe_close || e == fe_modify) && !o.empty()) { //se la data iniziale è piena -> l'anno deve essere lo stesso nelle 2 date; //se invece è vuota -> la data iniziale viene presa come la data iniziale dell'esercizio della data finale... //..ma questo qui non serve e viene rinviato alla query principale del recordset - const TDate adata = get_date(F_ADATA); - TEsercizi_contabili esc; - const int adata_esc = esc.date2esc(adata); - - TDate dadata = o.get(); - if (dadata.ok()) + TDate da_data = o.get(); + const TDate a_data = get_date(F_ADATA); + if (da_data.ok()) { - const int dadata_esc = esc.date2esc(dadata); - if (adata_esc != dadata_esc) - return error_box(TR("Le date devono appartenere allo stesso esercizio!")); + bool changed = false; + if (da_data.day() != 1) + { + da_data.set_day(1); + changed = true; + } + const int tc = get_int(F_TIPOCONTR); + if (tc != 8) // non è nolo + { + const int m = da_data.month(); + const int r = m % 3; + if (r != 1) + { + da_data.set_month(m - (r == 0 ? 2 : (r-1))); + changed = true; + } + } + if (changed) + o.set(da_data.string()); + } + } + break; + case F_ADATA: + if ((e == fe_close || e == fe_modify) && !o.empty()) + { + TDate d = o.get(); + if (d.ok()) + { + bool changed = false; + const int tc = get_int(F_TIPOCONTR); + if (tc != 8) // Non è nolo + { + const int m = d.month(); + const int r = m % 3; + if (r != 0) + { + d.set_month(m + 3 - r); + changed = true; + } + } + else + { + TDate da_data = d; + da_data.set_day(1); + set(F_DADATA, da_data); + } + + if (!d.is_end_month()) + { + d.set_end_month(); + changed = true; + } + if (changed) + o.set(d.string()); + + if (e == fe_close) + { + const TDate dal = get(F_DADATA); + if (dal.ok() && dal.year() != d.year()) + return error_box(TR("Le date devono appartenere allo stesso anno!")); + } } } break; @@ -56,15 +112,15 @@ bool THardy_elab_docs_mask::on_field_event(TOperable_field& o, TField_event e, l case F_DEFINITIVO: if (e == fe_modify) { - if (o.get() == "X") + if (o.get().full()) { set(F_KILLPROVV, "X"); disable(F_KILLPROVV); } else { + reset(F_KILLPROVV); enable(F_KILLPROVV); - set(F_KILLPROVV, " "); } } break; @@ -74,8 +130,6 @@ bool THardy_elab_docs_mask::on_field_event(TOperable_field& o, TField_event e, l return true; } - - /////////////////////////////////////// // TSkeleton_application /////////////////////////////////////// @@ -90,6 +144,7 @@ protected: //metodi medio livello bool aggiorna_contratto(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log); + bool deve_generare_nac(const TContratto_premi& contratto, const TDate& data) const; bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log); bool genera_nac(const TMask& mask, TArray& contratti_cliente, TAssoc_array& nac_nolo, TLog_report& log); bool genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& nakey, TLog_report& log); @@ -184,6 +239,8 @@ int THardy_elab_docs::kill_provv_nac(const TMask& mask) //metodo che filtra tutti i documenti in base ai parametri della maschera long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recset) { + const int tc = mask.get_int(F_TIPOCONTR); + //parametri di elaborazione //per prima cosa controlla se il cliente è stato specificato; questo influisce sulla scelta della chiave di ricerca sul file int key = 3; @@ -197,7 +254,9 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs query << "USE DOC KEY " << key; //lo stato dipende da quanto sta scritto sulla elaborazione differita (stato iniziale dei docs da considerare) //viene messo CODNUM nella SELECT perchè, essendoci un range di date nelle chiavi, la numerazione verrebbe ignorata! (provato!) - query << "\nSELECT (STATO>=#STATOINI)&&(STATO<'9')"; + query << "\nSELECT (STATO>=#STATOINI)"; + if (tc != 8) // Per i contratti NON di nolo ... + query << "&&(STATO<'9')"; // ... scarta i documenti definitivi //in base al tipo documento che si deve elaborare (settato in configurazione), ci possono essere più numerazioni da considerare! TConfig config(CONFIG_DITTA, "ha"); @@ -207,11 +266,9 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs // Inutile testare tutte le numerazioni, basta il tipo documento 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); - //ordinamento (agente)-codcf-ndoc - query << "\nBY " << DOC_CODCF << " " << DOC_NDOC; + if (codcf <= 0) + query << "\nBY " << DOC_CODCF << ' ' << DOC_NDOC; //ordinamento codcf-ndoc //from-to dipendente da chiave switch (key) @@ -242,6 +299,8 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs const TString& stato_ini = config.get("StatoIniFatt"); recset.set_var("#STATOINI", stato_ini); + //se c'è l'agente specificato... + const TString& agente = mask.get(F_CODAGE); if (agente.full()) recset.set_var("#CODAG", agente); if (codcf > 0) @@ -454,6 +513,21 @@ bool THardy_elab_docs::aggiorna_contratto(const TRiga_documento& rdoc, TContratt return elaborato; } +bool THardy_elab_docs::deve_generare_nac(const TContratto_premi& contratto, const TDate& data) const +{ + const int mese = data.month(); + bool yes = false; + switch (contratto.frequenza()) + { + case 'A': yes = mese == 12; break; // Gli annuali valgono solo a dicembre + case 'M': yes = true; break; // I mensili (nolo) valgono sempre + case 'S': yes = mese == 6 || mese == 12; // I semestrali valgono solo a giugno e dicembre + case 'T': yes = data.month() % 3 == 0; break; // I trimestrali valgono solo a marzo, giugno, settembre e dicembre + default: break; + } + return yes; +} + //aggiorna, in base al documento in esame curr_doc, le somme restituite nelle righe di tipo verigh02 nei contratti validi.. //..del cliente bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log) @@ -472,11 +546,12 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti // Calcola l'inizio di validità dei documenti in base alla frequenza (14-01-2013) TDate data_inizio(1, 1, data_fine.year()); + const int mese = data_fine.month(); switch (contratto.frequenza()) { - case 'M': data_inizio.set_month(data_fine.month()); break; // Solo contratti NOLO - case 'S': data_inizio.set_month(data_fine.month() > 6 ? 7 : 1); break; - case 'T': data_inizio.set_month(max(1, data_fine.month()-2)); break; + case 'M': data_inizio.set_month(mese); break; // Solo contratti NOLO + case 'S': data_inizio.set_month(mese > 6 ? 7 : 1); break; + case 'T': data_inizio.set_month(max(1, mese-2)); break; default: break; } @@ -498,6 +573,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, //si informa se l'elaborazione è definitiva o meno const bool definitivo = mask.get_bool(F_DEFINITIVO); + const TDate data_fine = mask.get(F_ADATA); //giro su tutti i contratti del cliente che stanno nell'array (ogni contratto genera una NAC) FOR_EACH_ARRAY_ITEM(contratti_cliente, r, riga) @@ -507,9 +583,36 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, const long codcf = contratto.codcf(); // il codice cliente ci serve nella generazione della NAC... const char tipo_contratto = contratto.tipo_contratto(); // ...e pure il tipo di contratto in esame! + TString80 tip = ""; + switch (tipo_contratto) + { + case 'A': tip = TR("Anticipo"); break; + case 'N': tip = TR("Nolo"); break; + case 'P': tip = TR("Posticipo"); break; + case 'R': tip = TR("Rifatturzaione"); break; + default : break; + } + + TString80 freq = ""; + switch (contratto.frequenza()) + { + case 'A': freq = TR("annuale"); break; + case 'M': freq << TR("rata ") << (contratto.get_int(DOC_NUMANT)+1); break; + case 'S': freq << (data_fine.month() < 7 ? TR("I sem.") : TR("II sem.")); break; + case 'T': freq << itor((data_fine.month()/3)) << TR(" trim."); break; + default : break; + } + + const bool nac_ok = deve_generare_nac(contratto, data_fine); //segnaliamo l'elaborazione del contratto sul log TString log_msg; - log_msg.format(FR("Contratto:%6ld Cliente:%6ld"), ndoc, codcf); + log_msg.format(FR("Cliente:%ld Contratto:%ld %s %s"), codcf, ndoc, (const char*)tip, (const char*)freq); + log_msg << "(NAC "; + if (nac_ok) + log_msg << "def."; + else + log_msg << "provv."; + log_msg << ')'; // generazione del documento NAC dal contratto // ------------------------------------------- @@ -556,7 +659,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, 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 - const char provv = definitivo ? 'D' : 'P'; + const char provv = definitivo && nac_ok ? 'D' : 'P'; TDocumento nac(provv, anno, nac_codnum, 0); //num_doc = 0 perchè viene aggiornato in fase di registrazione nac.set_tipo(nac_tipo); @@ -761,7 +864,11 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente, log_msg << " -- Impossibile aggiornare contratto: errore " << err; } - log.log(0, log_msg); + if (err == NOERR) + log.log(nac_ok ? 1 : 0, log_msg); + else + log.log(2, log_msg); + log.log(0, ""); @@ -962,30 +1069,15 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat 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); - if (n_contratti > 0) { + TString8 key; key.format("C|%ld", codcf); + TString msg; msg << TR("Cliente") << ' ' << codcf << ' ' << cache().get(LF_CLIFO, key, CLI_RAGSOC); 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); - } - } } - if (contratti_cliente.items() > 0) + if (!contratti_cliente.empty()) { const TDate data_fine = mask.get(F_ADATA); @@ -1003,9 +1095,8 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat if (!contratti_cliente.empty()) 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 - const bool definitivo = mask.get_bool(F_DEFINITIVO); + // se elaborazione definitiva NON di nolo-> cambia lo stato ai documenti di vendita elaborati + const bool definitivo = mask.get_bool(F_DEFINITIVO) && ((tc & 0x8) == 0); if (definitivo && !documenti_cliente.empty()) { const TString4 stato_finale = ini_get_string(CONFIG_DITTA, "ha", "StatoFinFatt"); diff --git a/ha/ha0500a.uml b/ha/ha0500a.uml index 019f622bd..79e75607d 100755 --- a/ha/ha0500a.uml +++ b/ha/ha0500a.uml @@ -67,6 +67,7 @@ BEGIN PROMPT 22 4 "A data " CHECKTYPE REQUIRED VALIDATE DATE_CMP_FUNC >= F_DADATA + WARNING "Inserire una data successiva a quella iniziale" END GROUPBOX DLG_NULL 76 4