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
		
			
				
	
	
		
			888 lines
		
	
	
		
			29 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			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;
 | 
						|
}
 | 
						|
 |