Files correlati : Ricompilazione Demo : [ ] Commento : Riportata la versione 3.2 patch 1262 git-svn-id: svn://10.65.10.50/trunk@17631 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			1349 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1349 lines
		
	
	
		
			39 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "gv0.h"
 | 
						|
#include "gv0600a.h"
 | 
						|
#include "gvlib.h"
 | 
						|
 | 
						|
#include <applicat.h>
 | 
						|
#include <automask.h>
 | 
						|
#include <modaut.h>
 | 
						|
#include <progind.h>
 | 
						|
#include <recarray.h>
 | 
						|
#include <relation.h>
 | 
						|
#include <reprint.h>
 | 
						|
#include <tabutil.h>
 | 
						|
#include <textset.h>
 | 
						|
 | 
						|
#include <anagr.h>
 | 
						|
#include <anafis.h>
 | 
						|
#include <clifo.h>
 | 
						|
#include <comuni.h>
 | 
						|
#include <nditte.h>
 | 
						|
#include <righef24.h>
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// TF24_textset
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TF24_textset : public TAS400_recordset
 | 
						|
{
 | 
						|
  TAssoc_array _contatori;
 | 
						|
	real				 _totale_positivi;
 | 
						|
 | 
						|
protected:
 | 
						|
  long add_count(const char* type, long n = 1);
 | 
						|
 | 
						|
protected:
 | 
						|
  void add_field(const char* trc, int from, int to, bool req = false, char tipo = 'a', 
 | 
						|
                 const char* name = "Filler", const char* def = NULL);
 | 
						|
 | 
						|
public:
 | 
						|
  virtual TRecnotype new_rec(const char* tipo);
 | 
						|
  virtual bool destroy(TRecnotype r);
 | 
						|
  virtual const TString& rec_type(TRecnotype r = -1) const;
 | 
						|
  virtual bool set(const char* field, const TVariant& v);
 | 
						|
  
 | 
						|
  TRecnotype get_count(const char* tipo) const;
 | 
						|
	real & totale_positivi() { return _totale_positivi;}
 | 
						|
  
 | 
						|
  TF24_textset(const char* query = "");
 | 
						|
};
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// TF24_sender
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TF4_sender : public TSkeleton_application
 | 
						|
{
 | 
						|
  TF24_textset* _f24;
 | 
						|
  TLog_report* _log;
 | 
						|
  bool _errors_logged;
 | 
						|
	bool _has_cg;
 | 
						|
 | 
						|
protected:
 | 
						|
  bool new_rec(const char* t) { CHECK(t && *t, "Tipo non valido"); return _f24->new_rec(t) > 0; }
 | 
						|
  void set(const char* field, const TVariant& var);
 | 
						|
  void set(const char* field, const int n)    { set(field, TVariant((long)n)); }
 | 
						|
  void set(const char* field, const char* s)  { set(field, TVariant(s)); }
 | 
						|
  void set(const char* field, const TDate& d) { set(field, TVariant(d)); }
 | 
						|
  void set(const char* field, const real& v)  { set(field, TVariant(v)); }
 | 
						|
 | 
						|
  char trib2sec(const TString& tributo);
 | 
						|
  void split_ragsoc(const TString& ragsoc, bool bPhysical, TString& cognome, TString& nome) const;
 | 
						|
 | 
						|
  void add_header(const TMask& m);
 | 
						|
  void add_10_20(const TRecordset& riga, const TMask& m);
 | 
						|
  void add_erario(TRecordset& riga, real& saldo_tot, real& credito_tot);
 | 
						|
  void add_inps(TRecordset& riga, real& saldo_tot, real& credito_tot);
 | 
						|
	void add_regioni(TRecordset& riga, real& saldo_tot, real& credito_tot);
 | 
						|
	void add_ici(TRecordset& riga, real& saldo_tot, real& credito_tot);
 | 
						|
	void add_inail(TRecordset& riga, real& saldo_tot, real& credito_tot);
 | 
						|
  void add_50(TRecordset& riga, const real& saldo_tot, const real& credito_tot, const TMask& m);
 | 
						|
  void add_delega(long nDelega, const TMask& m);
 | 
						|
  void add_footer(const TMask& m);
 | 
						|
  bool set_data_versamento(long nDelega, const TDate& datavers);
 | 
						|
 | 
						|
public:
 | 
						|
  void log(int sev, const char* msg);
 | 
						|
 | 
						|
  virtual void main_loop();
 | 
						|
  TF4_sender() {}
 | 
						|
};
 | 
						|
 | 
						|
TF4_sender& app() { return (TF4_sender&)main_app(); }
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// TF24_textset
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
long TF24_textset::add_count(const char* type, long i)
 | 
						|
{
 | 
						|
	TString4 tipo; tipo.strncpy(type, 2);
 | 
						|
 | 
						|
  CHECK(strlen(tipo) == 2, "Tipo record non valido");
 | 
						|
  real* n = (real*)_contatori.objptr(tipo);
 | 
						|
  if (n == NULL)
 | 
						|
  {
 | 
						|
    n = new real;
 | 
						|
    _contatori.add(tipo, n);
 | 
						|
  }
 | 
						|
  *n += i;
 | 
						|
  return n->integer();
 | 
						|
}
 | 
						|
 | 
						|
TRecnotype TF24_textset::get_count(const char* tipo) const
 | 
						|
{
 | 
						|
  long i = 0;
 | 
						|
  if (tipo && *tipo)
 | 
						|
  {
 | 
						|
    CHECK(strlen(tipo) == 2, "Tipo record non valido");
 | 
						|
    real* n = (real*)_contatori.objptr(tipo);
 | 
						|
    if (n != NULL)
 | 
						|
      i = n->integer();
 | 
						|
  }
 | 
						|
  else
 | 
						|
    i = items();
 | 
						|
  return i;
 | 
						|
}
 | 
						|
 | 
						|
TRecnotype TF24_textset::new_rec(const char* tipo)
 | 
						|
{
 | 
						|
  CHECK(tipo && *tipo, "Tipo record nullo");
 | 
						|
 | 
						|
  const TRecnotype n = TAS400_recordset::new_rec(tipo);
 | 
						|
  if (n >= 0)
 | 
						|
  {
 | 
						|
    add_count(tipo);
 | 
						|
    if (strlen(tipo) == 5)
 | 
						|
    {
 | 
						|
      TString& str = row(n);
 | 
						|
      str.overwrite(tipo+3, 10);
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return n;
 | 
						|
}
 | 
						|
 | 
						|
const TString& TF24_textset::rec_type(TRecnotype r) const
 | 
						|
{
 | 
						|
  const TString& t = TAS400_recordset::rec_type(r);
 | 
						|
  if (t == "40" || t == "50")
 | 
						|
  {
 | 
						|
    TString& tmp = get_tmp_string();
 | 
						|
    tmp << t << '-' << row(r).mid(10, 2);  // TIPO-SUBTIPO
 | 
						|
    return tmp;
 | 
						|
  }
 | 
						|
  return t;
 | 
						|
}
 | 
						|
 | 
						|
bool TF24_textset::destroy(TRecnotype r)
 | 
						|
{
 | 
						|
  const bool ok = TAS400_recordset::destroy(r);
 | 
						|
  if (ok)
 | 
						|
  {
 | 
						|
    if (r >= 0)
 | 
						|
    {
 | 
						|
      const TString& t = TAS400_recordset::rec_type(r); // Igora subtipo record!
 | 
						|
      add_count(t, -1);
 | 
						|
    }
 | 
						|
    else
 | 
						|
      _contatori.destroy();
 | 
						|
  }
 | 
						|
  return ok; 
 | 
						|
}
 | 
						|
 | 
						|
void TF24_textset::add_field(const char* trc, int from, int to, bool required, 
 | 
						|
                               char tipo, const char* name, const char* def)
 | 
						|
{
 | 
						|
  CHECK(trc && *trc, "Tracciato nullo");
 | 
						|
  TString80 fname; fname << trc << '.' << name;
 | 
						|
 | 
						|
  const TFieldtypes t = tipo == 'n' ? _longzerofld : _alfafld;
 | 
						|
  const int pos = from - 1;
 | 
						|
  const int len = to >= from ? to-from+1 : record_length()-pos;
 | 
						|
  if (def && *def)
 | 
						|
  {
 | 
						|
    CHECKS(def == NULL || (int)strlen(def) <= len, "Invalid default value ", def);
 | 
						|
    TVariant var(def); var.convert_to(t);
 | 
						|
    create_field(fname, pos, len, t, required, var);
 | 
						|
  }
 | 
						|
  else
 | 
						|
    create_field(fname, pos, len, t, required);
 | 
						|
}
 | 
						|
 | 
						|
bool TF24_textset::set(const char* field, const TVariant& var)
 | 
						|
{
 | 
						|
  const char* err = NULL;
 | 
						|
  int c = -1;
 | 
						|
  const TAS400_column_info* info = parse_field(field, c, false);
 | 
						|
  bool ok = info != NULL;
 | 
						|
  if (ok)
 | 
						|
  {
 | 
						|
    switch (var.type())
 | 
						|
    {
 | 
						|
    case _datefld:
 | 
						|
      if (var.is_zero())
 | 
						|
        ok = set_field(*info, NULL_VARIANT);  
 | 
						|
      else
 | 
						|
      {
 | 
						|
        long ansi = 0;
 | 
						|
        const TDate d = var.as_date();
 | 
						|
        if (info->_width == 6)
 | 
						|
          ansi = d.day()*10000 + d.month()*100 + d.year()%100;
 | 
						|
        else
 | 
						|
          ansi = d.date2ansi();
 | 
						|
        ok = set_field(*info, TVariant(ansi)); 
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    case _realfld:
 | 
						|
      if (var.is_zero())
 | 
						|
        ok = set_field(*info, NULL_VARIANT);  
 | 
						|
      else
 | 
						|
      {
 | 
						|
        real v = var.as_real(); v *= CENTO;
 | 
						|
        ok = set_field(*info, TVariant(v.integer()));  
 | 
						|
      }
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      ok = set_field(*info, var); 
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    if (!ok)
 | 
						|
      err = TR("Campo obbligatorio non compilato");
 | 
						|
  }
 | 
						|
  else
 | 
						|
    err = TR("Campo non riconosciuto");
 | 
						|
  
 | 
						|
  if (err != NULL)
 | 
						|
  {
 | 
						|
    TString msg;
 | 
						|
    msg  << field << ": " << err;
 | 
						|
    app().log(2, msg);
 | 
						|
  }
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
TF24_textset::TF24_textset(const char* query)
 | 
						|
             : TAS400_recordset(TString("AS400(120,2,1)\n") << query)
 | 
						|
{
 | 
						|
  const char an = 'a';
 | 
						|
  const char n  = 'n';
 | 
						|
  const bool o = true;
 | 
						|
  const bool f = false;
 | 
						|
  
 | 
						|
  add_field("F4",  1,  1);
 | 
						|
  add_field("F4",  2,  3, o, an, "TipoRecord", "F4");
 | 
						|
  add_field("F4",  4,  8, o, an, "Mittente");
 | 
						|
  add_field("F4",  9, 13, o,  n, "Ricevente");
 | 
						|
  add_field("F4", 14, 19, o,  n, "DataCreazione");
 | 
						|
  add_field("F4", 20, 39, o, an, "NomeSupporto");
 | 
						|
  add_field("F4", 40, 45, f, an, "Riferimenti");
 | 
						|
  add_field("F4", 46,104);
 | 
						|
  add_field("F4",105,105, o, an, "TipoFlusso", "2");
 | 
						|
  add_field("F4",106,106, o, an, "QualificatoreFlusso", "$");
 | 
						|
  add_field("F4",107,111, o, an, "SoggettoVeicolatore");
 | 
						|
  add_field("F4",112,113);
 | 
						|
  add_field("F4",114,114, o, an, "CodiceDivisa", "E");
 | 
						|
  add_field("F4",115,120);
 | 
						|
 | 
						|
  add_field("EF",  1,  1);
 | 
						|
  add_field("EF",  2,  3, o, an, "TipoRecord", "EF");
 | 
						|
  add_field("EF",  4,  8, o, an, "Mittente");
 | 
						|
  add_field("EF",  9, 13, o,  n, "Ricevente");
 | 
						|
  add_field("EF", 14, 19, o,  n, "DataCreazione");
 | 
						|
  add_field("EF", 20, 39, o, an, "NomeSupporto");
 | 
						|
  add_field("EF", 40, 45, f, an, "Riferimenti");
 | 
						|
  add_field("EF", 46, 52, o,  n, "NumeroDisposizioni");
 | 
						|
  add_field("EF", 53, 67, o,  n, "TotImportiPositivi");
 | 
						|
  add_field("EF", 68, 82, o,  n, "TotImportiNegativi");
 | 
						|
  add_field("EF", 83, 89, o,  n, "NumeroRecord");
 | 
						|
  add_field("EF", 90,113);
 | 
						|
  add_field("EF",114,114, o, an, "CodiceDivisa", "E");
 | 
						|
  add_field("EF",115,120);
 | 
						|
 | 
						|
  add_field("10",  1,  1);
 | 
						|
  add_field("10",  2,  3, o, an, "TipoRecord", "10");
 | 
						|
  add_field("10",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("10", 11, 26, o, an, "CodiceFiscale");
 | 
						|
  add_field("10", 27, 50, o, an, "Cognome");
 | 
						|
  add_field("10", 51, 70, f, an, "Nome");
 | 
						|
  add_field("10", 71, 71, f, an, "Sesso");
 | 
						|
  add_field("10", 72, 96, f, an, "ComuneNascita");
 | 
						|
  add_field("10", 97, 98, f, an, "ProvinciaNascita");
 | 
						|
  add_field("10", 99,106, f,  n, "DataNascita");
 | 
						|
  add_field("10",107,113, o,  n, "ProtocolloDelega");
 | 
						|
  add_field("10",114,120);
 | 
						|
 | 
						|
  add_field("20",  1,  1);
 | 
						|
  add_field("20",  2,  3, o, an, "TipoRecord", "20");
 | 
						|
  add_field("20",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("20", 11, 35, o, an, "Comune");
 | 
						|
  add_field("20", 36, 37, o, an, "Provincia");
 | 
						|
  add_field("20", 38, 72, o, an, "Indirizzo");
 | 
						|
  add_field("20", 73, 80, o,  n, "DataPagamento");
 | 
						|
  add_field("20", 81, 81, f,  n, "FlagAnnoImposta");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("20", 82,120);
 | 
						|
 | 
						|
  add_field("40-01",  1,  1);
 | 
						|
  add_field("40-01",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-01",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-01", 11, 12, o, an, "SubtipoRecord", "01");
 | 
						|
  add_field("40-01", 13, 14, o,  n, "ProgressivoTributo");
 | 
						|
  add_field("40-01", 15, 18, o, an, "CodiceTributo");
 | 
						|
  add_field("40-01", 19, 26, o, an, "RiferimentiTributo");
 | 
						|
  add_field("40-01", 27, 41, f,  n, "ImportoDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-01", 42, 56, f,  n, "ImportoCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-01", 57, 59, f, an, "CodiceUfficio");
 | 
						|
  add_field("40-01", 60, 70, f,  n, "CodiceAtto");
 | 
						|
  add_field("40-01", 71,120);
 | 
						|
 | 
						|
  add_field("40-02",  1,  1);
 | 
						|
  add_field("40-02",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-02",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-02", 11, 12, o, an, "SubtipoRecord", "02");
 | 
						|
  add_field("40-02", 13, 27, f,  n, "TotaleDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-02", 28, 42, f,  n, "TotaleCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-02", 43, 43, o, an, "SegnoSezione");
 | 
						|
  add_field("40-02", 44, 58, f,  n, "SaldoSezione");
 | 
						|
  add_field("40-02", 59,120);
 | 
						|
 | 
						|
  add_field("40-03",  1,  1);
 | 
						|
  add_field("40-03",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-03",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-03", 11, 12, o, an, "SubtipoRecord", "03");
 | 
						|
  add_field("40-03", 13, 14, o,  n, "ProgressivoContributo");
 | 
						|
  add_field("40-03", 15, 18, o,  n, "CodiceSede");
 | 
						|
  add_field("40-03", 19, 22, o, an, "CausaleContributo");
 | 
						|
  add_field("40-03", 23, 39, o, an, "MatricolaINPS");
 | 
						|
  add_field("40-03", 40, 45, o,  n, "PeriodoInizio");
 | 
						|
  add_field("40-03", 46, 51, f,  n, "PeriodoFine");
 | 
						|
  add_field("40-03", 52, 66, f,  n, "ImportoDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-03", 67, 81, f,  n, "ImportoCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-03", 82,120);
 | 
						|
 | 
						|
  add_field("40-04",  1,  1);
 | 
						|
  add_field("40-04",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-04",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-04", 11, 12, o, an, "SubtipoRecord", "04");
 | 
						|
  add_field("40-04", 13, 27, f,  n, "TotaleDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-04", 28, 42, f,  n, "TotaleCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-04", 43, 43, o, an, "SegnoSezione");
 | 
						|
  add_field("40-04", 44, 58, f,  n, "SaldoSezione");
 | 
						|
  add_field("40-04", 59,120);
 | 
						|
 | 
						|
  add_field("40-05",  1,  1);
 | 
						|
  add_field("40-05",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-05",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-05", 11, 12, o, an, "SubtipoRecord", "05");
 | 
						|
  add_field("40-05", 13, 14, o,  n, "CodiceRegione");
 | 
						|
  add_field("40-05", 15, 16, o,  n, "ProgressivoContributo");
 | 
						|
  add_field("40-05", 17, 20, o, an, "CodiceTributo");
 | 
						|
  add_field("40-05", 21, 28, o, an, "RiferimentiTributo");
 | 
						|
  add_field("40-05", 29, 43, f,  n, "ImportoDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-05", 44, 58, f,  n, "ImportoCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-05", 59,120);
 | 
						|
 | 
						|
  add_field("40-06",  1,  1);
 | 
						|
  add_field("40-06",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-06",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-06", 11, 12, o, an, "SubtipoRecord", "06");
 | 
						|
  add_field("40-05", 13, 14);
 | 
						|
  add_field("40-06", 15, 29, f,  n, "TotaleDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-06", 30, 44, f,  n, "TotaleCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-06", 45, 45, o, an, "SegnoSezione");
 | 
						|
  add_field("40-06", 46, 60, f,  n, "SaldoSezione");
 | 
						|
  add_field("40-06", 61,120);
 | 
						|
 | 
						|
  add_field("40-07",  1,  1);
 | 
						|
  add_field("40-07",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-07",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-07", 11, 12, o, an, "SubtipoRecord", "07");
 | 
						|
  add_field("40-07", 13, 16, o, an, "CodiceEnte");
 | 
						|
  add_field("40-07", 17, 18, o,  n, "ProgressivoContributo");
 | 
						|
  add_field("40-07", 19, 22, o, an, "CodiceTributo");
 | 
						|
  add_field("40-07", 23, 30, o, an, "RiferimentiTributo");
 | 
						|
  add_field("40-07", 31, 45, f,  n, "ImportoDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-07", 46, 60, f,  n, "ImportoCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-07", 61, 61, f,  n, "Ravvedimento");
 | 
						|
  add_field("40-07", 62, 62, f,  n, "ImmobiliVariati");
 | 
						|
  add_field("40-07", 63, 63, f,  n, "Acconto");
 | 
						|
  add_field("40-07", 64, 64, f,  n, "Saldo");
 | 
						|
  add_field("40-07", 65, 66, f,  n, "NumeroFabbricati");
 | 
						|
  add_field("40-07", 67, 82, f,  n, "DetrazioneICI"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-07", 83,120);
 | 
						|
 | 
						|
  add_field("40-08",  1,  1);
 | 
						|
  add_field("40-08",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-08",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-08", 11, 12, o, an, "SubtipoRecord", "08");
 | 
						|
  add_field("40-08", 13, 16);
 | 
						|
  add_field("40-08", 17, 31, f,  n, "TotaleDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-08", 32, 46, f,  n, "TotaleCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-08", 47, 47, o, an, "SegnoSezione");
 | 
						|
  add_field("40-08", 48, 62, f,  n, "SaldoSezione");
 | 
						|
  add_field("40-08", 63,120);
 | 
						|
  
 | 
						|
  add_field("40-09",  1,  1);
 | 
						|
  add_field("40-09",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-09",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-09", 11, 12, o, an, "SubtipoRecord", "09");
 | 
						|
  add_field("40-09", 13, 14, o,  n, "ProgressivoContributo");
 | 
						|
  add_field("40-09", 15, 19, o,  n, "CodiceSede");
 | 
						|
  add_field("40-09", 20, 27, o,  n, "NumeroPosizioneAssicurativa");
 | 
						|
  add_field("40-09", 28, 29, o,  n, "CCNumeroPosizioneAssicurativa");
 | 
						|
  add_field("40-09", 30, 30, o, an, "Causale");
 | 
						|
  add_field("40-09", 31, 34);
 | 
						|
  add_field("40-09", 35, 40, o,  n, "NumeroDiRiferimento");
 | 
						|
  add_field("40-09", 41, 55, f,  n, "ImportoDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-09", 56, 70, f,  n, "ImportoCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-09", 71,120);
 | 
						|
 | 
						|
  add_field("40-10",  1,  1);
 | 
						|
  add_field("40-10",  2,  3, o, an, "TipoRecord", "40");
 | 
						|
  add_field("40-10",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("40-10", 11, 12, o, an, "SubtipoRecord", "10");
 | 
						|
  add_field("40-10", 13, 27, f,  n, "TotaleDebito");  // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-10", 28, 42, f,  n, "TotaleCredito"); // non sarebbe f, ma 0 e' valido
 | 
						|
  add_field("40-10", 43, 43, o, an, "SegnoSezione");
 | 
						|
  add_field("40-10", 44, 58, f,  n, "SaldoSezione");
 | 
						|
  add_field("40-10", 59,120);
 | 
						|
  
 | 
						|
	add_field("50-01",  1,  1);
 | 
						|
  add_field("50-01",  2,  3, o, an, "TipoRecord", "50");
 | 
						|
  add_field("50-01",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("50-01", 11, 12, o, an, "SubtipoRecord", "01");
 | 
						|
  add_field("50-01", 13, 17, o,  n, "BancaPassiva");
 | 
						|
  add_field("50-01", 18, 22, o,  n, "SportelloPassivo");
 | 
						|
  add_field("50-01", 23, 34, o,  n, "ContoAddebito");
 | 
						|
  add_field("50-01", 35, 35, f, an, "Cin");
 | 
						|
  add_field("50-01", 36, 50, f,  n, "SaldoFinale");
 | 
						|
  add_field("50-01", 51, 51, f,  n, "FlagFirmatario");
 | 
						|
  add_field("50-01", 52, 53);
 | 
						|
  add_field("50-01", 54, 69, o, an, "CodiceFiscale");
 | 
						|
  add_field("50-01", 70, 70, o,  n, "TitolarePagamento");
 | 
						|
  add_field("50-01", 71, 78, o,  n, "DataPagamento");
 | 
						|
  add_field("50-01", 79, 93, f,  n, "TotaleImportiCredito");
 | 
						|
  add_field("50-01", 94, 95);
 | 
						|
  add_field("50-01", 96, 96, o,  n, "CodiceIndividuale", "3");
 | 
						|
  add_field("50-01", 97,120);
 | 
						|
 | 
						|
  add_field("50-02",  1,  1);
 | 
						|
  add_field("50-02",  2,  3, o, an, "TipoRecord", "50");
 | 
						|
  add_field("50-02",  4, 10, o,  n, "ProgressivoDelega");
 | 
						|
  add_field("50-02", 11, 12, o, an, "SubtipoRecord", "02");
 | 
						|
  add_field("50-02", 13, 28, o, an, "CodiceFiscaleMittente");
 | 
						|
  add_field("50-02", 29, 32);
 | 
						|
  add_field("50-02", 33, 37, o,  n, "ABI");
 | 
						|
  add_field("50-02", 38, 42, o,  n, "CAB");
 | 
						|
  add_field("50-02", 43, 62, f,  an, "CodiceClienteBancario");
 | 
						|
  add_field("50-02", 63, 63, o,  an, "DestinatarioStampa", "1");
 | 
						|
  add_field("50-02", 64,108, o, an, "Denominazione");
 | 
						|
  add_field("50-02",109,120);
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// TF4_mask
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
class TF24_mask : public TAutomask
 | 
						|
{
 | 
						|
  clock_t _next_update;
 | 
						|
  bool _updating;
 | 
						|
 | 
						|
private:
 | 
						|
  bool apply_filter(const TRecordset& righe) const;
 | 
						|
  void update_sheet();
 | 
						|
  void invalidate_sheet();
 | 
						|
  void serialize(bool bSave);
 | 
						|
 | 
						|
protected:
 | 
						|
  virtual void on_idle();
 | 
						|
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						|
 | 
						|
public:
 | 
						|
  TF24_mask();
 | 
						|
  ~TF24_mask();
 | 
						|
};
 | 
						|
 | 
						|
bool TF24_mask::apply_filter(const TRecordset& righe) const
 | 
						|
{
 | 
						|
  const TDate dal = get(F_DATA_DA);
 | 
						|
  const TDate al = get(F_DATA_AL);
 | 
						|
  if (dal.ok() || al.ok())
 | 
						|
  {
 | 
						|
    const TDate scad = righe.get("DATASCAD").as_date();
 | 
						|
    if ((dal.ok() && scad < dal) || (al.ok() && scad > al))
 | 
						|
      return false;
 | 
						|
  }
 | 
						|
 | 
						|
  const long abi = get_long(F_ABI);
 | 
						|
  const long cab = get_long(F_CAB);
 | 
						|
  if (abi > 0 || cab > 0)
 | 
						|
  {
 | 
						|
    const long rabi = righe.get("ABI").as_int();
 | 
						|
    const long rcab = righe.get("CAB").as_int();
 | 
						|
    if ((abi > 0 && abi != rabi) || (cab > 0 && cab != rcab))
 | 
						|
      return false;
 | 
						|
  }
 | 
						|
 | 
						|
  const char tipoint = get(F_TIPOINTEST)[0];
 | 
						|
  if (tipoint > ' ')
 | 
						|
  {
 | 
						|
    const char rtipoint = righe.get("TIPOINTEST").as_string()[0];
 | 
						|
    if (tipoint != rtipoint)
 | 
						|
      return false;
 | 
						|
 | 
						|
    long codint = 0;
 | 
						|
    switch (tipoint)
 | 
						|
    {
 | 
						|
    case 'C': codint = get_long(F_CLIFO); break;
 | 
						|
    case 'F':
 | 
						|
    case 'G': codint = get_long(F_PERSON); break;
 | 
						|
    default : break;
 | 
						|
    }
 | 
						|
    if (codint != 0)
 | 
						|
    {
 | 
						|
      const long rcodint = righe.get("INTEST").as_int();
 | 
						|
      if (codint != rcodint)
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
void TF24_mask::update_sheet()
 | 
						|
{
 | 
						|
  if (!_updating)
 | 
						|
  {
 | 
						|
    _updating = true;
 | 
						|
    _next_update = 0;
 | 
						|
 | 
						|
    TSheet_field& s = sfield(F_DISTINTE);
 | 
						|
    TMask& m = s.sheet_mask();
 | 
						|
 | 
						|
    s.destroy();
 | 
						|
 | 
						|
    int flags = 1;
 | 
						|
    switch (get(F_FILTER)[0])
 | 
						|
    {
 | 
						|
    case 'Q': flags = 0; break; // Tutte
 | 
						|
    case 'I': flags = 2; break; // Inviate
 | 
						|
    default : flags = 1; break; // Da inviare
 | 
						|
    }
 | 
						|
 | 
						|
    TElencoF24_set righe(flags);
 | 
						|
    TProgind pi(righe.items(), "Lettura F24", true, true);
 | 
						|
    for (bool ok = righe.move_first(); ok; ok = righe.move_next())
 | 
						|
    {
 | 
						|
      if (apply_filter(righe))
 | 
						|
      {
 | 
						|
        TToken_string& row = s.row(-1);
 | 
						|
        for (int i = m.fields()-1; i > 0; i--)
 | 
						|
        {
 | 
						|
          const TMask_field& f = m.fld(i);
 | 
						|
          const TFieldref* fr = f.field();
 | 
						|
          if (fr != NULL)
 | 
						|
          {
 | 
						|
            const int pos = s.cid2index(f.dlg());
 | 
						|
            row.add(righe.get(fr->name()).as_string(), pos);
 | 
						|
          }
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    s.force_update();
 | 
						|
    _updating = false;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TF24_mask::invalidate_sheet()
 | 
						|
{
 | 
						|
  _next_update = clock()+CLOCKS_PER_SEC/2; // Aspetta mezzo secondo!
 | 
						|
}
 | 
						|
 | 
						|
void TF24_mask::on_idle()
 | 
						|
{
 | 
						|
  // Aggiorna lo sheet, ma non troppo spesso!
 | 
						|
  if (_next_update != 0 && !_updating && clock() > _next_update)
 | 
						|
    update_sheet();
 | 
						|
}
 | 
						|
 | 
						|
bool TF24_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						|
{
 | 
						|
  bool ok = true;
 | 
						|
  switch (o.dlg())
 | 
						|
  {
 | 
						|
  case F_FILTER:
 | 
						|
  case F_DATA_DA:
 | 
						|
  case F_DATA_AL:
 | 
						|
  case F_ABI:
 | 
						|
  case F_CAB:
 | 
						|
  case F_TIPOINTEST:
 | 
						|
  case F_CLIFO:
 | 
						|
  case F_PERSON:
 | 
						|
    if (e == fe_modify)
 | 
						|
      invalidate_sheet();
 | 
						|
    break;
 | 
						|
  case F_DISTINTE:
 | 
						|
    switch (e)
 | 
						|
    {
 | 
						|
    case fe_init: 
 | 
						|
      update_sheet();
 | 
						|
      break;
 | 
						|
    case se_query_modify:
 | 
						|
    case se_query_add:
 | 
						|
    case se_query_del:
 | 
						|
      ok = false;
 | 
						|
    default:
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    break;
 | 
						|
  default:
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
void TF24_mask::serialize(bool bSave)
 | 
						|
{
 | 
						|
  const char* defpar = "gv";
 | 
						|
  TConfig ini(CONFIG_DITTA, defpar);
 | 
						|
  for (int i = fields()-1; i >= 0; i--)
 | 
						|
  {
 | 
						|
    TMask_field& f = fld(i);
 | 
						|
    const TFieldref* fr = f.field();
 | 
						|
    if (fr != NULL)
 | 
						|
    {
 | 
						|
      if (bSave)
 | 
						|
        fr->write(ini, defpar, f.get());
 | 
						|
      else
 | 
						|
        f.set(fr->read(ini, defpar));
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
TF24_mask::TF24_mask() 
 | 
						|
         : TAutomask("gv0600a"), _updating(false), _next_update(0)
 | 
						|
{
 | 
						|
  serialize(false);
 | 
						|
	enable(F_CONTABILIZZA, app().has_module(CGAUT));
 | 
						|
}
 | 
						|
 | 
						|
TF24_mask::~TF24_mask()
 | 
						|
{
 | 
						|
  serialize(true);
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// TF4_sender
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
void TF4_sender::log(int sev, const char* msg)
 | 
						|
{ 
 | 
						|
  if (sev > 0)
 | 
						|
  {
 | 
						|
    TString m;
 | 
						|
    m << TR("Record") << ' ' << _f24->rec_type() << ": " << msg;
 | 
						|
    _log->log(sev, m); 
 | 
						|
    _errors_logged = true;
 | 
						|
  }
 | 
						|
  else
 | 
						|
    _log->log(sev, msg);
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::set(const char* field, const TVariant& var) 
 | 
						|
{ 
 | 
						|
  _f24->set(field, var);
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_header(const TMask& m)
 | 
						|
{
 | 
						|
  new_rec("F4");
 | 
						|
  set("Mittente",      m.get(F_MITTENTE));
 | 
						|
  set("Ricevente",     m.get(F_ABI));
 | 
						|
  set("DataCreazione", m.get_date(F_DATA));
 | 
						|
  set("NomeSupporto",  m.get(F_FILE));  // Somma dei tre campi precedenti
 | 
						|
	set("SoggettoVeicolatore", m.get(F_MITTENTE));
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::split_ragsoc(const TString& ragsoc, bool bPhysical, 
 | 
						|
                              TString& cognome, TString& nome) const
 | 
						|
{
 | 
						|
  const int maxc = 24, maxn = 20;  // Sarebbe bello prenderli dal tracciato, ma ...
 | 
						|
  if (bPhysical)
 | 
						|
  {
 | 
						|
    TParagraph_string rs(ragsoc, maxc);
 | 
						|
    cognome = rs.get();
 | 
						|
    nome = ragsoc.mid(30);
 | 
						|
    if (nome.len() > maxn)
 | 
						|
    {
 | 
						|
      TParagraph_string rs(nome, maxn);
 | 
						|
      nome = rs.get();
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    TParagraph_string rs(ragsoc, maxc+maxn);
 | 
						|
    cognome = rs.get();
 | 
						|
    nome = cognome.mid(maxc);
 | 
						|
    cognome.cut(maxc);
 | 
						|
  }
 | 
						|
  CHECKS(cognome.len()<=maxc && nome.len()<=maxn, "Ragsoc balorda", (const char*)ragsoc);
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_10_20(const TRecordset& riga, const TMask& m)
 | 
						|
{
 | 
						|
  const char tipointest = riga.get("TIPOINTEST").as_string()[0];
 | 
						|
  const long intest = riga.get("INTEST").as_int();
 | 
						|
 | 
						|
  TString80 codfis, ragsoc;
 | 
						|
 | 
						|
  char tipoa = tipointest;
 | 
						|
  long codanagr = intest; 
 | 
						|
 | 
						|
  TString16 key;
 | 
						|
 | 
						|
  if (tipointest == 'C')
 | 
						|
  {
 | 
						|
    key.cut(0) << "C|" << intest;
 | 
						|
    const TRectype& cli = cache().get(LF_CLIFO, key);
 | 
						|
    codfis = cli.get(CLI_COFI);
 | 
						|
    ragsoc = cli.get(CLI_RAGSOC);
 | 
						|
    
 | 
						|
    tipoa = cli.get_char(CLI_TIPOAPER);
 | 
						|
    codanagr = cli.get_long(CLI_CODANAGPER);
 | 
						|
    if (codfis.blank())
 | 
						|
      codfis = cli.get(CLI_PAIV);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    if (tipoa == 'D')
 | 
						|
    {
 | 
						|
      tipoa = prefix().firm().get(NDT_TIPOA)[0];
 | 
						|
      codanagr = prefix().firm().get_long(NDT_CODANAGR);
 | 
						|
    }
 | 
						|
    key.cut(0) << tipoa << '|' << codanagr;
 | 
						|
    const TRectype& anag = cache().get(LF_ANAG, key);
 | 
						|
    ragsoc = anag.get(ANA_RAGSOC);
 | 
						|
    codfis = anag.get(ANA_COFI);
 | 
						|
    if (codfis.blank())
 | 
						|
      codfis = anag.get(ANA_PAIV);
 | 
						|
  }
 | 
						|
 | 
						|
  /////////////////////////////////////////////////////////
 | 
						|
  // Tipo record 10
 | 
						|
  /////////////////////////////////////////////////////////
 | 
						|
 | 
						|
  const long nProgr = _f24->get_count("10")+1;  // Sfrutto il suo contatore!
 | 
						|
  if (new_rec("10"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgr);
 | 
						|
    set("CodiceFiscale", codfis);
 | 
						|
 | 
						|
    TString80 cognome, nome;
 | 
						|
    split_ragsoc(ragsoc, tipoa == 'F', cognome, nome);
 | 
						|
    set("Cognome", cognome);
 | 
						|
    set("Nome", nome);
 | 
						|
 | 
						|
    if (tipoa == 'F' && codanagr > 0)
 | 
						|
    {
 | 
						|
      const TRectype& anf = cache().get(LF_ANAGFIS, codanagr);
 | 
						|
      set("Sesso", anf.get(ANF_SESSO));
 | 
						|
      const TString4 comnasc = anf.get(ANF_COMNASC);
 | 
						|
      set("ComuneNascita", comnasc);
 | 
						|
      if (comnasc < "Z") // Nato in Italia
 | 
						|
      {
 | 
						|
        key = " |"; key << comnasc;
 | 
						|
        const TRectype& com = cache().get(LF_COMUNI, key);
 | 
						|
        set("ProvinciaNascita", com.get(COM_PROVCOM));
 | 
						|
      }
 | 
						|
      else
 | 
						|
        set("ProvinciaNascita", "EE");
 | 
						|
    }
 | 
						|
		set("ProtocolloDelega", riga.get("F24"));
 | 
						|
 | 
						|
  }
 | 
						|
  
 | 
						|
  /////////////////////////////////////////////////////////
 | 
						|
  // Tipo record 20
 | 
						|
  /////////////////////////////////////////////////////////
 | 
						|
  if (new_rec("20"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgr);
 | 
						|
    set("DataPagamento", m.get_date(F_DATAPAG));
 | 
						|
 | 
						|
    TString80 indirizzo;
 | 
						|
    if (tipointest == 'C')
 | 
						|
    {
 | 
						|
      key.cut(0) << "C|" << intest;
 | 
						|
      const TRectype& cli = cache().get(LF_CLIFO, key);
 | 
						|
      key.cut(0) << cli.get(CLI_STATOCF) << '|' << cli.get(CLI_COMCF);
 | 
						|
 | 
						|
      indirizzo << cli.get(CLI_INDCF) << ' ' << cli.get(CLI_CIVCF) 
 | 
						|
                << ' ' << cli.get(CLI_LOCCF);
 | 
						|
 | 
						|
    } else
 | 
						|
    if (tipoa == 'F' || tipoa == 'G')
 | 
						|
    {
 | 
						|
      key.cut(0) << tipoa << '|' << codanagr;
 | 
						|
      const TRectype& anag = cache().get(LF_ANAG, key);
 | 
						|
 | 
						|
      key.cut(0) << anag.get(ANA_STATORES) << '|' << anag.get(ANA_COMRES);
 | 
						|
      indirizzo << anag.get(ANA_INDRES) << ' ' << anag.get(ANA_CIVRES);
 | 
						|
    }
 | 
						|
  
 | 
						|
    const TRectype& com = cache().get(LF_COMUNI, key);
 | 
						|
    set("Comune", com.get(COM_DENCOM));
 | 
						|
    set("Provincia", com.get(COM_PROVCOM));
 | 
						|
 | 
						|
    TParagraph_string ind(indirizzo, 35);
 | 
						|
    set("Indirizzo", ind.get()); // Salva i primi 35 caratteri dell'indirizzo
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
char TF4_sender::trib2sec(const TString& tributo)
 | 
						|
{
 | 
						|
  const char* err = NULL;
 | 
						|
  char sec = ' ';
 | 
						|
  const TRectype& trb = cache().get("%TRB", tributo);
 | 
						|
  if (trb.empty())
 | 
						|
  {
 | 
						|
    err = TR("Non presente in tabella");  
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    sec = toupper(trb.get_char("S6"));
 | 
						|
    if (!isalpha(sec))
 | 
						|
      err = TR("Sezione F24 non valida");
 | 
						|
  }
 | 
						|
  if (err)
 | 
						|
  {
 | 
						|
    TString msg;
 | 
						|
    msg << TR("Codice tributo") << " (" <<  tributo << ") :" << err;
 | 
						|
    log(2, msg);
 | 
						|
  }
 | 
						|
  return sec;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void TF4_sender::add_erario(TRecordset& riga, real& saldo_tot, real& credito_tot)
 | 
						|
{
 | 
						|
  const long nProgDelega = _f24->get_count("10");
 | 
						|
 | 
						|
  int nProgr = 0;
 | 
						|
  real debito, credito;
 | 
						|
 | 
						|
  for (bool ok = riga.move_first(); ok ; ok = riga.move_next())
 | 
						|
  {
 | 
						|
    const TString4 tributo = riga.get("TRIBUTO").as_string();
 | 
						|
    const char sezione = trib2sec(tributo);
 | 
						|
    if (sezione == 'E')
 | 
						|
    {
 | 
						|
      if (new_rec("40-01"))
 | 
						|
      {
 | 
						|
        set("ProgressivoDelega", nProgDelega);
 | 
						|
        set("ProgressivoTributo", ++nProgr);
 | 
						|
        set("CodiceTributo", tributo);
 | 
						|
				TString16 rif(riga.get("RATEAZIONE").as_string());
 | 
						|
 | 
						|
				if (riga.get("ANNO").as_int() > 0)
 | 
						|
					rif << riga.get("ANNO").as_string();
 | 
						|
				if (rif.blank())
 | 
						|
					rif ="00000000";
 | 
						|
				set("RiferimentiTributo", rif);
 | 
						|
        
 | 
						|
        const real d = riga.get("IMPORTODEB").as_real();
 | 
						|
        set("ImportoDebito", d);
 | 
						|
        debito += d;
 | 
						|
 | 
						|
        const real c = riga.get("IMPORTOCRE").as_real();
 | 
						|
        set("ImportoCredito", c);
 | 
						|
        credito += c;
 | 
						|
        
 | 
						|
        if (nProgr > 6)
 | 
						|
          log(2, "Numero eccessivo di righe nella sezione Erario");
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const real saldo = debito-credito;
 | 
						|
  if (nProgr > 0 && new_rec("40-02"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgDelega);
 | 
						|
    set("TotaleDebito", debito);
 | 
						|
    set("TotaleCredito", credito);
 | 
						|
    set("SegnoSezione", saldo < ZERO ? "N" : "P");
 | 
						|
    set("SaldoSezione", saldo < ZERO ? -saldo : saldo);
 | 
						|
  }
 | 
						|
 | 
						|
  saldo_tot += saldo;
 | 
						|
  credito_tot += credito;
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_inps(TRecordset& riga, real& saldo_tot, real& credito_tot)
 | 
						|
{
 | 
						|
  const long nProgDelega = _f24->get_count("10");
 | 
						|
 | 
						|
  int nProgr = 0;
 | 
						|
  real debito, credito;
 | 
						|
 | 
						|
  for (bool ok = riga.move_first(); ok ; ok = riga.move_next())
 | 
						|
  {
 | 
						|
    const TString4 tributo = riga.get("TRIBUTO").as_string();
 | 
						|
    const char sezione = trib2sec(tributo);
 | 
						|
    if (sezione == 'I')
 | 
						|
    {
 | 
						|
      if (new_rec("40-03"))
 | 
						|
      {
 | 
						|
        set("ProgressivoDelega", nProgDelega);
 | 
						|
        set("ProgressivoContributo", ++nProgr);
 | 
						|
        set("CausaleContributo", tributo);
 | 
						|
				set("CodiceSede", riga.get("SEDE"));
 | 
						|
				set("MatricolaINPS", riga.get("MATRICOLA"));
 | 
						|
				set("PeriodoInizio", riga.get("PERIODODA"));
 | 
						|
				set("PeriodoFine", riga.get("PERIODOA"));        
 | 
						|
        const real d = riga.get("IMPORTODEB").as_real();
 | 
						|
        set("ImportoDebito", d);
 | 
						|
        debito += d;
 | 
						|
 | 
						|
        const real c = riga.get("IMPORTOCRE").as_real();
 | 
						|
        set("ImportoCredito", c);
 | 
						|
        credito += c;
 | 
						|
 | 
						|
        if (nProgr > 4)
 | 
						|
          log(2, "Numero eccessivo di righe nella sezione INPS");
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const real saldo = debito-credito;
 | 
						|
  if (nProgr > 0 && new_rec("40-04"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgDelega);
 | 
						|
    set("TotaleDebito", debito);
 | 
						|
    set("TotaleCredito", credito);
 | 
						|
    set("SegnoSezione", saldo < ZERO ? "N" : "P");
 | 
						|
    set("SaldoSezione", saldo < ZERO ? -saldo : saldo);
 | 
						|
  }
 | 
						|
 | 
						|
  saldo_tot += saldo;
 | 
						|
  credito_tot += credito;
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_regioni(TRecordset& riga, real& saldo_tot, real& credito_tot)
 | 
						|
{
 | 
						|
  const long nProgDelega = _f24->get_count("10");
 | 
						|
 | 
						|
  int nProgr = 0;
 | 
						|
  real debito, credito;
 | 
						|
 | 
						|
  for (bool ok = riga.move_first(); ok ; ok = riga.move_next())
 | 
						|
  {
 | 
						|
    const TString4 tributo = riga.get("TRIBUTO").as_string();
 | 
						|
    const char sezione = trib2sec(tributo);
 | 
						|
    if (sezione == 'R')
 | 
						|
    {
 | 
						|
      if (new_rec("40-05")) // qui
 | 
						|
      {
 | 
						|
 | 
						|
        set("ProgressivoDelega", nProgDelega);
 | 
						|
        set("ProgressivoContributo", ++nProgr);
 | 
						|
        set("CodiceRegione", riga.get("CODREG").as_int());
 | 
						|
        set("CodiceTributo", tributo);
 | 
						|
 | 
						|
				TString16 rif(riga.get("RATEAZIONE").as_string());
 | 
						|
 | 
						|
				if (riga.get("ANNO").as_int() > 0)
 | 
						|
					rif << riga.get("ANNO").as_string();
 | 
						|
				if (rif.blank())
 | 
						|
					rif ="00000000";
 | 
						|
				set("RiferimentiTributo", rif);
 | 
						|
        
 | 
						|
        const real d = riga.get("IMPORTODEB").as_real();
 | 
						|
        set("ImportoDebito", d);
 | 
						|
        debito += d;
 | 
						|
 | 
						|
        const real c = riga.get("IMPORTOCRE").as_real();
 | 
						|
        set("ImportoCredito", c);
 | 
						|
        credito += c;
 | 
						|
 | 
						|
        if (nProgr > 4)
 | 
						|
          log(2, "Numero eccessivo di righe nella sezione Regione");
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const real saldo = debito-credito;
 | 
						|
  if (nProgr > 0 && new_rec("40-06"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgDelega);
 | 
						|
    set("TotaleDebito", debito);
 | 
						|
    set("TotaleCredito", credito);
 | 
						|
    set("SegnoSezione", saldo < ZERO ? "N" : "P");
 | 
						|
    set("SaldoSezione", saldo < ZERO ? -saldo : saldo);
 | 
						|
  }
 | 
						|
 | 
						|
  saldo_tot += saldo;
 | 
						|
  credito_tot += credito;
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_ici(TRecordset& riga, real& saldo_tot, real& credito_tot)
 | 
						|
{
 | 
						|
  const long nProgDelega = _f24->get_count("10");
 | 
						|
 | 
						|
  int nProgr = 0;
 | 
						|
  real debito, credito;
 | 
						|
 | 
						|
  for (bool ok = riga.move_first(); ok ; ok = riga.move_next())
 | 
						|
  {
 | 
						|
    const TString4 tributo = riga.get("TRIBUTO").as_string();
 | 
						|
    const char sezione = trib2sec(tributo);
 | 
						|
    if (sezione == 'L')
 | 
						|
    {
 | 
						|
      if (new_rec("40-07")) // qui
 | 
						|
      {
 | 
						|
        set("ProgressivoDelega", nProgDelega);
 | 
						|
        set("ProgressivoContributo", ++nProgr);
 | 
						|
        set("CodiceEnte", riga.get("ENTECOM").as_string());
 | 
						|
        set("CodiceTributo", tributo);
 | 
						|
        
 | 
						|
				TString16 rif(riga.get("RATEAZIONE").as_string());
 | 
						|
 | 
						|
				if (riga.get("ANNO").as_int() > 0)
 | 
						|
					rif << riga.get("ANNO").as_string();
 | 
						|
				if (rif.blank())
 | 
						|
					rif ="00000000";
 | 
						|
				set("RiferimentiTributo", rif);
 | 
						|
 | 
						|
        const real d = riga.get("IMPORTODEB").as_real();
 | 
						|
        set("ImportoDebito", d);
 | 
						|
        debito += d;
 | 
						|
 | 
						|
        const real c = riga.get("IMPORTOCRE").as_real();
 | 
						|
        set("ImportoCredito", c);
 | 
						|
        credito += c;
 | 
						|
 | 
						|
				set("Ravvedimento", riga.get("RAVVED").as_bool() ? 1 : 0);
 | 
						|
				set("ImmobiliVariati", riga.get("IMMVAR").as_bool() ? 1 : 0);
 | 
						|
				set("Acconto", riga.get("ACCONTO").as_bool() ? 1 : 0);
 | 
						|
				set("Saldo", riga.get("SALDO").as_bool() ? 1 : 0);
 | 
						|
				set("NumeroFabbricati", riga.get("NUMIMM").as_int());
 | 
						|
				set("DetrazioneICI", 0L);
 | 
						|
 | 
						|
        if (nProgr > 4)
 | 
						|
          log(2, "Numero eccessivo di righe nella sezione ICI/Altri tributi locali");
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const real saldo = debito-credito;
 | 
						|
  if (nProgr > 0 && new_rec("40-08"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgDelega);
 | 
						|
    set("TotaleDebito", debito);
 | 
						|
    set("TotaleCredito", credito);
 | 
						|
    set("SegnoSezione", saldo < ZERO ? "N" : "P");
 | 
						|
    set("SaldoSezione", saldo < ZERO ? -saldo : saldo);
 | 
						|
  }
 | 
						|
 | 
						|
  saldo_tot += saldo;
 | 
						|
  credito_tot += credito;
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_inail(TRecordset& riga, real& saldo_tot, real& credito_tot)
 | 
						|
{
 | 
						|
  const long nProgDelega = _f24->get_count("10");
 | 
						|
 | 
						|
  int nProgr = 0;
 | 
						|
  real debito, credito;
 | 
						|
 | 
						|
  for (bool ok = riga.move_first(); ok ; ok = riga.move_next())
 | 
						|
  {
 | 
						|
    const TString4 tributo = riga.get("TRIBUTO").as_string();
 | 
						|
    const char sezione = trib2sec(tributo);
 | 
						|
    if (sezione == 'N')
 | 
						|
    {
 | 
						|
      if (new_rec("40-09")) // qui
 | 
						|
      {
 | 
						|
        set("ProgressivoDelega", nProgDelega);
 | 
						|
        set("ProgressivoContributo", ++nProgr);
 | 
						|
        set("CodiceSede", riga.get("SEDE").as_string());
 | 
						|
				set("NumeroPosizioneAssicurativa", riga.get("POSASS").as_real());
 | 
						|
				set("CCNumeroPosizioneAssicurativa", riga.get("CIN").as_real());
 | 
						|
				set("Causale", riga.get("CAUSINAIL").as_string());
 | 
						|
				set("NumeroDiRiferimento", riga.get("NUMRIF").as_real());
 | 
						|
        
 | 
						|
				const real d = riga.get("IMPORTODEB").as_real();
 | 
						|
        set("ImportoDebito", d);
 | 
						|
        debito += d;
 | 
						|
 | 
						|
        const real c = riga.get("IMPORTOCRE").as_real();
 | 
						|
        set("ImportoCredito", c);
 | 
						|
        credito += c;
 | 
						|
 | 
						|
        if (nProgr > 3)
 | 
						|
          log(2, "Numero eccessivo di righe nella sezione INAIL");
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  const real saldo = debito-credito;
 | 
						|
  if (nProgr > 0 && new_rec("40-10"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgDelega);
 | 
						|
    set("TotaleDebito", debito);
 | 
						|
    set("TotaleCredito", credito);
 | 
						|
    set("SegnoSezione", saldo < ZERO ? "N" : "P");
 | 
						|
    set("SaldoSezione", saldo < ZERO ? -saldo : saldo);
 | 
						|
  }
 | 
						|
 | 
						|
  saldo_tot += saldo;
 | 
						|
  credito_tot += credito;
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_50(TRecordset& riga, const real& saldo_tot, const real& credito_tot, const TMask& m)
 | 
						|
{
 | 
						|
  riga.move_first();
 | 
						|
 | 
						|
  const long nProgDelega = _f24->get_count("10");
 | 
						|
	const TString8 abi(riga.get("ABI").as_string());
 | 
						|
	const TString8 cab(riga.get("CAB").as_string());
 | 
						|
  TString16 key;
 | 
						|
 | 
						|
	key << prefix().firm().get(NDT_TIPOA) << '|' << prefix().firm().get_long(NDT_CODANAGR);
 | 
						|
 | 
						|
	TString16 cofi = cache().get(LF_ANAG, key, ANA_COFI);
 | 
						|
 | 
						|
	if (cofi.blank())
 | 
						|
		cofi = cache().get(LF_ANAG, key, ANA_PAIV);
 | 
						|
 | 
						|
	if (new_rec("50-01"))
 | 
						|
  {
 | 
						|
    set("ProgressivoDelega", nProgDelega);
 | 
						|
    set("BancaPassiva", abi);
 | 
						|
    set("SportelloPassivo", cab);
 | 
						|
 | 
						|
    TString16 banca; banca << abi << cab;
 | 
						|
    const TString& iban = cache().get("BNP", banca, "S3");
 | 
						|
    set("ContoAddebito", iban.mid(15));
 | 
						|
    set("Cin", iban.mid(4, 1));
 | 
						|
    set("SaldoFinale", saldo_tot);
 | 
						|
 | 
						|
    set("CodiceFiscale", cofi);
 | 
						|
 | 
						|
    int titpag = 1;  // Saldo zero
 | 
						|
    if (!saldo_tot.is_zero())
 | 
						|
    {
 | 
						|
      const char tipointes = riga.get("TIPOINTEST").as_string()[0];
 | 
						|
      titpag = tipointes == 'C' ? 3 : 2;
 | 
						|
    }
 | 
						|
    set("TitolarePagamento", titpag);
 | 
						|
    set("DataPagamento", m.get_date(F_DATAPAG));
 | 
						|
    set("TotaleImportiCredito", credito_tot);
 | 
						|
  }
 | 
						|
  if (new_rec("50-02"))
 | 
						|
	{
 | 
						|
    set("ProgressivoDelega", nProgDelega);
 | 
						|
	  set("CodiceFiscaleMittente", cofi);
 | 
						|
	  set("ABI", abi);
 | 
						|
	  set("CAB", cab);
 | 
						|
	  set("Denominazione", prefix().firm().get(NDT_RAGSOC));
 | 
						|
	}
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_delega(long nDelega, const TMask& m)
 | 
						|
{
 | 
						|
  TString msg; msg << TR("Delega") << ' ' << nDelega;
 | 
						|
  log(0, msg);
 | 
						|
 | 
						|
  TF24_set delega(nDelega);
 | 
						|
  
 | 
						|
  real saldo_tot, credito_tot;
 | 
						|
  
 | 
						|
  add_10_20(delega, m);
 | 
						|
  add_erario(delega, saldo_tot, credito_tot);
 | 
						|
  add_inps(delega, saldo_tot, credito_tot);
 | 
						|
  add_regioni(delega, saldo_tot, credito_tot);
 | 
						|
  add_ici(delega, saldo_tot, credito_tot);
 | 
						|
  add_inail(delega, saldo_tot, credito_tot);
 | 
						|
  add_50(delega, saldo_tot, credito_tot, m);
 | 
						|
	_f24->totale_positivi() += saldo_tot;
 | 
						|
 | 
						|
}
 | 
						|
 | 
						|
bool TF4_sender::set_data_versamento(long nDelega, const TDate& datavers)
 | 
						|
{
 | 
						|
  TLocalisamfile righe(LF_RIGHEF24);
 | 
						|
  TF24_set f24(nDelega);
 | 
						|
  for (bool ok = f24.move_first(); ok; ok = f24.move_next())
 | 
						|
  {
 | 
						|
    const long progr = f24.get("PROGR").as_int();
 | 
						|
    righe.put("PROGR", progr);
 | 
						|
    int err = righe.read(_isequal, _lock);
 | 
						|
    if (err == NOERR)
 | 
						|
    {
 | 
						|
      righe.put("DATAVERS", datavers);
 | 
						|
      err = righe.rewrite();
 | 
						|
    }
 | 
						|
    if (err != NOERR)
 | 
						|
      return error_box(FR("Errore %d durante l'aggiornamento della riga %ld"), err, progr);
 | 
						|
  }
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::add_footer(const TMask& m)
 | 
						|
{
 | 
						|
  if (new_rec("EF"))
 | 
						|
  {
 | 
						|
    set("Mittente",      m.get(F_MITTENTE));
 | 
						|
    set("Ricevente",     m.get(F_ABI));
 | 
						|
    set("DataCreazione", m.get_date(F_DATA));
 | 
						|
    set("NomeSupporto",  m.get(F_FILE));  // Somma dei tre campi precedenti
 | 
						|
 | 
						|
    set("NumeroDisposizioni", _f24->get_count("10"));
 | 
						|
    set("NumeroRecord",       _f24->get_count(NULL));
 | 
						|
    set("TotImportiPositivi", _f24->totale_positivi());
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
void TF4_sender::main_loop()
 | 
						|
{
 | 
						|
	_has_cg = app().has_module(CGAUT);
 | 
						|
  TF24_mask m;
 | 
						|
  while (m.run() != K_QUIT)
 | 
						|
  {
 | 
						|
    const char* const title = TR("Generazione F24");
 | 
						|
		const bool contabilizza = m.get_bool(F_CONTABILIZZA);
 | 
						|
    _f24 = new TF24_textset;
 | 
						|
    _log = new TLog_report(title);
 | 
						|
    _errors_logged = false;
 | 
						|
 | 
						|
    add_header(m);
 | 
						|
 | 
						|
    TSheet_field& sheet = m.sfield(F_DISTINTE);
 | 
						|
    if (sheet.items() > 0)
 | 
						|
    {
 | 
						|
      TProgind pi(sheet.items(), title, true, true);
 | 
						|
      FOR_EACH_SHEET_ROW(sheet, r, row) if (row->get(0)[0] > ' ')
 | 
						|
      {
 | 
						|
        if (!pi.setstatus(r+1))
 | 
						|
          break;
 | 
						|
        const long nDelega = row->get_long(1);
 | 
						|
        add_delega(nDelega, m);
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    add_footer(m);
 | 
						|
 | 
						|
    TReport_book book;
 | 
						|
    book.add(*_log);
 | 
						|
#ifdef DBG
 | 
						|
    TAS400_report rep(*_f24);
 | 
						|
    book.add(rep);
 | 
						|
#endif
 | 
						|
    book.preview();
 | 
						|
 | 
						|
    bool save = true;
 | 
						|
    if (_errors_logged)
 | 
						|
    {
 | 
						|
      save = yesno_box(TR("Sono stati riscontrati uno o piu' errori:\n"
 | 
						|
                          "Si desidera salvare il file ugualmente?"));
 | 
						|
    }
 | 
						|
    if (save)
 | 
						|
    {
 | 
						|
      TFilename name = m.get(F_PATH);
 | 
						|
      name.add(m.get(F_FILE));
 | 
						|
      _f24->save_as(name);
 | 
						|
 | 
						|
      if (!_errors_logged)
 | 
						|
      {
 | 
						|
        TProgind pi(sheet.items(), TR("Aggiornamento data versamento"), true, true);
 | 
						|
        const TDate datavers = m.get(F_DATA);
 | 
						|
 | 
						|
				_log->reset();
 | 
						|
        FOR_EACH_SHEET_ROW(sheet, r, row) if (row->get(0)[0] > ' ')
 | 
						|
        {
 | 
						|
          if (!pi.setstatus(r+1))
 | 
						|
            break;
 | 
						|
          
 | 
						|
          const long nDelega = row->get_long(1);
 | 
						|
          if (!set_data_versamento(nDelega, datavers))
 | 
						|
	           break;
 | 
						|
					if (_has_cg)
 | 
						|
					{
 | 
						|
						TTable del("%DEL");
 | 
						|
						TString key;
 | 
						|
						TF24_set d(nDelega);
 | 
						|
						const int codtrib = d.get(F24_TRIBUTO).as_int();
 | 
						|
						const bool acconto = (codtrib == 6013 || codtrib == 6035) && d.get(F24_DATAVERS).as_date().month() == 12;
 | 
						|
						const int type = acconto ? 7 : 1;
 | 
						|
						int month = codtrib - 6000;
 | 
						|
						
 | 
						|
						if (acconto)
 | 
						|
							month = 12;
 | 
						|
						else
 | 
						|
							if (month > 30)
 | 
						|
								month = (month - 30) * 3;
 | 
						|
						key.format("%05ld%04ld%02d%1d", get_firm(), d.get(F24_ANNO).as_int(), month, type);
 | 
						|
						del.put("CODTAB", key);
 | 
						|
 | 
						|
						if (del.read() != NOERR)
 | 
						|
						{
 | 
						|
							del.put("CODTAB", key);
 | 
						|
							del.write();
 | 
						|
						}
 | 
						|
						del.put("D0", d.get(F24_DATAVERS).as_date());
 | 
						|
						del.put("S7", d.get(F24_ABI).as_string());
 | 
						|
						del.put("S8", d.get(F24_CAB).as_string());
 | 
						|
						const real saldo = d.get(F24_IMPORTODEB).as_real() - d.get(F24_IMPORTOCRE).as_real();
 | 
						|
						if (saldo > 0)
 | 
						|
							del.put("R0", saldo);
 | 
						|
						del.put("R1", d.get(F24_INTIVATRIM).as_real());
 | 
						|
						del.put("B0", "X");
 | 
						|
						del.rewrite();
 | 
						|
						if (contabilizza)
 | 
						|
							d.contabilizza(*_log);
 | 
						|
					}
 | 
						|
        }
 | 
						|
				if (contabilizza)
 | 
						|
				{
 | 
						|
					TReport_book book;
 | 
						|
				
 | 
						|
					book.add(*_log);
 | 
						|
				  book.preview();
 | 
						|
				}
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    delete _log;
 | 
						|
    delete _f24;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
int gv0600(int argc, char* argv[])
 | 
						|
{
 | 
						|
  TF4_sender app;
 | 
						|
  app.run(argc, argv, "Invio F24");
 | 
						|
  return 0;
 | 
						|
}
 |