diff --git a/src/tp/tp0900.cpp b/src/tp/tp0900.cpp index a34f5a8e1..5832a29a2 100755 --- a/src/tp/tp0900.cpp +++ b/src/tp/tp0900.cpp @@ -98,13 +98,13 @@ protected: void elabora(const TMask& mask) const; bool scrivi_csv(const TRectype& prima_riga, TDichiarazione_CONAI_csv_recordset& csv, const TCONAI_class conai_specie, const TString & sottoclass, - const TString& conai_codart, TLog_report &log) const; + const TString& conai_codsp, TLog_report &log) const; void scrivi_csv_doc_con_riga_generata(const TDocumento& doc, const int n_riga_generata, TDichiarazione_CONAI_csv_recordset& csv, const TCONAI_class conai_specie, - const TString & sottoclass, TLog_report &log) const; - void scrivi_csv_doc_speciale(const TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, - const TCONAI_class conai_specie, const TString & sottoclass, - const TString& conai_codart) const; + const TString & sottoclass, const TString& conai_codsp, TLog_report &log) const; + void scrivi_csv_doc_rettifiche(const TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, + const TCONAI_class conai_specie, const TString & sottoclass, + const TString& conai_codsp) const; public: virtual bool create(); @@ -150,7 +150,7 @@ real TDichiarazione_CONAI::clifo_conai(const TCli_for& clifo, const TCONAI_class void TDichiarazione_CONAI::scrivi_csv_doc_con_riga_generata(const TDocumento& doc, const int n_riga_generata, TDichiarazione_CONAI_csv_recordset& csv, const TCONAI_class conai_specie, const TString & sottoclass, - TLog_report &log) const + const TString& conai_codsp, TLog_report &log) const { //prende dalla riga i dati che gli servono per fare vari calcoli const TRiga_documento& riga_generata = doc[n_riga_generata]; @@ -181,14 +181,20 @@ void TDichiarazione_CONAI::scrivi_csv_doc_con_riga_generata(const TDocumento& do FOR_EACH_PHYSICAL_RDOC(doc, j, rdoc) { //quantita' totale conai (A + B) sul report + for (int k = 1; k <= FR_CMAX; k++) { const TString4 sottocat = rdoc->get(conai_sottocat_name(k)); if (sottocat == sottoclass) { - const real n = rdoc->calc_conai_qta(k); + real n; + if (rdoc->is_merce()) + n = rdoc->calc_conai_qta(k); + else + if (rdoc->is_spese() && !rdoc->is_generata() && rdoc->get(RDOC_CODART) == conai_codsp) + n = rdoc->get_real(RDOC_QTA); if (!n.is_zero()) { real * q = (real *)qta_AB_conai.objptr(j); @@ -287,6 +293,7 @@ void TDichiarazione_CONAI::scrivi_csv_doc_con_riga_generata(const TDocumento& do csv.set(12, qta_esente_conai); //valore totale contributo (BxC) sul report + const real totale_contrib_conai = qta_assoggettata_conai * prezzo; csv.set(14, TVariant(totale_contrib_conai)); @@ -309,9 +316,9 @@ void TDichiarazione_CONAI::scrivi_csv_doc_con_riga_generata(const TDocumento& do //riempie recordset con le righe CONAI del documento che NON ha una riga generata CONAI; trattasi di documenti.. //..farlocchi costruiti ad arte per correggere le vaccate dei rompiscatolifici -void TDichiarazione_CONAI::scrivi_csv_doc_speciale(const TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, - const TCONAI_class conai_specie, const TString & sottoclass, - const TString& conai_codart) const +void TDichiarazione_CONAI::scrivi_csv_doc_rettifiche(const TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, + const TCONAI_class conai_specie, const TString & sottoclass, + const TString& conai_codsp) const { //scopre se il doc e' una NAC const bool is_nac = doc.is_nota_credito(); @@ -333,83 +340,99 @@ void TDichiarazione_CONAI::scrivi_csv_doc_speciale(const TDocumento& doc, TDichi for (int j = 1; j <= FR_CMAX; j++) { TString4 sottocat = rdoc->get(conai_sottocat_name(j)); - const real peso = rdoc->get_real(conai_peso_name(j)); - if (sottocat == sottoclass && (peso != ZERO)) + if (sottocat == sottoclass) { - //puo' capitare che la sottocategoria sia stata troncata alla categoria - if (sottocat.len() == 2) - sottocat << "99"; + real peso; + real prezzo; + const TRectype& spp = cache().get("SPP", conai_codsp); + + if (rdoc->is_merce()) + { + prezzo = spp.get_real("R10"); - //creazione di un nuovo record da esportare - csv.new_rec(""); + peso = rdoc->get_real(conai_peso_name(j)); + } + else + if (rdoc->is_spese() && !rdoc->is_generata() && rdoc->get(RDOC_CODART) == conai_codsp) + { + peso = rdoc->get_real(RDOC_QTA); + prezzo = rdoc->get_real(RDOC_PREZZO); //va preso dalla riga stessa + } + if (sottocat == sottoclass && (peso != ZERO)) + { + //puo' capitare che la sottocategoria sia stata troncata alla categoria + if (sottocat.len() == 2) + sottocat << "99"; - //riempie i campi del record del csv - //codnum-anno-ndoc-datadoc-codcli-cofi-nriga-codagg1-sottocat-prezzo-um-conai(AB)-conai(B)-conai(A) - //parte chiave della riga - csv.set(0, rdoc->get(RDOC_CODNUM)); - csv.set(1, TVariant(rdoc->get(RDOC_ANNO))); - csv.set(2, TVariant(rdoc->get(RDOC_NDOC))); - csv.set(3, TVariant(datadoc)); - csv.set(4, TVariant(clifo.codice())); - csv.set(5, TVariant(clifo_paiv)); - csv.set(6, TVariant(rdoc->get(RDOC_CODART))); - csv.set(7, TVariant(rdoc->get(RDOC_NRIGA))); + //creazione di un nuovo record da esportare + csv.new_rec(""); - //codici conai - csv.set(8, TVariant(sottocat.left(2))); //codice materiale conai (es. carta, legno...) - csv.set(9, TVariant(sottocat)); //sottocodice materiale (es. carta imballo, busta...) + //riempie i campi del record del csv + //codnum-anno-ndoc-datadoc-codcli-cofi-nriga-codagg1-sottocat-prezzo-um-conai(AB)-conai(B)-conai(A) + //parte chiave della riga + csv.set(0, rdoc->get(RDOC_CODNUM)); + csv.set(1, TVariant(rdoc->get(RDOC_ANNO))); + csv.set(2, TVariant(rdoc->get(RDOC_NDOC))); + csv.set(3, TVariant(datadoc)); + csv.set(4, TVariant(clifo.codice())); + csv.set(5, TVariant(clifo_paiv)); + csv.set(6, TVariant(rdoc->get(RDOC_CODART))); + csv.set(7, TVariant(rdoc->get(RDOC_NRIGA))); - const TRectype& spp = cache().get("SPP", conai_codart); - //prezzo - const real prezzo = spp.get("R10"); // rdoc.get_real(RDOC_PREZZO); //va preso dalla riga stessa - csv.set(10, TVariant(prezzo)); + //codici conai + csv.set(8, TVariant(sottocat.left(2))); //codice materiale conai (es. carta, legno...) + csv.set(9, TVariant(sottocat)); //sottocodice materiale (es. carta imballo, busta...) - //um conai - const TString4 umqta = spp.get("S7"); //unita' di misura dalla tabella SPP - csv.set(11, TVariant(umqta)); + //prezzo + csv.set(10, TVariant(prezzo)); - //quantita' totale conai (A + B) sul report (le NAC hanno segno rovesciato) - real qta_tot_conai = rdoc->get_real(RDOC_QTA); + //um conai + const TString4 umqta = spp.get("S7"); //unita' di misura dalla tabella SPP + csv.set(11, TVariant(umqta)); - qta_tot_conai *= rdoc->get_real(conai_peso_name(j)); - if (is_nac) - qta_tot_conai = -qta_tot_conai; - csv.set(15, TVariant(qta_tot_conai)); + //quantita' totale conai (A + B) sul report (le NAC hanno segno rovesciato) + real qta_tot_conai = rdoc->get_real(RDOC_QTA); - //percentuale di esenzione conai al 100%? - const real rdoc_perc_conai = rdoc->get_real(conai_esenzione_name(conai_specie, LF_RIGHEDOC)); // ex QTAGG2 + qta_tot_conai *= rdoc->get_real(conai_peso_name(j)); + if (is_nac) + qta_tot_conai = -qta_tot_conai; + csv.set(15, TVariant(qta_tot_conai)); - //quantita' assoggettata (B) sul report (le NAC hanno segno rovesciato, ma avendolo gia' gia' rovesciato.. - //..in precedenza non deve fare nulla!) - real qta_assoggettata_conai = qta_tot_conai; + //percentuale di esenzione conai al 100%? + const real rdoc_perc_conai = rdoc->get_real(conai_esenzione_name(conai_specie, LF_RIGHEDOC)); // ex QTAGG2 - //segnalazione Sirio 1767: nelle righe fatte a mano, se la % di esenzione sul cliente è 100% -> la qta_assoggettata_conai.. - //..viene azzerata; questo perchè la rdoc_perc_conai può non essere modificabile a mano (ponendola = 100) se il verig non.. - //..è personalizzato - if (rdoc_perc_conai >= CENTO || cfven_perc_conai >= CENTO) // Guy: Mi pare strano gestire solo il caso 100% - qta_assoggettata_conai = ZERO; + //quantita' assoggettata (B) sul report (le NAC hanno segno rovesciato, ma avendolo gia' gia' rovesciato.. + //..in precedenza non deve fare nulla!) + real qta_assoggettata_conai = qta_tot_conai; - csv.set(13, TVariant(qta_assoggettata_conai)); + //segnalazione Sirio 1767: nelle righe fatte a mano, se la % di esenzione sul cliente è 100% -> la qta_assoggettata_conai.. + //..viene azzerata; questo perchè la rdoc_perc_conai può non essere modificabile a mano (ponendola = 100) se il verig non.. + //..è personalizzato + if (rdoc_perc_conai >= CENTO || cfven_perc_conai >= CENTO) // Guy: Mi pare strano gestire solo il caso 100% + qta_assoggettata_conai = ZERO; - //quantita' esente conai (A) sul report - const real qta_esente_conai = qta_tot_conai - qta_assoggettata_conai; //deve essere sempre ZERO! - csv.set(12, TVariant(qta_esente_conai)); + csv.set(13, TVariant(qta_assoggettata_conai)); - //valore totale contributo (BxC) sul report - const real totale_contrib_conai = qta_assoggettata_conai * prezzo; - csv.set(14, TVariant(totale_contrib_conai)); + //quantita' esente conai (A) sul report + const real qta_esente_conai = qta_tot_conai - qta_assoggettata_conai; //deve essere sempre ZERO! + csv.set(12, TVariant(qta_esente_conai)); - //percentuale di esenzione conai - csv.set(16, TVariant(rdoc_perc_conai)); + //valore totale contributo (BxC) sul report + const real totale_contrib_conai = qta_assoggettata_conai * prezzo; + csv.set(14, TVariant(totale_contrib_conai)); - //percentuale di esenzione conai in cfven - csv.set(17, TVariant(cfven_perc_conai)); - TString descr = cache().get("&VESCC", sottocat, "S2"); + //percentuale di esenzione conai + csv.set(16, TVariant(rdoc_perc_conai)); - if (descr.blank()) - descr = cache().get("&VESCC", sottocat, "S0"); - csv.set(18, descr); + //percentuale di esenzione conai in cfven + csv.set(17, TVariant(cfven_perc_conai)); + TString descr = cache().get("&VESCC", sottocat, "S2"); + + if (descr.blank()) + descr = cache().get("&VESCC", sottocat, "S0"); + csv.set(18, descr); + } } } } @@ -420,26 +443,27 @@ void TDichiarazione_CONAI::scrivi_csv_doc_speciale(const TDocumento& doc, TDichi //..il metodo adatto bool TDichiarazione_CONAI::scrivi_csv(const TRectype& prima_riga, TDichiarazione_CONAI_csv_recordset& csv, const TCONAI_class conai_specie, const TString & sottoclass, - const TString& conai_codart, TLog_report &log) const + const TString& conai_codsp, TLog_report &log) const { //crea la testata delle righedoc per poter fare vari calcoli (e intanto il tempo se ne va...) const int anno = prima_riga.get_int(RDOC_ANNO); const TString4 codnum = prima_riga.get(RDOC_CODNUM); const long numdoc = prima_riga.get_long(RDOC_NDOC); - //documento della prima riga e quindi anche di tutte le altre righe conai +#ifdef DBG + //check di debug + if (numdoc == 1451) + const int cazzone = 1; + if (numdoc == 81L) + int i = 1; +#endif + //documento della prima riga e quindi anche di tutte le altre righe conai TDocumento doc('D', anno, codnum, numdoc); //controlli sul cliente const TCli_for& clifo = doc.clifor(); const bool addconai = clifo.vendite().get_bool(CFV_ADDCONAI); -#ifdef DBG - //check di debug - if (numdoc == 1451) - const int cazzone = 1; -#endif - //se il cliente non c'entra con il conai e' inutile perdere tempo! if (!addconai) return false; @@ -449,13 +473,13 @@ bool TDichiarazione_CONAI::scrivi_csv(const TRectype& prima_riga, TDichiarazione int n_riga_generata = 0; bool has_conai_row = false; - + FOR_EACH_PHYSICAL_RDOC_BACK(doc, j, rdoc) { if (rdoc->is_generata() && rdoc->get(RDOC_GENTIPO) == "C") has_conai_row = true; - //c'è la riga generata con codart di tipo conai (sia automatica che manuale)? - if (rdoc->get(RDOC_CODART) == conai_codart && (rdoc->is_spese() || rdoc->is_generata())) + //c'è la riga generata con codsp di tipo conai (sia automatica che manuale)? + if (rdoc->get(RDOC_CODART) == conai_codsp && (rdoc->is_spese() && rdoc->is_generata())) { n_riga_generata = j; break; @@ -482,7 +506,7 @@ bool TDichiarazione_CONAI::scrivi_csv(const TRectype& prima_riga, TDichiarazione FOR_EACH_PHYSICAL_RDOC_BACK(doc, j, rdoc) { //c'è la riga generata con codart di tipo conai (sia automatica che manuale)? - if (rdoc->get(RDOC_CODART) == conai_codart && (rdoc->is_spese() || rdoc->is_generata())) + if (rdoc->get(RDOC_CODART) == conai_codsp && (rdoc->is_spese() || rdoc->is_generata())) { n_riga_generata = j; break; @@ -490,11 +514,24 @@ bool TDichiarazione_CONAI::scrivi_csv(const TRectype& prima_riga, TDichiarazione } } } - if (n_riga_generata > 0) - scrivi_csv_doc_con_riga_generata(doc, n_riga_generata, csv, conai_specie, sottoclass, log); - else - scrivi_csv_doc_speciale(doc, csv, conai_specie, sottoclass, conai_codart); - + if (n_riga_generata > 0) + scrivi_csv_doc_con_riga_generata(doc, n_riga_generata, csv, conai_specie, sottoclass, conai_codsp, log); + else + { + bool has_rettifica = false; + + FOR_EACH_PHYSICAL_RDOC(doc, j, rdoc) + { + //c'è la riga generata con codart di tipo conai (sia automatica che manuale)? + if (rdoc->get(RDOC_CODART) == conai_codsp && !rdoc->is_generata()) + { + has_rettifica = true; + break; + } + } + if (has_rettifica) + scrivi_csv_doc_rettifiche(doc, csv, conai_specie, sottoclass, conai_codsp); + } return true; } @@ -728,7 +765,7 @@ void TDichiarazione_CONAI::elabora(const TMask& mask) const for (bool ok_scc = scc.move_first(); ok_scc; ok_scc = scc.move_next()) { TString sottoclass(scc.get("CODTAB").as_string()); - TString codart(scc.get("S1").as_string()); + TString codsp(scc.get("S1").as_string()); TString msg(str); msg << " - Sottocategoria " << sottoclass << ')'; @@ -746,7 +783,7 @@ void TDichiarazione_CONAI::elabora(const TMask& mask) const const long ndoc = rdoc.get(RDOC_NDOC).as_int(); if (ndoc != last_ndoc) { - scrivi_csv(rdoc.cursor()->curr(), *csv, conai_specie, sottoclass, codart, log); + scrivi_csv(rdoc.cursor()->curr(), *csv, conai_specie, sottoclass, codsp, log); last_ndoc = ndoc; } } //for(bool ok = rdoc.move_first(..