Files correlati : tp0.exe Ricompilazione Demo : [ ] Commento Nell' importazione bolle la composizione della carta veniva letta ma non piu' restitita alla funzione che la scriveva sulla descrizione aggiuntiva (era cambiato il tipo dell' oggetto, in relazione alle modifiche per la gestione nuova del CONAI) git-svn-id: svn://10.65.10.50/trunk@20543 c028cbd2-c16b-5b4b-a496-9718f37d4682
705 lines
22 KiB
C++
Executable File
705 lines
22 KiB
C++
Executable File
#include "tp0900a.h"
|
||
|
||
#include <applicat.h>
|
||
#include <automask.h>
|
||
#include <modaut.h>
|
||
#include <progind.h>
|
||
#include <recarray.h>
|
||
#include <relation.h>
|
||
#include <reprint.h>
|
||
#include <reputils.h>
|
||
#include <textset.h>
|
||
|
||
#include <cfven.h>
|
||
#include <clifo.h>
|
||
#include <doc.h>
|
||
#include <rdoc.h>
|
||
|
||
#include "../ve/velib.h"
|
||
#include "../ve/velib07.h"
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// 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_FIRM:
|
||
if (e == fe_init || e == fe_modify)
|
||
o.check(RUNNING_CHECK);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
return true;
|
||
}
|
||
|
||
/////////////////////////////////////////////////////////////
|
||
// REPORT
|
||
/////////////////////////////////////////////////////////////
|
||
class TDichiarazione_CONAI_report : public TReport
|
||
{
|
||
protected:
|
||
virtual bool use_mask() { return false; }
|
||
public:
|
||
TDichiarazione_CONAI_report() {}
|
||
};
|
||
|
||
/////////////////////////////////////////////////////////////
|
||
// CSV RECORDSET
|
||
/////////////////////////////////////////////////////////////
|
||
|
||
class TDichiarazione_CONAI_csv_recordset : public TCSV_recordset
|
||
{
|
||
protected:
|
||
//virtual const TVariant& get(const char* field_name) const;
|
||
public:
|
||
TDichiarazione_CONAI_csv_recordset();
|
||
};
|
||
|
||
TDichiarazione_CONAI_csv_recordset::TDichiarazione_CONAI_csv_recordset()
|
||
: TCSV_recordset("CSV(,)\n")
|
||
{}
|
||
|
||
|
||
///////////////////////////////////////////////////////////
|
||
// APPLICAZIONE
|
||
///////////////////////////////////////////////////////////
|
||
|
||
class TDichiarazione_CONAI : public TSkeleton_application
|
||
{
|
||
protected:
|
||
real clifo_conai(const TCli_for& clifo, const TCONAI_class conai_specie, TString& paiv) const;
|
||
void elabora(const TMask& mask) const;
|
||
void scrivi_csv(const TRectype& prima_riga, TDichiarazione_CONAI_csv_recordset& csv,
|
||
const TCONAI_class 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 TCONAI_class conai_specie) const;
|
||
void scrivi_csv_doc_speciale(TDocumento& doc, TDichiarazione_CONAI_csv_recordset& csv,
|
||
const TCONAI_class conai_specie, const TString& conai_codart) const;
|
||
|
||
public:
|
||
virtual bool create();
|
||
virtual void main_loop();
|
||
|
||
};
|
||
|
||
// Percentuale di esenzione CONAI di clifo
|
||
real TDichiarazione_CONAI::clifo_conai(const TCli_for& clifo, const TCONAI_class conai_specie, TString& paiv) const
|
||
{
|
||
const TRectype& cfven_rec = clifo.vendite();
|
||
real cfven_perces_conai = ZERO;
|
||
if (conai_configured_class(conai_specie))
|
||
cfven_perces_conai = cfven_rec.get_real(conai_esenzione_name(conai_specie, LF_CFVEN));
|
||
|
||
//nuovo metodo con logica rovesciata (fino al prossimo cambio di idea!)
|
||
paiv = clifo.get(CLI_COFI);
|
||
if (paiv.empty())
|
||
{
|
||
paiv = clifo.get(CLI_PAIV);
|
||
paiv << " (PI)";
|
||
}
|
||
|
||
return cfven_perces_conai;
|
||
}
|
||
|
||
//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 TCONAI_class conai_specie) const
|
||
{
|
||
//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)
|
||
|
||
//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
|
||
const TCli_for& clifo = doc.clifor();
|
||
TString16 clifo_paiv;
|
||
//cerca la percentuale di esenzione conai sul cliente (controllo)
|
||
const real cfven_perc_conai = clifo_conai(clifo, conai_specie, clifo_paiv);
|
||
|
||
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];
|
||
|
||
//quantita' totale conai (A + B) sul report
|
||
const real n = rdoc.calc_conai_qta(conai_specie);
|
||
|
||
if (n != ZERO)
|
||
{
|
||
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!!!!!
|
||
//se non e' stata definita la sottocategoria conai (maiali!!) va messa uguale a quella generica
|
||
TString4 sottocat = rdoc.get(conai_sottocat_name(conai_specie));
|
||
//puo' capitare che la sottocategoria sia stata troncata alla categoria
|
||
if (sottocat.len() == 2)
|
||
sottocat << "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-sottocat-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.codice()));
|
||
csv.set(5, TVariant(clifo_paiv));
|
||
csv.set(6, TVariant(rdoc.get(RDOC_CODART)));
|
||
csv.set(7, TVariant(rdoc.get(RDOC_NRIGA)));
|
||
|
||
//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...)
|
||
|
||
//prezzo
|
||
const real prezzo = riga_generata.get_real(RDOC_PREZZO); //va preso dalla riga generata
|
||
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 = (const real&)qta_AB_conai[i];
|
||
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)
|
||
real qta_assoggettata_conai = agip.get();
|
||
|
||
//se non trova un prezzo nella riga generata la % di esenzione CONAI e' 100
|
||
if (prezzo == ZERO)
|
||
{
|
||
//se trova la % di esenzione al 100 non puo' assoggettare conai!
|
||
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(12, TVariant(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));
|
||
|
||
//percentuale di esenzione conai
|
||
const TVariant rdoc_perc_conai = rdoc.get_real(conai_esenzione_name(conai_specie, LF_RIGHEDOC));
|
||
csv.set(16, rdoc_perc_conai);
|
||
|
||
//percentuale di esenzione conai in cfven
|
||
csv.set(17, TVariant(cfven_perc_conai));
|
||
}
|
||
}
|
||
|
||
//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 TCONAI_class 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
|
||
const TCli_for& clifo = doc.clifor();
|
||
TString16 clifo_paiv;
|
||
//cerca la percentuale di esenzione conai sul cliente (controllo)
|
||
const real cfven_perc_conai = clifo_conai(clifo, conai_specie, clifo_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];
|
||
|
||
//se non e' stata definita la sottocategoria conai (maiali!!) va messa uguale a quella generica
|
||
TString4 sottocat = rdoc.get(conai_sottocat_name(conai_specie));
|
||
//puo' capitare che la sottocategoria sia stata troncata alla categoria
|
||
if (sottocat.len() == 2)
|
||
sottocat << "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-sottocat-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.codice()));
|
||
csv.set(5, TVariant(clifo_paiv));
|
||
csv.set(6, TVariant(rdoc.get(RDOC_CODART)));
|
||
csv.set(7, TVariant(rdoc.get(RDOC_NRIGA)));
|
||
|
||
//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...)
|
||
|
||
//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 rdoc_perc_conai = rdoc.get_real(conai_esenzione_name(conai_specie, LF_RIGHEDOC)); // ex QTAGG2
|
||
|
||
//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;
|
||
|
||
if (rdoc_perc_conai >= CENTO) // Guy: Mi pare strano gestire solo il caso 100%
|
||
qta_assoggettata_conai = ZERO;
|
||
|
||
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 real totale_contrib_conai = qta_assoggettata_conai * prezzo;
|
||
csv.set(14, TVariant(totale_contrib_conai));
|
||
|
||
//percentuale di esenzione conai
|
||
csv.set(16, TVariant(rdoc_perc_conai));
|
||
|
||
//percentuale di esenzione conai in cfven
|
||
csv.set(17, TVariant(cfven_perc_conai));
|
||
}
|
||
}
|
||
|
||
|
||
//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 TCONAI_class 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);
|
||
|
||
//controlli sul cliente
|
||
const TCli_for& clifo = doc.clifor();
|
||
const bool addconai = clifo.vendite().get_bool(CFV_ADDCONAI);
|
||
|
||
//se il cliente non c'entra con il conai e' inutile perdere tempo!
|
||
if (addconai)
|
||
{
|
||
//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'<27> 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;
|
||
TToken_string& s2 = *(TToken_string*)*o2;
|
||
|
||
//deve ordinare sul campo sottocat = codice specie conai (campo 8)
|
||
const TString& c1 = s1.get(8);
|
||
const TString& c2 = s2.get(8);
|
||
|
||
int cmp = c1.compare(c2);
|
||
|
||
// sotto ordinamento per codice cliente (campo 4)
|
||
if (cmp == 0)
|
||
{
|
||
const TString& c1 = s1.get(4);
|
||
const TString& c2 = s2.get(4);
|
||
cmp = c1.compare(c2);
|
||
|
||
// sotto-sotto ordinamento per ndoc (campo 2)
|
||
if (cmp == 0)
|
||
{
|
||
const TString& c1 = s1.get(2);
|
||
const TString& c2 = s2.get(2);
|
||
cmp = c1.compare(c2);
|
||
}
|
||
}
|
||
|
||
return cmp;
|
||
}
|
||
|
||
static int compare_csv_rows_cofi(const TObject** o1, const TObject** o2)
|
||
{
|
||
TToken_string& s1 = *(TToken_string*)*o1;
|
||
TToken_string& s2 = *(TToken_string*)*o2;
|
||
|
||
//deve ordinare sul campo cofi/piva (campo 5)
|
||
const TString& c1 = s1.get(5);
|
||
const TString& c2 = s2.get(5);
|
||
int cmp = c1.compare(c2);
|
||
|
||
return cmp;
|
||
}
|
||
|
||
static int compare_csv_rows_datadoc(const TObject** o1, const TObject** o2)
|
||
{
|
||
TToken_string& s1 = *(TToken_string*)*o1;
|
||
TToken_string& s2 = *(TToken_string*)*o2;
|
||
|
||
//deve ordinare sul campo datadoc (campo 3)
|
||
const TDate c1 = s1.get(3);
|
||
const TDate c2 = s2.get(3);
|
||
int cmp = c1 - c2;
|
||
|
||
// sotto-sotto ordinamento per ndoc (campo 2)
|
||
if (cmp == 0)
|
||
{
|
||
const long c1 = s1.get_long(2);
|
||
const long c2 = s2.get_long(2);
|
||
cmp = c1 - c2;
|
||
}
|
||
|
||
return cmp;
|
||
}
|
||
|
||
//metodo di base per la ricerca delle righe documento che soddisfano i parametri dell'utonto
|
||
void TDichiarazione_CONAI::elabora(const TMask& mask) const
|
||
{
|
||
//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 - 2);
|
||
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 TCONAI_class conai_specie = (TCONAI_class)mask.get_int(F_SPECIECONAI);
|
||
TConfig ditta_ini(CONFIG_DITTA, "ve");
|
||
|
||
TVariant codart;
|
||
const char* nome_report = ""; //report di tipo 6.1 scelto in base alla specie conai
|
||
|
||
switch (conai_specie)
|
||
{
|
||
case CONAI_ACC:
|
||
codart = ditta_ini.get("CODACC"); //acciaio
|
||
nome_report = "tp0900ac.rep";
|
||
break;
|
||
case CONAI_ALL:
|
||
codart = ditta_ini.get("CODALL"); //alluminio
|
||
nome_report = "tp0900al.rep";
|
||
break;
|
||
case CONAI_CAR:
|
||
codart = ditta_ini.get("CODCAR"); //carta
|
||
nome_report = "tp0900ca.rep";
|
||
break;
|
||
case CONAI_PLA:
|
||
codart = ditta_ini.get("CODPLA"); //plastica
|
||
nome_report = "tp0900pl.rep";
|
||
break;
|
||
case CONAI_LEG:
|
||
codart = ditta_ini.get("CODLEG"); //legno
|
||
nome_report = "tp0900le.rep";
|
||
break;
|
||
case CONAI_VET:
|
||
codart = ditta_ini.get("CODVET"); //vetro
|
||
nome_report = "tp0900ve.rep";
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
//In caso il tipo stampa NON sia con il modello 6.1 basato sulla specie conai ma di tipo 6.3 basato sui..
|
||
//fornitori e le loro esenzioni, oppure l'allegato del 6.1 il report va rinominato perche' e' unico
|
||
const int tipostampa = mask.get_int(F_TIPOSTAMPA);
|
||
switch (tipostampa)
|
||
{
|
||
case 1:
|
||
break; //se modello 6.1 va bene quello che ha stabilito nel precedente switch
|
||
case 2:
|
||
nome_report = "tp0900sc.rep"; //scheda elenco fatture allegata al 6.1
|
||
break;
|
||
case 3:
|
||
nome_report = "tp0900es.rep"; //modello 6.3 quantita' in esenzione
|
||
break;
|
||
case 4:
|
||
nome_report = "tp0900li.rep"; //lista clienti in esenzione
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
|
||
//Adesso prende le numerazioni e i tipi documento
|
||
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;
|
||
TString scat_fieldname(conai_sottocat_name(conai_specie));
|
||
|
||
if (scat_fieldname.blank())
|
||
return;
|
||
|
||
scat_fieldname.insert("RG1:");
|
||
|
||
query << "USE RDOC\n";
|
||
query << "SELECT BETWEEN(33.DATADOC,#DADATA,#ADATA)&&(33.TIPODOC==#TIPODOC)&&(" << scat_fieldname <<"!=\"\")\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
|
||
TDocument_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);
|
||
|
||
//creazione del csv recordset che verra' riempito dai record del recordset rdoc
|
||
TDichiarazione_CONAI_csv_recordset* csv = new TDichiarazione_CONAI_csv_recordset;
|
||
|
||
//quante righe dello sheet processa?
|
||
const long tot_items = sf.items();
|
||
|
||
//Visto che e' possibile avere una secchiata di numerazioni, gli tocca fare un giro per ogni numerazione
|
||
FOR_EACH_SHEET_ROW(sf, r, row)
|
||
{
|
||
//estrazione definitiva dei record che soddisfano il casino di parametri richiesti
|
||
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 di %s! Ti sembrano abbastanza?", items, row->get(0));
|
||
#endif*/
|
||
|
||
//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;
|
||
|
||
const long ndoc = rdoc.get(RDOC_NDOC).as_int();
|
||
if (ndoc != last_ndoc)
|
||
{
|
||
scrivi_csv(rdoc.cursor()->curr(), *csv, conai_specie, codart.as_string());
|
||
last_ndoc = ndoc;
|
||
}
|
||
|
||
} //for(bool ok = rdoc.move_first(..
|
||
|
||
} //FOR_EACH...
|
||
|
||
//riordinamento del file secondo il tipo di stampa selezionato:
|
||
switch (tipostampa)
|
||
{
|
||
case 1:
|
||
csv->sort(compare_csv_rows_specie); //Mod.6.1: specie conai, codice cliente, numero documento
|
||
break;
|
||
case 2:
|
||
csv->sort(compare_csv_rows_datadoc); //Allegato 6.1: datadoc
|
||
break;
|
||
case 3:
|
||
csv->sort(compare_csv_rows_cofi); //Mod.6.3: piva e cofi
|
||
break;
|
||
case 4:
|
||
csv->sort(compare_csv_rows_cofi); //Lista clienti in esenzione: piva e cofi
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
|
||
//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");
|
||
csv->set(16, "INDETDOC");
|
||
csv->set(17, "INDETCLI");
|
||
|
||
TFilename path = mask.get(F_PATH);
|
||
path.lower();
|
||
if (path.ends_with("xls") || path.ends_with("slk"))
|
||
csv->save_as(path, fmt_html);
|
||
else
|
||
csv->save_as(path);
|
||
|
||
//accoppa la riga con le intestazioni dei campi
|
||
csv->destroy(0);
|
||
|
||
#ifdef DBG
|
||
xvt_sys_goto_url(path, "open");
|
||
#endif
|
||
}
|
||
|
||
//creazione del report di stampa
|
||
TDichiarazione_CONAI_report rep;
|
||
bool ok = rep.load(nome_report);
|
||
|
||
if (ok)
|
||
{
|
||
//setta il recordset...
|
||
//deve settare almeno un campo manualmente perche' funzioni la mask2report
|
||
csv->set_var("#EMAIL", TVariant("Manca la email"), true);
|
||
rep.set_recordset(csv);
|
||
//..e poi carica i valori sulla maschera nel report!!!!
|
||
rep.mask2report(mask);
|
||
|
||
TReport_book book;
|
||
ok = book.add(rep);
|
||
if (ok)
|
||
book.print_or_preview();
|
||
}
|
||
}
|
||
|
||
void TDichiarazione_CONAI::main_loop()
|
||
{
|
||
TDichiarazione_CONAI_mask mask;
|
||
|
||
while (mask.run() == K_ENTER)
|
||
{
|
||
elabora(mask);
|
||
}
|
||
}
|
||
|
||
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;
|
||
} |