2008-02-15 11:45:52 +00:00
|
|
|
#include "tp0900a.h"
|
|
|
|
|
|
|
|
#include <applicat.h>
|
|
|
|
#include <automask.h>
|
|
|
|
#include <modaut.h>
|
|
|
|
#include <progind.h>
|
2008-02-20 10:55:10 +00:00
|
|
|
#include <recarray.h>
|
|
|
|
#include <relation.h>
|
2008-02-15 11:45:52 +00:00
|
|
|
#include <reputils.h>
|
2008-02-18 11:19:10 +00:00
|
|
|
#include <textset.h>
|
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
#include <doc.h>
|
2008-02-18 11:19:10 +00:00
|
|
|
#include <rdoc.h>
|
2008-02-15 11:45:52 +00:00
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
#include "../ve/velib.h"
|
|
|
|
|
2008-02-15 11:45:52 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// MASCHERA
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
class TDichiarazione_CONAI_mask : public TAutomask
|
|
|
|
{
|
|
|
|
protected:
|
|
|
|
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
|
|
|
|
|
|
|
|
public:
|
|
|
|
TDichiarazione_CONAI_mask();
|
|
|
|
virtual ~TDichiarazione_CONAI_mask() {}
|
|
|
|
};
|
|
|
|
|
|
|
|
TDichiarazione_CONAI_mask::TDichiarazione_CONAI_mask() : TAutomask("tp0900a")
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TDichiarazione_CONAI_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
|
|
|
|
{
|
|
|
|
switch (o.dlg())
|
|
|
|
{
|
|
|
|
case F_PERIODO:
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2008-02-18 11:19:10 +00:00
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
// CSV RECORDSET
|
|
|
|
/////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
class TDichiarazione_CONAI_csv_recordset : public TCSV_recordset
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
TDichiarazione_CONAI_csv_recordset();
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
TDichiarazione_CONAI_csv_recordset::TDichiarazione_CONAI_csv_recordset()
|
|
|
|
: TCSV_recordset("CSV(,)\n")
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-02-15 11:45:52 +00:00
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
// APPLICAZIONE
|
|
|
|
///////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
class TDichiarazione_CONAI : public TSkeleton_application
|
|
|
|
{
|
|
|
|
|
2008-02-15 15:39:20 +00:00
|
|
|
protected:
|
2008-02-20 10:55:10 +00:00
|
|
|
void elabora(const TMask& mask) const;
|
|
|
|
void scrivi_csv(const TRectype& riga_generata, TDichiarazione_CONAI_csv_recordset& csv,
|
|
|
|
const int conai_specie) const;
|
2008-02-15 15:39:20 +00:00
|
|
|
|
2008-02-15 11:45:52 +00:00
|
|
|
public:
|
|
|
|
virtual bool create();
|
|
|
|
virtual void main_loop();
|
|
|
|
|
|
|
|
};
|
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
|
|
|
|
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));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-02-15 15:39:20 +00:00
|
|
|
//metodo di base per la ricerca delle righe documento che soddisfano i parametri dell'utonto
|
2008-02-20 10:55:10 +00:00
|
|
|
void TDichiarazione_CONAI::elabora(const TMask& mask) const
|
2008-02-15 15:39:20 +00:00
|
|
|
{
|
|
|
|
//Tanto per cominciare stabilisce il range di date...
|
|
|
|
const int anno = mask.get_int(F_ANNO);
|
|
|
|
|
|
|
|
TDate dataini(1, 1, anno);
|
|
|
|
TDate datafin(31, 12, anno);
|
|
|
|
|
|
|
|
const int tipo_periodo = mask.get_int(F_PERIODO);
|
|
|
|
//se il periodo scelto non e' un anno intero...
|
|
|
|
switch (tipo_periodo)
|
|
|
|
{
|
|
|
|
case 2:
|
|
|
|
{
|
|
|
|
const int mese = mask.get_int(F_TRIMESTRE);
|
|
|
|
dataini.set_month(mese);
|
|
|
|
datafin = dataini;
|
|
|
|
datafin.addmonth(2);
|
|
|
|
datafin.set_end_month();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
{
|
|
|
|
const int mese = mask.get_int(F_MESE);
|
|
|
|
dataini.set_month(mese);
|
|
|
|
datafin = dataini;
|
|
|
|
datafin.set_end_month();
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Adesso tocca al codice articolo in base alla specie CONAI
|
|
|
|
const int specie_conai = mask.get_int(F_SPECIECONAI);
|
|
|
|
TConfig ditta_ini(CONFIG_DITTA, "ve");
|
|
|
|
|
|
|
|
TVariant codart;
|
2008-02-20 10:55:10 +00:00
|
|
|
TString esenzione;
|
2008-02-15 15:39:20 +00:00
|
|
|
|
|
|
|
switch (specie_conai)
|
|
|
|
{
|
2008-02-20 10:55:10 +00:00
|
|
|
case 0:
|
2008-02-15 15:39:20 +00:00
|
|
|
codart = ditta_ini.get("CODACC"); //acciaio
|
2008-02-20 10:55:10 +00:00
|
|
|
esenzione = "ESACC";
|
2008-02-15 15:39:20 +00:00
|
|
|
break;
|
2008-02-20 10:55:10 +00:00
|
|
|
case 1:
|
2008-02-15 15:39:20 +00:00
|
|
|
codart = ditta_ini.get("CODALL"); //alluminio
|
2008-02-20 10:55:10 +00:00
|
|
|
esenzione = "ESALL";
|
2008-02-15 15:39:20 +00:00
|
|
|
break;
|
2008-02-20 10:55:10 +00:00
|
|
|
case 2:
|
2008-02-15 15:39:20 +00:00
|
|
|
codart = ditta_ini.get("CODCAR"); //carta
|
2008-02-20 10:55:10 +00:00
|
|
|
esenzione = "ESCAR";
|
2008-02-15 15:39:20 +00:00
|
|
|
break;
|
2008-02-20 10:55:10 +00:00
|
|
|
case 3:
|
2008-02-15 15:39:20 +00:00
|
|
|
codart = ditta_ini.get("CODPLA"); //plastica
|
2008-02-20 10:55:10 +00:00
|
|
|
esenzione = "ESPLA";
|
2008-02-15 15:39:20 +00:00
|
|
|
break;
|
2008-02-20 10:55:10 +00:00
|
|
|
case 4:
|
2008-02-15 15:39:20 +00:00
|
|
|
codart = ditta_ini.get("CODLEG"); //legno
|
2008-02-20 10:55:10 +00:00
|
|
|
esenzione = "ESLEG";
|
2008-02-15 15:39:20 +00:00
|
|
|
break;
|
2008-02-20 10:55:10 +00:00
|
|
|
case 5:
|
2008-02-15 15:39:20 +00:00
|
|
|
codart = ditta_ini.get("CODVET"); //vetro
|
2008-02-20 10:55:10 +00:00
|
|
|
esenzione = "ESVET";
|
2008-02-15 15:39:20 +00:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
//Adesso prende le numerazioni e i tipi documento
|
|
|
|
TSheet_field& sf = mask.sfield(F_TIPI);
|
|
|
|
|
|
|
|
//la query e' sulle righe documento
|
2008-02-20 10:55:10 +00:00
|
|
|
//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)
|
2008-02-15 15:39:20 +00:00
|
|
|
TString query;
|
|
|
|
query << "USE RDOC KEY 5\n";
|
2008-02-20 10:55:10 +00:00
|
|
|
query << "SELECT (NUM(ANSI(33.DATADOC))>=NUM(ANSI(#DADATA)))&&(NUM(ANSI(33.DATADOC))<=NUM(ANSI(#ADATA)))&&(33.TIPODOC=#TIPODOC)&&(GENERATA=\"X\")\n";
|
2008-02-15 15:39:20 +00:00
|
|
|
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";
|
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
//crea il recordset principale relativo alle righe originali CONAI ed assegna subito i valori delle variabili che restano costanti al cambio..
|
2008-02-15 15:39:20 +00:00
|
|
|
//..numerazione/tipo: sono le date ed il codice articolo
|
|
|
|
TISAM_recordset rdoc(query);
|
|
|
|
|
|
|
|
rdoc.set_var("#ANNO", TVariant((long)anno));
|
|
|
|
rdoc.set_var("#DADATA", dataini);
|
|
|
|
rdoc.set_var("#ADATA", datafin);
|
|
|
|
rdoc.set_var("#CODART", codart);
|
|
|
|
|
2008-02-18 11:19:10 +00:00
|
|
|
//creazione del csv recordset che verra' riempito dai record del recordset rdoc
|
|
|
|
TDichiarazione_CONAI_csv_recordset csv;
|
2008-02-20 10:55:10 +00:00
|
|
|
const TString path = "C:/temp/cazzone.xls";
|
2008-02-18 11:19:10 +00:00
|
|
|
|
|
|
|
//quante righe dello sheet processa?
|
|
|
|
const long tot_items = sf.items();
|
|
|
|
|
2008-02-15 15:39:20 +00:00
|
|
|
//Visto che e' possibile avere una secchiata di numerazioni, gli tocca fare un giro per ogni numerazione
|
|
|
|
FOR_EACH_SHEET_ROW(sf, r, row)
|
|
|
|
{
|
2008-02-18 11:19:10 +00:00
|
|
|
//estrazione definitiva dei record che soddisfano il casino di parametri richiesti
|
2008-02-15 15:39:20 +00:00
|
|
|
rdoc.set_var("#CODNUM", TVariant(row->get(0)));
|
|
|
|
rdoc.set_var("#TIPODOC", TVariant(row->get(2)));
|
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
//quanti record validi ha trovato?
|
2008-02-15 15:39:20 +00:00
|
|
|
const long items = rdoc.items();
|
2008-02-18 11:19:10 +00:00
|
|
|
#ifdef DBG
|
2008-02-20 10:55:10 +00:00
|
|
|
warning_box("Hai trovato %ld righe di %s! Ti sembrano abbastanza?", items, row->get(0));
|
2008-02-18 11:19:10 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
//E crea pure la progind..
|
2008-02-20 10:55:10 +00:00
|
|
|
TProgind pi(tot_items, TR("Generazione righe..."), true, true);
|
2008-02-18 11:19:10 +00:00
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
//Scansione del recordset trovato
|
2008-02-18 11:19:10 +00:00
|
|
|
for (bool ok = rdoc.move_first(); ok; ok = rdoc.move_next())
|
|
|
|
{
|
|
|
|
if (!pi.addstatus(1))
|
|
|
|
break;
|
2008-02-20 10:55:10 +00:00
|
|
|
|
|
|
|
scrivi_csv(rdoc.cursor()->curr(), csv, specie_conai);
|
2008-02-18 11:19:10 +00:00
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
} //for(bool ok = rdoc.move_first(..
|
|
|
|
|
|
|
|
} //FOR_EACH...
|
2008-02-18 11:19:10 +00:00
|
|
|
|
2008-02-20 10:55:10 +00:00
|
|
|
csv.save_as(path, fmt_text);
|
2008-02-18 11:19:10 +00:00
|
|
|
|
|
|
|
#ifdef DBG
|
|
|
|
xvt_sys_goto_url(path, "open");
|
|
|
|
#endif
|
2008-02-15 15:39:20 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2008-02-15 11:45:52 +00:00
|
|
|
void TDichiarazione_CONAI::main_loop()
|
|
|
|
{
|
|
|
|
TDichiarazione_CONAI_mask mask;
|
|
|
|
while (mask.run() == K_ENTER)
|
|
|
|
{
|
2008-02-20 10:55:10 +00:00
|
|
|
elabora(mask);
|
2008-02-15 11:45:52 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool TDichiarazione_CONAI::create()
|
|
|
|
{
|
|
|
|
if (!has_module(DCAUT))
|
|
|
|
return error_box(TR("Modulo non autorizzato"));
|
|
|
|
|
|
|
|
return TSkeleton_application::create();
|
|
|
|
}
|
|
|
|
|
|
|
|
int tp0900(int argc, char* argv[])
|
|
|
|
{
|
|
|
|
TDichiarazione_CONAI dc;
|
|
|
|
dc.run(argc, argv, TR("Dichiarazione CONAI"));
|
|
|
|
return 0;
|
|
|
|
}
|