From db0ffb58f141868b3f245777af41d7108f54d932 Mon Sep 17 00:00:00 2001 From: luca Date: Tue, 26 Feb 2008 15:40:14 +0000 Subject: [PATCH] Patch level :4.0 /10.0 Files correlati : Ricompilazione Demo : [ ] Commento :conai in corso d'opera git-svn-id: svn://10.65.10.50/trunk@16220 c028cbd2-c16b-5b4b-a496-9718f37d4682 --- tp/tp0900.cpp | 229 +++++++++++++++++++++++++++++++++++++++++++----- tp/tp0900ca.rep | 165 +++++++++++++++++++++++++--------- 2 files changed, 329 insertions(+), 65 deletions(-) diff --git a/tp/tp0900.cpp b/tp/tp0900.cpp index d62fcba67..7af1bf1a1 100755 --- a/tp/tp0900.cpp +++ b/tp/tp0900.cpp @@ -81,8 +81,12 @@ class TDichiarazione_CONAI : public TSkeleton_application protected: void elabora(const TMask& mask) const; - void scrivi_csv(const TRectype& riga_generata, TDichiarazione_CONAI_csv_recordset& csv, - const int conai_specie) const; + void scrivi_csv(const TRectype& prima_riga, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) const; + void scrivi_csv_doc_con_riga_generata(TDocumento& doc, const int n_riga_generata, + TDichiarazione_CONAI_csv_recordset& csv, const int conai_specie) const; + void scrivi_csv_doc_speciale(TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) const; public: virtual bool create(); @@ -91,22 +95,18 @@ public: }; -void TDichiarazione_CONAI::scrivi_csv(const TRectype& riga_generata, TDichiarazione_CONAI_csv_recordset& csv, +//riempie recordset con le righe CONAI del documento che contiene una riga generata CONAI +void TDichiarazione_CONAI::scrivi_csv_doc_con_riga_generata(TDocumento& doc, const int n_riga_generata, TDichiarazione_CONAI_csv_recordset& csv, const int conai_specie) const { - //crea la testata delle righedoc per poter fare vari calcoli (e intanto il tempo se ne va...) - const int anno = riga_generata.get_int(RDOC_ANNO); - const TString4 codnum = riga_generata.get(RDOC_CODNUM); - const long numdoc = riga_generata.get_long(RDOC_NDOC); + //prende dalla riga i dati che gli servono per fare vari calcoli + const TRiga_documento& riga_generata = doc[n_riga_generata]; const TString80 conai_codart = riga_generata.get(RDOC_CODART); //questo ci serve per trovare le righe conai const real totale_qta_assogg = riga_generata.get_real(RDOC_QTA); //questo ci serve per le quantita' assoggetate o no TGeneric_distrib agip(totale_qta_assogg, 5); //distrib per ridistribuire le % dei quantitativi assoggetati TArray qta_AB_conai; //array con le quantita' conai totali (A+B) - //documento della riga generata, e quindi anche di tutte le altre righe conai - TDocumento doc('D', anno, codnum, numdoc); - //scopre se il doc e' una NAC const bool is_nac = doc.is_nota_credito(); @@ -129,9 +129,8 @@ void TDichiarazione_CONAI::scrivi_csv(const TRectype& riga_generata, TDichiarazi //servono SOLO le righe CONAI!!!!! const TString& codagg1 = rdoc.get(RDOC_CODAGG1); - const TString& codagg2 = rdoc.get(RDOC_CODAGG2); - if (codagg1 == conai_codart && codagg2.full()) + if (codagg1 == conai_codart) { //quantita' totale conai (A + B) sul report const real n = rdoc.calc_conai_qta(conai_specie); @@ -149,10 +148,17 @@ void TDichiarazione_CONAI::scrivi_csv(const TRectype& riga_generata, TDichiarazi //servono SOLO le righe CONAI!!!!! const TString& codagg1 = rdoc.get(RDOC_CODAGG1); - const TString& codagg2 = rdoc.get(RDOC_CODAGG2); - if (codagg1 == conai_codart && codagg2.full()) + if (codagg1 == conai_codart) { + //se non e' stata definita la sottocategoria conai (maiali!!) va messa uguale a quella generica + TString4 codagg2 = rdoc.get(RDOC_CODAGG2); + if (codagg2.empty()) + codagg2 = codagg1; + //puo' capitare che la sottocategoria sia stata troncata alla categoria + if (codagg2 == codagg1) + codagg2 << "99"; + //creazione di un nuovo record da esportare csv.new_rec(""); @@ -174,7 +180,7 @@ void TDichiarazione_CONAI::scrivi_csv(const TRectype& riga_generata, TDichiarazi //prezzo const real prezzo = riga_generata.get_real(RDOC_PREZZO); //va preso dalla riga generata - csv.set(10, TVariant(prezzo)); + csv.set(10, TVariant(prezzo)); //um conai const TString4 umqta = cache().get("SPP", conai_codart, "S7"); //unita' di misura dalla tabella SPP @@ -184,25 +190,164 @@ void TDichiarazione_CONAI::scrivi_csv(const TRectype& riga_generata, TDichiarazi real qta_tot_conai = (real&)qta_AB_conai[i]; if (is_nac) qta_tot_conai = -qta_tot_conai; - csv.set(12, TVariant(qta_tot_conai)); + csv.set(15, TVariant(qta_tot_conai)); + + //percentuale di esenzione conai al 100%? + const real perc = rdoc.get_real(RDOC_QTAGG2); //quantita' assoggettata (B) sul report (le NAC hanno segno rovesciato) real qta_assoggettata_conai = agip.get(); + + if (perc == CENTO) + qta_assoggettata_conai = ZERO; + if (is_nac) qta_assoggettata_conai = -qta_assoggettata_conai; csv.set(13, TVariant(qta_assoggettata_conai)); //quantita' esente conai (A) sul report const real qta_esente_conai = qta_tot_conai - qta_assoggettata_conai; - csv.set(14, TVariant(qta_esente_conai)); + csv.set(12, TVariant(qta_esente_conai)); //valore totale contributo (BxC) sul report - const real totale_contrib_conai = qta_assoggettata_conai * prezzo; - csv.set(15, TVariant(totale_contrib_conai)); + const TCurrency totale_contrib_conai = qta_assoggettata_conai * prezzo; + csv.set(14, TVariant(totale_contrib_conai.get_num())); } } } +//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(TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) const +{ + //scopre se il doc e' una NAC + const bool is_nac = doc.is_nota_credito(); + + //prende la data del documento + const TDate& datadoc = doc.data(); + + //prende il cliente ed i suoi dati + TCli_for clifo = doc.clifor(); + const long clifo_cod = clifo.codice(); + TString16 clifo_cofi = clifo.get(CLI_COFI); + if (clifo_cofi.empty()) + clifo_cofi = clifo.get(CLI_PAIV); + + const int nrighe = doc.rows(); + + //ciclo di riempimento delle righe csv;scandisce solo l'array con i valori compilati + for (int i = 1; i <= nrighe; i++) + { + const TRiga_documento& rdoc = doc[i]; + + //servono SOLO le righe CONAI!!!!! + const TString& codagg1 = rdoc.get(RDOC_CODAGG1); + + if (codagg1 == conai_codart) + { + //se non e' stata definita la sottocategoria conai (maiali!!) va messa uguale a quella generica + TString4 codagg2 = rdoc.get(RDOC_CODAGG2); + if (codagg2.empty()) + codagg2 = codagg1; + //puo' capitare che la sottocategoria sia stata troncata alla categoria + if (codagg2 == codagg1) + codagg2 << "99"; + + //creazione di un nuovo record da esportare + csv.new_rec(""); + + //riempie i campi del record del csv + //codnum-anno-ndoc-datadoc-codcli-cofi-nriga-codagg1-codagg2-prezzo-um-conai(AB)-conai(B)-conai(A) + //parte chiave della riga + csv.set(0, TVariant(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_cod)); + csv.set(5, TVariant(clifo_cofi)); + csv.set(6, TVariant(rdoc.get(RDOC_CODART))); + csv.set(7, TVariant(rdoc.get(RDOC_NRIGA))); + + //codici conai + csv.set(8, TVariant(codagg1)); //codice materiale conai (es. carta, legno...) + csv.set(9, TVariant(codagg2)); //sottocodice materiale (es. carta imballo, busta...) + + //prezzo + const real prezzo = rdoc.get_real(RDOC_PREZZO); //va preso dalla riga stessa + csv.set(10, TVariant(prezzo)); + + //um conai + const TString4 umqta = cache().get("SPP", conai_codart, "S7"); //unita' di misura dalla tabella SPP + csv.set(11, TVariant(umqta)); + + //quantita' totale conai (A + B) sul report (le NAC hanno segno rovesciato) + real qta_tot_conai = rdoc.get_real(RDOC_QTA); + if (is_nac) + qta_tot_conai = -qta_tot_conai; + csv.set(15, TVariant(qta_tot_conai)); + + //percentuale di esenzione conai al 100%? + const real perc = rdoc.get_real(RDOC_QTAGG2); + + //quantita' assoggettata (B) sul report (le NAC hanno segno rovesciato) + real qta_assoggettata_conai = qta_tot_conai; + + if (perc == CENTO) + qta_assoggettata_conai = ZERO; + + if (is_nac) + qta_assoggettata_conai = -qta_assoggettata_conai; + csv.set(13, TVariant(qta_assoggettata_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)); + + //valore totale contributo (BxC) sul report + const TCurrency totale_contrib_conai = qta_assoggettata_conai * prezzo; + csv.set(14, TVariant(totale_contrib_conai.get_num())); + } + } +} + + +//crea il documento che contiene la riga che gli viene passata,cerca la riga generata ed in base al risultato della ricerca chiama.. +//..il metodo adatto +void TDichiarazione_CONAI::scrivi_csv(const TRectype& prima_riga, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie, const TString& conai_codart) 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 + TDocumento doc('D', anno, codnum, numdoc); + + //cerca la riga generata (in tal caso e' un documento con righe CONAI giuste) + const int nrighe = doc.rows(); + + int n_riga_generata = 0; + for (int j = 1; j <= nrighe; j++) + { + const TRiga_documento& rdoc = doc[j]; + //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())) + { + n_riga_generata = j; + break; + } + } + + if (n_riga_generata > 0) + scrivi_csv_doc_con_riga_generata(doc, n_riga_generata, csv, conai_specie); + else + scrivi_csv_doc_speciale(doc, csv, conai_specie, conai_codart); + +} + + static int compare_csv_rows_specie(const TObject** o1, const TObject** o2) { TToken_string& s1 = *(TToken_string*)*o1; @@ -329,11 +474,17 @@ void TDichiarazione_CONAI::elabora(const TMask& mask) const //cerca le righe con numerazione e tipo indicate nello sheet;prende sia le righe che generano CONAI (per avere il codice conai,.. //..le quantita' etc) e le righe generate da CONAI (per avere i prezzi) TString query; - query << "USE RDOC KEY 5\n"; +/* query << "USE RDOC KEY 5\n"; query << "SELECT (NUM(ANSI(33.DATADOC))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(33.DATADOC))<=NUM(ANSI(#ADATA)))&&(33.TIPODOC=#TIPODOC)&&(GENERATA=\"X\")\n"; query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n"; query << "FROM CODART=#CODART ANNO=#ANNO CODNUM=#CODNUM PROVV=\"D\"\n"; - query << "TO CODART=#CODART ANNO=#ANNO CODNUM=#CODNUM PROVV=\"D\"\n"; + query << "TO CODART=#CODART ANNO=#ANNO CODNUM=#CODNUM PROVV=\"D\"\n";*/ + + query << "USE RDOC KEY 1\n"; + query << "SELECT (NUM(ANSI(33.DATADOC))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(33.DATADOC))<=NUM(ANSI(#ADATA)))&&(33.TIPODOC=#TIPODOC)&&(CODAGG1=#CODART)\n"; + query << "JOIN DOC INTO PROVV==PROVV ANNO==ANNO CODNUM==CODNUM NDOC==NDOC\n"; + query << "FROM CODNUM=#CODNUM ANNO=#ANNO PROVV=\"D\"\n"; + query << "TO CODNUM=#CODNUM ANNO=#ANNO PROVV=\"D\"\n"; //crea il recordset principale relativo alle righe originali CONAI ed assegna subito i valori delle variabili che restano costanti al cambio.. //..numerazione/tipo: sono le date ed il codice articolo @@ -366,16 +517,23 @@ void TDichiarazione_CONAI::elabora(const TMask& mask) const //E crea pure la progind.. TProgind pi(tot_items, TR("Generazione righe..."), true, true); + long last_ndoc = 0; + //Scansione del recordset trovato for (bool ok = rdoc.move_first(); ok; ok = rdoc.move_next()) { if (!pi.addstatus(1)) break; - - scrivi_csv(rdoc.cursor()->curr(), *csv, specie_conai); + + const long ndoc = rdoc.get(RDOC_NDOC).as_int(); + if (ndoc != last_ndoc) + { + scrivi_csv(rdoc.cursor()->curr(), *csv, specie_conai, codart.as_string()); + last_ndoc = ndoc; + } } //for(bool ok = rdoc.move_first(.. - + } //FOR_EACH... //riordinamento del file secondo: @@ -390,8 +548,31 @@ void TDichiarazione_CONAI::elabora(const TMask& mask) const //se richiesto il file in formato excel... if (mask.get_bool(F_EXCEL)) { + //crea la riga con le intestazioni dei campi e la mette all'inizio + csv->insert_rec(0); + //riempie i campi del primo record del csv in modo da avere l'intestazione + csv->set(0, "CODNUM"); + csv->set(1, "ANNO"); + csv->set(2, "NDOC"); + csv->set(3, "DATADOC"); + csv->set(4, "CODCLI"); + csv->set(5, "COFICLI"); + csv->set(6, "CODART"); + csv->set(7, "NRIGA"); + csv->set(8, "CLASSE"); + csv->set(9, "SOTTOCL"); + csv->set(10, "PREZZO"); + csv->set(11, "UM"); + csv->set(12, "CONAI A"); + csv->set(13, "CONAI B"); + csv->set(14, "CONAI BxC"); + csv->set(15, "CONAI A+B"); + const TString path = mask.get(F_PATH); csv->save_as(path, fmt_text); + + //accoppa la riga con le intestazioni dei campi + csv->destroy(0); /*#ifdef DBG xvt_sys_goto_url(path, "open"); diff --git a/tp/tp0900ca.rep b/tp/tp0900ca.rep index 7aaff4883..1c09342d6 100755 --- a/tp/tp0900ca.rep +++ b/tp/tp0900ca.rep @@ -66,10 +66,19 @@ + + #THIS ! + + + +
@@ -99,121 +115,121 @@ #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! @@ -226,92 +242,159 @@ - + #310 @ #210 @ F; #THIS ! - - #3000 @ -#THIS ! - - + #320 @ #220 @ F; #THIS ! - + #330 @ #230 @ F; #THIS ! - + #340 @ #240 @ F; #THIS ! - + #350 @ #250 @ F; #THIS ! - + #360 @ #260 @ F; #THIS ! - + #370 @ #270 @ F; #THIS ! - + #380 @ #280 @ F; #THIS ! - + #390 @ #290 @ F; #THIS ! - + #399 @ #299 @ F; +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #THIS @ +1000 F; +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! #THIS @ 1000 F; -2 ROUND +3 ROUND #THIS ! - + - + - #340 @ + #340 @ #240 @ F; +#THIS ! + + + + #THIS @ +1000 F; +3 ROUND +#THIS ! + + + #3000 @ #THIS !