diff --git a/tp/tp0900.cpp b/tp/tp0900.cpp index a5780c03a..cd8f41fc1 100755 --- a/tp/tp0900.cpp +++ b/tp/tp0900.cpp @@ -2,15 +2,18 @@ #include #include -#include #include #include -#include +#include +#include #include #include +#include #include +#include "../ve/velib.h" + /////////////////////////////////////////////////////////// // MASCHERA /////////////////////////////////////////////////////////// @@ -67,7 +70,9 @@ class TDichiarazione_CONAI : public TSkeleton_application { protected: - void crea_csv(const TMask& mask) const; + void elabora(const TMask& mask) const; + void scrivi_csv(const TRectype& riga_generata, TDichiarazione_CONAI_csv_recordset& csv, + const int conai_specie) const; public: virtual bool create(); @@ -75,8 +80,99 @@ public: }; + +void TDichiarazione_CONAI::scrivi_csv(const TRectype& 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); + 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 + TDocumento doc('D', anno, codnum, numdoc); + + //scopre se il doc e' una NAC + const bool is_nac = doc.is_nota_credito(); + + const int nrighe = doc.rows(); + + //ciclo di creazione del distrib con le quote conai + for (int j = 1; j <= nrighe; j++) + { + const TRiga_documento& rdoc = doc[j]; + + //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()) + { + //quantita' totale conai (A + B) sul report + const real n = rdoc.calc_conai_qta(conai_specie); + qta_AB_conai.add(n, j); //va calcolato con il metodo apposito + + //quantita' assoggettata (B) sul report + agip.add(n); + } + } + + //ciclo di riempimento delle righe csv;scandisce solo l'array con i valori compilati + FOR_EACH_ARRAY_ROW(qta_AB_conai, i, obj) + { + const TRiga_documento& rdoc = doc[i]; + + //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()) + { + //creazione di un nuovo record da esportare + csv.new_rec(""); + + //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(rdoc.get(RDOC_NRIGA))); + + //codici conai + csv.set(4, TVariant(codagg1)); //codice materiale conai (es. carta, legno...) + csv.set(5, TVariant(codagg2)); //sottocodice materiale (es. carta imballo, busta...) + + //prezzo + const real prezzo = riga_generata.get_real(RDOC_PREZZO); //va preso dalla riga generata + csv.set(6, TVariant(prezzo)); + + //um conai + const TString4 umqta = cache().get("SPP", conai_codart, "S7"); //unita' di misura dalla tabella SPP + csv.set(7, TVariant(umqta)); + + //quantita' totale conai (A + B) sul report (le NAC hanno segno rovesciato) + real qta_tot_conai = (real&)qta_AB_conai[i]; + if (is_nac) + qta_tot_conai = -qta_tot_conai; + csv.set(8, TVariant(qta_tot_conai)); + + //quantita' assoggettata (B) sul report (le NAC hanno segno rovesciato) + real qta_assoggettata_conai = agip.get(); + if (is_nac) + qta_assoggettata_conai = -qta_assoggettata_conai; + csv.set(9, TVariant(qta_assoggettata_conai)); + + //quantita' esente conai (A) sul report + const real qta_esente_conai = qta_tot_conai - qta_assoggettata_conai; + csv.set(10, TVariant(qta_esente_conai)); + } + } +} + //metodo di base per la ricerca delle righe documento che soddisfano i parametri dell'utonto -void TDichiarazione_CONAI::crea_csv(const TMask& mask) const +void TDichiarazione_CONAI::elabora(const TMask& mask) const { //Tanto per cominciare stabilisce il range di date... const int anno = mask.get_int(F_ANNO); @@ -114,26 +210,33 @@ void TDichiarazione_CONAI::crea_csv(const TMask& mask) const TConfig ditta_ini(CONFIG_DITTA, "ve"); TVariant codart; + TString esenzione; switch (specie_conai) { - case 1: + case 0: codart = ditta_ini.get("CODACC"); //acciaio + esenzione = "ESACC"; + break; + case 1: + codart = ditta_ini.get("CODALL"); //alluminio + esenzione = "ESALL"; break; case 2: - codart = ditta_ini.get("CODALL"); //alluminio + codart = ditta_ini.get("CODCAR"); //carta + esenzione = "ESCAR"; break; case 3: - codart = ditta_ini.get("CODCAR"); //carta + codart = ditta_ini.get("CODPLA"); //plastica + esenzione = "ESPLA"; break; case 4: - codart = ditta_ini.get("CODPLA"); //plastica + codart = ditta_ini.get("CODLEG"); //legno + esenzione = "ESLEG"; break; case 5: - codart = ditta_ini.get("CODLEG"); //legno - break; - case 6: codart = ditta_ini.get("CODVET"); //vetro + esenzione = "ESVET"; break; default: break; @@ -143,14 +246,16 @@ void TDichiarazione_CONAI::crea_csv(const TMask& mask) const TSheet_field& sf = mask.sfield(F_TIPI); //la query e' sulle righe documento + //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 << "SELECT ((NUM(ANSI(33.DATADOC))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(33.DATADOC))<=NUM(ANSI(#ADATA))))&&(33.TIPODOC=#TIPODOC)&&(GENERATA=\"X\")\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"; - //crea il recordset ed assegna subito i valori delle variabili che restano costanti al cambio.. + //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 TISAM_recordset rdoc(query); @@ -161,7 +266,7 @@ void TDichiarazione_CONAI::crea_csv(const TMask& mask) const //creazione del csv recordset che verra' riempito dai record del recordset rdoc TDichiarazione_CONAI_csv_recordset csv; - const TString path = "C:/temp/cazzone.csv"; + const TString path = "C:/temp/cazzone.xls"; //quante righe dello sheet processa? const long tot_items = sf.items(); @@ -173,37 +278,28 @@ void TDichiarazione_CONAI::crea_csv(const TMask& mask) const rdoc.set_var("#CODNUM", TVariant(row->get(0))); rdoc.set_var("#TIPODOC", TVariant(row->get(2))); + //quanti record validi ha trovato? const long items = rdoc.items(); #ifdef DBG - warning_box("Hai trovato %ld righe bello!", items); + warning_box("Hai trovato %ld righe di %s! Ti sembrano abbastanza?", items, row->get(0)); #endif //E crea pure la progind.. - TProgind pi(tot_items, TR("Estrazione righe..."), true, true); + TProgind pi(tot_items, TR("Generazione righe..."), true, true); + //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); - //creazione di un nuovo record da esportare - csv.new_rec(""); - - csv.set(0, rdoc.get(RDOC_CODNUM)); - csv.set(1, rdoc.get(RDOC_ANNO)); - csv.set(2, rdoc.get(RDOC_NDOC)); - csv.set(3, rdoc.get(RDOC_NRIGA)); - csv.set(4, rdoc.get(RDOC_CODART)); - csv.set(5, rdoc.get(RDOC_PREZZO)); - csv.set(6, rdoc.get(RDOC_UMQTA)); - csv.set(7, rdoc.get(RDOC_QTA)); - } - - csv.save_as(path, fmt_text); - } - - + } //for(bool ok = rdoc.move_first(.. + + } //FOR_EACH... + csv.save_as(path, fmt_text); #ifdef DBG xvt_sys_goto_url(path, "open"); @@ -216,7 +312,7 @@ void TDichiarazione_CONAI::main_loop() TDichiarazione_CONAI_mask mask; while (mask.run() == K_ENTER) { - crea_csv(mask); + elabora(mask); } } diff --git a/tp/tp0900a.h b/tp/tp0900a.h index 6d625f00f..409ed14a8 100755 --- a/tp/tp0900a.h +++ b/tp/tp0900a.h @@ -11,4 +11,9 @@ #define F_TIPI 115 #define F_SPECIECONAI 116 +#define F_SOCIO 120 +#define F_UFFADD 121 +#define F_RESP 122 +#define F_PRODUT 123 + #endif diff --git a/tp/tp0900a.uml b/tp/tp0900a.uml index e646e4ce0..c91331414 100755 --- a/tp/tp0900a.uml +++ b/tp/tp0900a.uml @@ -42,6 +42,7 @@ STRING F_RAGSOC 60 BEGIN PROMPT 17 2 "" FLAGS "D" + FIELD #RAGSOC END GROUPBOX DLG_NULL 78 5 @@ -55,6 +56,7 @@ BEGIN ITEM "1|Annuale" MESSAGE HIDE,F_TRIMESTRE|HIDE,F_MESE ITEM "2|Trimestrale" MESSAGE SHOW,F_TRIMESTRE|HIDE,F_MESE ITEM "3|Mensile" MESSAGE HIDE,F_TRIMESTRE|SHOW,F_MESE + FIELD #PERIODO END NUMBER F_ANNO 4 @@ -62,6 +64,7 @@ BEGIN PROMPT 28 5 "Anno " HELP "Anno per cui effettuare la dichiarazione" CHECKTYPE REQUIRED + FIELD #ANNO END LIST F_MESE 15 @@ -69,6 +72,7 @@ BEGIN PROMPT 28 6 "Periodo " HELP "Mese per cui effettuare la dichiarazione" FLAGS "AM" + FIELD #MESE END LIST F_TRIMESTRE 15 @@ -79,6 +83,7 @@ BEGIN ITEM "6|2 Trimestre " ITEM "9|3 Trimestre " ITEM "12|4 Trimestre" + FIELD #TRIMESTRE END TEXT DLG_NULL @@ -86,7 +91,7 @@ BEGIN PROMPT 1 9 "@bNumerazioni e tipi documento da considerare" END -SPREADSHEET F_TIPI 0 5 +SPREADSHEET F_TIPI 0 4 BEGIN PROMPT 1 10 "" ITEM "Numerazione" @@ -97,16 +102,48 @@ END LIST F_SPECIECONAI 12 BEGIN - PROMPT 1 16 "@bSpecie CONAI da considerare" - ITEM "1|Acciaio " - ITEM "2|Alluminio " - ITEM "3|Carta " - ITEM "4|Plastica " - ITEM "5|Legno " - ITEM "6|Vetro " + PROMPT 1 15 "@bSpecie CONAI da considerare" + ITEM "0|Acciaio " + ITEM "1|Alluminio " + ITEM "2|Carta " + ITEM "3|Plastica " + ITEM "4|Legno " + ITEM "5|Vetro " HELP "Codice spesa per contributo CONAI" END +GROUPBOX DLG_NULL 78 5 +BEGIN + PROMPT 1 16 "@bDati Dichiarante" +END + +STRING F_SOCIO 6 +BEGIN + PROMPT 2 17 "Cod.Socio " + FIELD #SOCIO +END + +STRING F_UFFADD 12 +BEGIN + PROMPT 20 17 "Uff.Addetto " + FIELD #UFFADD +END + +STRING F_RESP 12 +BEGIN + PROMPT 48 17 "Responsabile " + FIELD #RESP +END + +RADIOBUTTON F_PRODUT 28 +BEGIN + PROMPT 2 18 "" + ITEM "1|Produttore" + ITEM "2|Utilizzatore" + FLAGS "Z" + FIELD #PRODUT +END + ENDPAGE ENDMASK