campo-sirio/ha/hacnv200.cpp
luca 36af44eb2d Patch level : ha1076
Files correlati     : ha0 ha1
Ricompilazione Demo : [ ]
Commento            :
Modifiche richieste da Roberto per ocnto di hardy


git-svn-id: svn://10.65.10.50/branches/R_10_00@22411 c028cbd2-c16b-5b4b-a496-9718f37d4682
2011-09-12 11:09:22 +00:00

888 lines
29 KiB
C++
Executable File

#include "halib.h"
#include "hacnvlib.h"
#include "hacnv200a.h"
#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <execp.h>
#include <progind.h>
#include <reprint.h>
#include <reputils.h>
#include <tabutil.h>
#include <utility.h>
#include <causali.h>
#include <pconti.h>
#include <mov.h>
#include <rmov.h>
#include <rmoviva.h>
#include <rcausali.h>
const char* const APPNAME = TR("Conversione movimenti");
///////////////////////////////////////////////////////////
// Movimenti
///////////////////////////////////////////////////////////
class THardy_movimenti : public THardy_transfer
{
int _anno; // parametri per la query
TDate _dadata, _adata; // parametri per la query
TConfig* _conf; // ini in compilazione
long _kmovcont; // movimento contabile in esame
TArray* _righeiva; // array dele righe iva hardy
TArray* _righecont; // array delle righe contabili hardy
TAssoc_array* _ivaind; // array dei codici iva con % di indetraibilità
TAssoc_array* _ivaoma; // array dei codici iva per gli omaggi
protected:
bool scrivi_righe();
bool scrivi_righecont();
bool test_movcont();
bool conto_is_costoricavo(const int gr);
bool test_moviva();
void conto2campo(const TString& hd_tipoc, const TString& hd_key, TString4& tipoc, int& gr, int& co, long& so);
void rec2ini(const TRectype& rec);
void recset2rec(const TODBC_recordset& recset, TRectype& rec, const TString_array& lista_campi);
real get_imponibile(const TRectype& rec);
public:
virtual bool trasferisci();
THardy_movimenti(const int anno, const TDate dadata, const TDate adata);
};
// carica il record campo con il record hardy in base alla configurazione
void THardy_movimenti::recset2rec(const TODBC_recordset& recset, TRectype& rec, const TString_array& lista_campi)
{
TString campo_dest, campo_orig, valore, str;
FOR_EACH_ARRAY_ROW(lista_campi,i,row)
{
row->get(0, campo_dest);
row->get(1, campo_orig);
if (campo_orig.full())
{
if (campo_orig[0] == '_')
{
if (campo_orig.starts_with("_SCONTO")) // è uno sconto (ca..o!)
{
valore.cut(0);
real sconto;
TString8 field;
for (int i = 1; i < 6; i++)
{
field.format("Sconto%1d",i);
sconto = get_real(field);
sconto.round(2);
if (sconto != ZERO)
{
valore << sconto.string();
valore << "+";
}
}
if (valore.len()>0)
valore = valore.left(valore.len()-1);
} else
if (campo_orig.starts_with("_REAL")) // è un real
{
const TString80 campo = campo_orig.after(',');
real r = recset.get(campo).as_real();
valore = r.string();
} else
if (campo_orig.starts_with("_ROUND")) // arrotondo a due decimali
{
const TString80 campo = campo_orig.after(',');
real contenuto = recset.get(campo).as_real();
contenuto.round(2);
valore = contenuto.string();
} else
if (campo_orig.starts_with("_FISSO")) // valore fisso indicato in configurazione
{
valore = campo_orig.after(',');
valore.trim();
} else
if (campo_orig.starts_with("_STREXPR")) // formato _STREXPR, espressione
{
TExpression expr(campo_orig.after(','), _strexpr);
for (int v = 0; v < expr.numvar(); v++)
{
const char* varname = expr.varname(v);
expr.setvar(v, recset.get(varname).as_string());
}
valore = expr.as_string();
valore.trim();
} else
if (campo_orig.starts_with("_TAB")) // formato _TAB,<tabella da leggere>,<valore CODTAB>, <campo da leggere>
{
TToken_string elabora(campo_orig, ',');
const TString4 tab = elabora.get(1); // tabella da leggere
const TString16 codtab = recset.get(elabora.get()).as_string();
const TString16 campotab = elabora.get();
valore = cache().get(tab, codtab, campotab);
} else
if (campo_orig.starts_with("_TRADUCI"))
{
const TString80 campo = campo_orig.after(',');
const TString80 contenuto = recset.get(campo).as_string();
TConfig& ini = config();
valore = ini.get(contenuto,campo);
}
else
valore.cut(0);
}
else
valore = recset.get(campo_orig).as_string();
rec.put(campo_dest, valore);
}
}
}
// calcola conto campo a partire da conto hardy
void THardy_movimenti::conto2campo(const TString& hd_tipoc, const TString& hd_key, TString4& tipoc, int& gr, int& co, long& so)
{
TConfig& ini = config();
char tipocc = hd_tipoc[0];
switch (tipocc)
{
case 'S':
{
tipoc = " ";
hd_key2conto(hd_key, gr, co, so);
}
break;
case 'C':
{
tipoc = "C";
so = hd_key2cli(hd_key);
TToken_string key(tipoc);
key.add(so);
const TRectype rec_cf = cache().get(LF_CLIFO, key);
gr = rec_cf.get_int(CLI_GRUPPO);
co = rec_cf.get_int(CLI_CONTO);
if (gr == 0)
{
gr = ini.get_int("CLI_GRUPPO", "Parametri");
co = ini.get_int("CLI_CONTO", "Parametri");
}
}
break;
case 'F':
{
tipoc = "F";
so = hd_key2for(hd_key);
TToken_string key(tipoc);
key.add(so);
const TRectype rec_cf = cache().get(LF_CLIFO, key);
gr = rec_cf.get_int(CLI_GRUPPO);
co = rec_cf.get_int(CLI_CONTO);
if (gr == 0)
{
gr = ini.get_int("FOR_GRUPPO", "Parametri");
co = ini.get_int("FOR_CONTO", "Parametri");
}
}
break;
default:
break;
}
}
// verifica in configurazione se il conto è costo o ricavo
bool THardy_movimenti::conto_is_costoricavo(const int gr)
{
TConfig& ini = config();
const int costi = ini.get_int("COSTI_GRUPPO", "Parametri");
const int ricavi = ini.get_int("RICAVI_GRUPPO", "Parametri");
return ((gr == costi) || (gr == ricavi));
}
// verifica se il movimento è iva e nel caso riempie array delle righe iva
bool THardy_movimenti::test_moviva()
{
// verifico se è un movimento iva: esiste un record in MovIvaT
TString query;
query << query_header();
query << "SELECT * "
"FROM dbo.MovIvaT "
"WHERE KMovconT=";
query << _kmovcont;
TODBC_recordset recset(query);
real totdoc = ZERO;
long kregivat = -1;
if (recset.items() > 0)
{
bool ok=recset.move_first();
if (ok)
{
kregivat = recset.get("KRegivaT").as_int();
// aggiorna_testata movimento già scritta su ini con i nuovi dati di testata
const TString& key = recset.get("IdConto").as_string();
TString4 hdtipoc = recset.get("IdContoTp").as_string();
TString4 tipoc = " ";
int gr, co;
long so;
gr = 0;
co = 0;
so = 0;
conto2campo(hdtipoc, key, tipoc, gr, co, so);
_conf->set(MOV_TIPO, tipoc);
_conf->set(MOV_CODCF, so);
totdoc = recset.get("TotDocumento").as_real();
if (totdoc == ZERO)
_conf->set("SOLAIVA", "X");
_conf->set(MOV_TOTDOC, totdoc.string(0,2));
}
}
// leggo le righe iva e costrisco array corrispondente
TString_array lista_campi_righeiva;
TConfig& ini = config();
ini.list_variables(lista_campi_righeiva, true, "RMOVIVA", true);
TString query_righe;
query_righe << query_header();
query_righe << "SELECT * "
"FROM dbo.MovIva "
"WHERE KRegivaT=";
query_righe << kregivat;
TODBC_recordset recset_righe(query_righe);
_righeiva->destroy();
TLocalisamfile rmoviva(LF_RMOVIVA);
TRectype& rec_rmoviva = rmoviva.curr();
real totdoc_calc = ZERO;
for (bool ok=recset_righe.move_first();ok;ok=recset_righe.move_next())
{
recset2rec(recset_righe, rec_rmoviva, lista_campi_righeiva);
const TString& key = recset_righe.get("IdConto").as_string();
TString4 hdtipoc = recset_righe.get("IdContoTp").as_string();
TString4 tipoc;
tipoc = " ";
int gr, co;
long so;
gr = 0;
co = 0;
so = 0;
conto2campo(hdtipoc, key, tipoc, gr, co, so);
rec_rmoviva.put(RMI_TIPOC, tipoc);
rec_rmoviva.put(RMI_GRUPPO, gr);
rec_rmoviva.put(RMI_CONTO, co);
rec_rmoviva.put(RMI_SOTTOCONTO, so);
const TString& codiva = rec_rmoviva.get(RMI_CODIVA);
const TString* codind = (TString*)_ivaind->objptr(codiva);
if (codind != NULL)
rec_rmoviva.put(RMI_TIPODET, *codind);
_righeiva->add(new TRectype(rec_rmoviva));
if (!_ivaoma->is_key(codiva))
totdoc_calc+=recset_righe.get("Imponibile").as_real();
totdoc_calc+=recset_righe.get("Imposta").as_real();
}
if (totdoc == ZERO && totdoc_calc != ZERO)
{
_conf->set("SOLAIVA", " ");
_conf->set(MOV_TOTDOC, totdoc_calc.string(0,2));
}
return (kregivat > 0);
}
// riempie array delle righe contabili
bool THardy_movimenti::test_movcont()
{
TString_array lista_campi_righe;
TConfig& ini = config();
ini.list_variables(lista_campi_righe, true, "RMOV", true);
TString query_righe;
query_righe << query_header();
query_righe << "SELECT * "
"FROM dbo.MovContabili "
"WHERE KMovconT=";
query_righe << _kmovcont;
TODBC_recordset recset_righe(query_righe);
_righecont->destroy();
TLocalisamfile rmov(LF_RMOV);
TRectype& rec_rmov = rmov.curr();
for (bool ok=recset_righe.move_first();ok;ok=recset_righe.move_next())
{
recset2rec(recset_righe, rec_rmov, lista_campi_righe);
const TString& key = recset_righe.get("IdConto").as_string();
TString4 hdtipoc = recset_righe.get("IdContoTp").as_string();
TString4 tipoc;
tipoc = " ";
int gr, co;
long so;
gr = 0;
co = 0;
so = 0;
conto2campo(hdtipoc, key, tipoc, gr, co, so);
TString4 sezione = "D";
real imp_dare = recset_righe.get("Dare").as_real();
real imp_avere = recset_righe.get("Avere").as_real();
if (imp_dare.is_zero())
sezione = "A";
rec_rmov.put(RMV_SEZIONE, sezione);
rec_rmov.put(RMV_IMPORTO, (imp_avere.is_zero() ? imp_dare : imp_avere));
rec_rmov.put(RMV_TIPOC, tipoc);
rec_rmov.put(RMV_GRUPPO, gr);
rec_rmov.put(RMV_CONTO, co);
rec_rmov.put(RMV_SOTTOCONTO, so);
_righecont->add(new TRectype(rec_rmov));
}
return true;
}
// scrive il record passato sull'ini corrente
void THardy_movimenti::rec2ini(const TRectype& rec)
{
for (int i=0; i<rec.items(); i++)
{
const char* fieldname = rec.fieldname(i);
const TString& value = rec.get(fieldname);
if (!value.empty())
_conf->set(fieldname, value);
}
}
// scrive su ini le righe contabili
bool THardy_movimenti::scrivi_righecont()
{
TString paragraph;
int nrigac = 1;
for (int i=0;i<_righecont->items();i++)
{
TRectype& rec_rmov = *(TRectype*)_righecont->objptr(i);
paragraph.format("%d,%d",LF_RMOV, nrigac++);
_conf->set_paragraph(paragraph); // riga contabile
rec2ini(rec_rmov);
}
return true;
}
// calcola imponibile della riga iva passata:
// 1. se è una riga con iva indetraibile verifico il conto 4 sulla causale
// se il conto c'è, l'imponibile è imponibile della riga
// se il conto non c'è calcolo iva indetraibile utilizzando la % e la sommo all'imponibile
// 2. se è una riga con iva normale, l'imponibile è imponibliie della riga
real THardy_movimenti::get_imponibile(const TRectype& rec)
{
real imponibile = rec.get_real(RMI_IMPONIBILE);
const char* codiva = rec.get(RMI_CODIVA);
if (_ivaind->is_key(codiva))
{
TString16 causale = get_str("IdCausale");
causale << "|4";
const TString& gruppo = cache().get(LF_RCAUSALI, causale, RCA_GRUPPO);
if (gruppo.blank())
{
real imposta = rec.get_real(RMI_IMPOSTA);
TString& codind = (TString&)_ivaind->find(codiva);
real perc(cache().get("%DET", codind, "R0"));
imposta = (imposta*perc)/CENTO + 0,01;
imposta.round(2);
imponibile+=imposta;
}
}
return imponibile;
}
// gestisce tutto il procedimento di scrittura su ini delle righe iva e contabili
bool THardy_movimenti::scrivi_righe()
{
const int ndec = TCurrency::get_firm_dec(false);
TString paragraph;
int nrigai = 1; // contatore righe iva
TConfig& ini = config();
TString8 iva_esente = ini.get("IVA_ESENTE", "Parametri");
TToken_string sconto_omaggi = ini.get("CONTO_OMAGGI", "Parametri");
TToken_string conti_mov = ini.get("CONTI_MOV", "Parametri");
const int gruppo_omaggi = sconto_omaggi.get_int(0);
const int conto_omaggi = sconto_omaggi.get_int(1);
const long sottoconto_omaggi = sconto_omaggi.get_long(2);
real saldo;
// la sezione della riga 1 mi serve per verificare il segno e la sezione delle righe contabili
TString16 causale = get_str("IdCausale");
causale << "|1";
const char sez_cau = (cache().get(LF_RCAUSALI, causale, RCA_SEZIONE)[0] == 'D' ? 'A' : 'D');
bool has_iva_omaggio = false;
// se è un movimento iva metto in atto il meccanismo di ricerca per assegnare le aliquote ai conti
if (_righeiva->items() > 0)
{
for (int i = 0; !has_iva_omaggio && i<_righeiva->items(); i++)
has_iva_omaggio = _ivaoma->is_key(((TRectype*)_righeiva->objptr(i))->get(RMI_CODIVA));
// primo passo: scartare le righe contabili con gruppi non presenti nella lista GRUPPI_MOV
for (int i=_righecont->items() - 1;i>=0;i--)
{
TRectype& rec_rmov = *(TRectype*)_righecont->objptr(i);
const int gruppo = rec_rmov.get_int(RMV_GRUPPO);
const int conto = rec_rmov.get_int(RMV_CONTO);
const long sottoconto = rec_rmov.get_long(RMV_SOTTOCONTO);
TToken_string key;
key.add(gruppo);
key.add(conto);
const int tipoconto = atoi(cache().get(LF_PCON, key, PCN_INDBIL));
const bool riga_omaggio = (gruppo == gruppo_omaggi) && (conto == conto_omaggi) && (sottoconto == sottoconto_omaggi);
const TString & descr = rec_rmov.get(RMV_DESCR);
// se la descrizione comincia con queste stringhe, significa che è un pagamento immediato
// e va passata la riga contabile cosi come è
if (descr.starts_with("S.DO DOC.") || descr.starts_with("ABB. DOC.") || descr.starts_with("ACC. DOC."))
rec_rmov.put(RMV_ROWTYPE, "C");
else
if (riga_omaggio)
{
if (!has_iva_omaggio)
{
paragraph.format("%d,%d",LF_RMOVIVA, nrigai++);
_conf->set_paragraph(paragraph); // riga iva
rec2ini(*(TRectype*)_righeiva->objptr(0));
// sostituisco codice iva e importo (-) e gruppo conto sottoconto
const char sezione = rec_rmov.get_char(RMV_SEZIONE);
real importo = rec_rmov.get_real(RMV_IMPORTO);
if (sezione != sez_cau)
importo = -importo;
saldo += importo;
_conf->set(RMI_CODIVA, iva_esente); // codice iva esente per quadrare il movimento
_conf->set(RMI_TIPODET, "");
_conf->set(RMI_IMPONIBILE, importo.string(0,2)); // imponibile negativo
_conf->set(RMI_IMPOSTA, ""); // imposta zero
_conf->set(RMI_TIPOC, "");
_conf->set(RMI_GRUPPO, sconto_omaggi.get(0));
_conf->set(RMI_CONTO, sconto_omaggi.get(1));
_conf->set(RMI_SOTTOCONTO, sconto_omaggi.get(2));
}
_righecont->destroy(i);
}
else
{
bool found = (tipoconto == 3) || (tipoconto == 4);
if (!found)
{
TToken_string cod("", ',');
cod.add(gruppo);
cod.add(conto);
cod.add(sottoconto);
// Provo il sottoconto ma se non riesco provo con conto e poi anche gruppo (formato -> 3,1,2 o 3,1,0 o 3,0,0)
for (int c = 2; !found && c >= 0; c--)
{
found = conti_mov.get_pos(cod) >= 0;
cod.add(0, c);
}
if (!found)
_righecont->destroy(i);
}
if (found)
{
const char sezione = rec_rmov.get_char(RMV_SEZIONE);
if (sezione != sez_cau)
{
real importo = rec_rmov.get_real(RMV_IMPORTO);
importo = -importo;
rec_rmov.put(RMV_SEZIONE, sez_cau);
rec_rmov.put(RMV_IMPORTO, importo);
}
}
}
}
_righecont->pack();
const bool singola_rigacont = (_righecont->items()==1);
// secondo passo: per ogni riga iva cerco importo uguale in righe contabili,
// se lo trovo assegno quel codice iva al conto contabile trovato e cancello la riga iva e la riga contabile
for (int i=0;i<_righeiva->items();i++)
{
TRectype& rec_rmoviva = *(TRectype*)_righeiva->objptr(i);
const char* codiva = rec_rmoviva.get(RMI_CODIVA);
const bool riga_omaggio = _ivaoma->is_key(codiva);
// se le righe contabili sono 1, su tutte le righe iva metto quel conto, da brava massaia ...
if ((!riga_omaggio) && _righecont->items()==1)
{
TRectype& rec_rmov = *(TRectype*)_righecont->objptr(0);
rec_rmoviva.put(RMI_TIPOC, rec_rmov.get(RMV_TIPOC));
rec_rmoviva.put(RMI_GRUPPO, rec_rmov.get(RMV_GRUPPO));
rec_rmoviva.put(RMI_CONTO, rec_rmov.get(RMV_CONTO));
rec_rmoviva.put(RMI_SOTTOCONTO, rec_rmov.get(RMV_SOTTOCONTO));
paragraph.format("%d,%d",LF_RMOVIVA, nrigai++);
_conf->set_paragraph(paragraph); // riga iva
rec2ini(rec_rmoviva);
rec_rmoviva.zero();
}
else
{
TCodiceIVA c(codiva);
real imponibile = get_imponibile(rec_rmoviva);
for (int j=0;j<_righecont->items();j++)
{
TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j);
const bool riga_cont = (rec_rmov.get(RMV_ROWTYPE) == "C");
real importo = rec_rmov.get_real(RMV_IMPORTO);
if ((!riga_omaggio) && (!riga_cont) && (importo <= imponibile))
{
const real impon = rec_rmoviva.get_real(RMI_IMPONIBILE);
const real iva = rec_rmoviva.get_real(RMI_IMPOSTA);
c.imposta(importo);
rec_rmoviva.put(RMI_TIPOC, rec_rmov.get(RMV_TIPOC));
rec_rmoviva.put(RMI_GRUPPO, rec_rmov.get(RMV_GRUPPO));
rec_rmoviva.put(RMI_CONTO, rec_rmov.get(RMV_CONTO));
rec_rmoviva.put(RMI_SOTTOCONTO, rec_rmov.get(RMV_SOTTOCONTO));
real wimp = impon ;
if (importo < imponibile)
{
wimp *= importo / imponibile;
wimp.round(2);
}
const real wiva = c.imposta(wimp);
if (importo < imponibile)
{
rec_rmoviva.put(RMI_IMPONIBILE, wimp);
rec_rmoviva.put(RMI_IMPOSTA, wiva);
}
paragraph.format("%d,%d",LF_RMOVIVA, nrigai++);
_conf->set_paragraph(paragraph); // riga iva
rec2ini(rec_rmoviva);
_righecont->destroy(j, true);
j = _righecont->items();
if (importo == imponibile)
rec_rmoviva.zero();
else
{
rec_rmoviva.put(RMI_IMPONIBILE, impon - wimp);
rec_rmoviva.put(RMI_IMPOSTA, iva - wiva);
}
}
}
}
}
_righecont->pack();
// terzo passo: per ogni riga iva rimasta distribuisco importo su tutti i conti rimasti in righe cont.
for (int i=0;i<_righeiva->items();i++)
{
TRectype& rec_rmoviva = *(TRectype*)_righeiva->objptr(i);
if (!rec_rmoviva.empty())
{
const TString& codiva = rec_rmoviva.get(RMI_CODIVA);
const bool riga_omaggio = _ivaoma->is_key(codiva);
real imponibile = rec_rmoviva.get_real(RMI_IMPONIBILE);
real imposta = rec_rmoviva.get_real(RMI_IMPOSTA);
TGeneric_distrib dimponibile(imponibile, ndec);
TGeneric_distrib dimposta(imposta, ndec);
for (int j=0;j<_righecont->items();j++)
{
TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j);
const bool riga_cont = (rec_rmov.get(RMV_ROWTYPE) == "C");
if (!riga_cont)
{
real importo = rec_rmov.get_real(RMV_IMPORTO);
dimponibile.add(importo);
dimposta.add(importo);
}
}
for (int j=0;j<_righecont->items();j++)
{
TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j);
const bool riga_cont = (rec_rmov.get(RMV_ROWTYPE) == "C");
if (!riga_cont)
{
real importo = dimponibile.get();
real imposta = dimposta.get();
rec_rmoviva.put(RMI_TIPOC, rec_rmov.get(RMV_TIPOC));
rec_rmoviva.put(RMI_GRUPPO, rec_rmov.get(RMV_GRUPPO));
rec_rmoviva.put(RMI_CONTO, rec_rmov.get(RMV_CONTO));
rec_rmoviva.put(RMI_SOTTOCONTO, rec_rmov.get(RMV_SOTTOCONTO));
rec_rmoviva.put(RMI_IMPONIBILE, importo);
rec_rmoviva.put(RMI_IMPOSTA, imposta);
paragraph.format("%d,%d",LF_RMOVIVA, nrigai++);
_conf->set_paragraph(paragraph); // riga iva
rec2ini(rec_rmoviva);
}
}
// se iva utilizzata per gli omaggi, devo fare un'altra riga iva identica ma con importo avere con iva esente e gr/co/so letto da configurazione CONTO_OMAGGI
if (riga_omaggio)
{
paragraph.format("%d,%d",LF_RMOVIVA, nrigai++);
_conf->set_paragraph(paragraph); // riga iva
rec2ini(rec_rmoviva);
// sostituisco codice iva e importo (-) e gruppo conto sottoconto
imponibile = -imponibile;
_conf->set(RMI_CODIVA, iva_esente); // codice iva esente per quadrare il movimento
_conf->set(RMI_TIPODET, "");
_conf->set(RMI_IMPONIBILE, imponibile.string(0,2)); // imponibile negativo
_conf->set(RMI_IMPOSTA, ""); // imposta zero
_conf->set(RMI_TIPOC, "");
_conf->set(RMI_GRUPPO, sconto_omaggi.get(0));
_conf->set(RMI_CONTO, sconto_omaggi.get(1));
_conf->set(RMI_SOTTOCONTO, sconto_omaggi.get(2));
}
}
}
for (int j=_righecont->items()-1;j>=0;j--)
{
TRectype& rec_rmov = *(TRectype*)_righecont->objptr(j);
const bool riga_cont = (rec_rmov.get(RMV_ROWTYPE) == "C");
if (riga_cont)
rec_rmov.zero(RMV_ROWTYPE);
else
_righecont->destroy(j, true);
}
if (saldo != ZERO)
{
TString paragraph;
paragraph.format("%d",LF_MOV);
real totdoc(_conf->get(MOV_TOTDOC, paragraph));
totdoc += saldo;
_conf->set(MOV_TOTDOC, totdoc.string(0,2), paragraph);
}
//_righecont->destroy();
}
// scrivo su ini le righe contabili rimaste (tutte se il mov non è iva)
scrivi_righecont();
return true;
}
// procedura principale di conversione
bool THardy_movimenti::trasferisci()
{
TConfig& ini = config();
// creazione array delle aliquote iva con % indetraibilità e degli omaggi
// leggere la tabella hardy AliquoteIVA
_ivaind->destroy();
_ivaoma->destroy();
TString query_iva;
query_iva << query_header();
query_iva << "SELECT * "
"FROM dbo.AliquoteIVA ";
TODBC_recordset recset_iva(query_iva);
for (bool ok=recset_iva.move_first();ok;ok=recset_iva.move_next())
{
const char* codiva = recset_iva.get("IdIva").as_string();
real ind = recset_iva.get("Indetraibilita").as_real();
const int flomaggio = recset_iva.get("FlOmaggio").as_int();
if (ind != ZERO)
{
TString4 oggetto = ini.get(codiva, "Indetraibilita");
_ivaind->add(codiva, oggetto);
}
if (flomaggio > 0)
{
real* oggetto = new real();
_ivaoma->add(codiva, (TObject*)oggetto);
}
}
// query su testate movimenti
TString16 dastr, astr;
dastr.format("%4d-%2d-%2d", _dadata.year(), _dadata.month(), _dadata.day());
astr.format("%4d-%2d-%2d", _adata.year(), _adata.month(), _adata.day());
TString query =
"SELECT * "
"FROM dbo.MovContabiliT "
"WHERE Esercizio=";
query << _anno;
query << " AND DataMovimento>= '";
query << dastr;
query << "' AND DataMovimento<= '";
query << astr;
query << "' ORDER BY DataMovimento ";
TRecordset& recset = create_recordset(query);
TString_array lista_campi;
ini.list_variables(lista_campi, true, "MOV", true);
TFilename outdir;
outdir = ini.get("PATH", "Main");
TFilename listfiles = outdir; listfiles.add("ha*.ini");
TString_array transactions;
list_files(listfiles, transactions);
FOR_EACH_ARRAY_ROW(transactions, row, name)
remove(*name);
_conf = NULL;
long ntran = 1L;
TString paragraph;
THardy_iterator hi(this);
while (++hi)
{
_kmovcont = recset.get("KMovconT").as_int(); // numero movimento testata
if (_conf != NULL)
delete _conf;
_conf = NULL;
TFilename temp(outdir);
temp.add(format("ha%06ld", ntran++));
temp.ext("ini");
if (temp.exist())
temp.fremove();
_conf = new TConfig(temp);
_conf->set_paragraph("Transaction");
_conf->set("Action","INSERT");
_conf->set("Mode", "AUTO");
paragraph.format("%d",LF_MOV);
_conf->set_paragraph(paragraph); // testata movimento
aggiorna_ini(*_conf, lista_campi);
TString codcaus = _conf->get(MOV_CODCAUS);
if (cache().get(LF_CAUSALI, codcaus, CAU_MOVAP) == "C")
{
const TDate d(_conf->get(MOV_DATAREG));
const TDate datacomp(31, 12, d.year() - 1);
_conf->set(MOV_DATACOMP, datacomp.string());
}
// verifica se è un mov. iva e nel caso aggiorna testata e array righe iva
bool iva = test_moviva();
// legge righe contabili e aggiorna array righe cont.
test_movcont();
// scrive RMOV e /o RMOVIVA a partire da array righe letti da db hardy
bool ok = scrivi_righe();
if (!ok)
{
ntran--;
if (temp.exist())
temp.fremove();
TString msg;
msg << (iva ? TR("Il movimento iva "): TR("Il movimento contabile ")) << _kmovcont
<< TR(" ha generato un errore, non è stato convertito ");
log(msg, 2); // Non uso log_error per non dare messaggi fuorvianti
}
#ifdef DBG
else
{
TString msg;
msg << (iva ? TR("Movimento iva "): TR("Movimento contabile ")) << _kmovcont
<< TR(" generato nel file ") << temp;
log(msg);
}
#endif
}
if (_conf != NULL)
delete _conf;
show_log();
if (yesno_box(FR("Si desidera confermare l'importazione di %ld movimenti"), ntran-1))
{
TString app;
app << "cg2 -0 -i" << outdir << "/ha*.ini";
TExternal_app primanota(app);
primanota.run(true);
}
return true;
}
THardy_movimenti::THardy_movimenti(const int anno, const TDate dadata, const TDate adata) : _anno(anno), _dadata(dadata), _adata(adata)
{
_righeiva = new TArray;
_righecont = new TArray;
_ivaind = new TAssoc_array;
_ivaoma = new TAssoc_array;
}
///////////////////////////////////////////////////////////
// TConvMovimentiHardy_mask
///////////////////////////////////////////////////////////
class TConvMovimentiHardy_mask : public TAutomask
{
protected:
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void serialize(bool bSave);
public:
void trasferisci();
TConvMovimentiHardy_mask();
virtual ~TConvMovimentiHardy_mask();
};
// Funzione di trasferimento dati da/verso file .ini con lo stesso nome della maschera
// Andrebbe messo in libreria
void TConvMovimentiHardy_mask::serialize(bool bSave)
{
TFilename n = source_file(); n.ext("ini"); // Construisce il nome del .ini in base al .msk
TConfig cfg(n, "Main"); // Crea il file di configurazione
TString4 id;
for (int i = fields()-1; i >= 0; i--) // Scandisce tutti i campi della maschera ...
{
TMask_field& f = fld(i);
if (f.active() && f.is_loadable()) // ... selezionando solo quelli editabili
{
id.format("%d", f.dlg());
if (bSave) // A seconda del flag di scrittura ...
cfg.set(id, f.get()); // ... o scrive sul .ini
else
f.set(cfg.get(id)); // ... o legge dal .ini
}
}
}
void TConvMovimentiHardy_mask::trasferisci()
{
TString query_header;
query_header << "ODBC(" << get(F_DSN) << ',' << get(F_USR) << ',' << get(F_PWD) << ")\n";
const int anno = get_int(F_ANNO);
const TDate dadata = get_date(F_DADATA);
const TDate adata = get_date(F_ADATA);
if (anno!=0)
{
THardy_log log;
THardy_movimenti pc(anno, dadata, adata);
pc.init(TR("Movimenti contabili"), query_header, log);
pc.trasferisci();
}
}
bool TConvMovimentiHardy_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case DLG_OK:
if (e == fe_button)
serialize(true);
break;
default:
break;
}
return true;
}
TConvMovimentiHardy_mask::TConvMovimentiHardy_mask() : TAutomask("hacnv200a")
{
serialize(false);
}
TConvMovimentiHardy_mask::~TConvMovimentiHardy_mask()
{
}
///////////////////////////////////////////////////////////
// TConvMovimentiHardy
///////////////////////////////////////////////////////////
class TConvMovimentiHardy : public TSkeleton_application
{
protected:
virtual void main_loop();
};
void TConvMovimentiHardy::main_loop()
{
TConvMovimentiHardy_mask mask;
while (mask.run() == K_ENTER)
mask.trasferisci();
}
int hacnv200(int argc, char* argv[])
{
TConvMovimentiHardy ih;
ih.run(argc, argv, APPNAME);
return 0;
}