2025-04-15 12:10:19 +02:00

412 lines
16 KiB
C#

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Windows.Forms;
namespace EstrazioneAnagrafica
{
public abstract class ProgramLogic
{
//global variables, we love them!
private System.ComponentModel.BackgroundWorker backgroundWorker1;
private System.ComponentModel.BackgroundWorker backgroundWorker2;
private bool done;
//that's a mess ;)
public ProgramLogic()
{
//
// backgroundWorker1
//
backgroundWorker1 = new System.ComponentModel.BackgroundWorker();
this.backgroundWorker1.WorkerReportsProgress = true;
this.backgroundWorker1.WorkerSupportsCancellation = true;
this.backgroundWorker1.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker1_DoWork);
this.backgroundWorker1.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker1_ProgressChanged);
this.backgroundWorker1.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker1_RunWorkerCompleted);
//
// backgroundWorker2
//
backgroundWorker2 = new System.ComponentModel.BackgroundWorker();
this.backgroundWorker2.WorkerReportsProgress = true;
this.backgroundWorker2.WorkerSupportsCancellation = true;
this.backgroundWorker2.DoWork += new System.ComponentModel.DoWorkEventHandler(this.backgroundWorker2_DoWork);
this.backgroundWorker2.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.backgroundWorker2_ProgressChanged);
this.backgroundWorker2.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(this.backgroundWorker2_RunWorkerCompleted);
}
//running console application
public void StartConsole(){
try
{
done = false;//since we are using threads we need to keep our console alive
backgroundWorker1.RunWorkerAsync();
while (!done)
{
Thread.Sleep(100); //dont kill the console please!
}
}
catch (Exception ex)
{
PushErrorStatus(ex.Message);
}
}
//running windows forms application
public void StartForm()
{
try
{
backgroundWorker1.RunWorkerAsync(); //no need to keep anything alive. Form never dies
}
catch (Exception ex)
{
PushErrorStatus(ex.Message);
}
}
#region notificators
public abstract void PushStatus(string message); //those we use to show messages to the User.
public abstract void PushErrorStatus(string message); //implementation depedns on mode in which we run the software
public abstract void PushSuccessStatus(string message);
#endregion
#region worker2
private void backgroundWorker2_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
done = true;
PushSuccessStatus(null);
//System.Threading.Thread.Sleep(5000);//this codes make your application waiting for 5 seconds
//sistemo i pulsanti e la label
//TODO
//lblAttendere.Visible = false;
//button1.Enabled = true;
}
private void backgroundWorker2_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
if (e.ProgressPercentage == 10)
{
PushStatus("Rinomino il file sulla macchina target (Bolsena)......");
//lblAttendere.Text = "Rinomino il file sulla macchina target (Bolsena)......";
//lblAttendere.Visible = true;
}
else if (e.ProgressPercentage == 40)
{
PushStatus("Invio il file via FTP......");
//lblAttendere.Text = "Invio il file via FTP......";
}
else if (e.ProgressPercentage == 100)
{
PushStatus("Invio terminato!!!");
//lblAttendere.Text = "Invio terminato!!!";
}
}
private void backgroundWorker2_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
try
{
//prima di inviare il nuovo flusso, rinomino il vecchio con la data attuale
backgroundWorker2.ReportProgress(10);
rinominaFileFtp();
//lancio ftp verso la macchina condivisa \\bolsena
backgroundWorker2.ReportProgress(40);
inviaFlussoHostFTP();
//fine
backgroundWorker2.ReportProgress(100);
}
catch (Exception ex)
{
PushErrorStatus(ex.Message);
done = true;
}
}
#endregion
//voodoo made by 2nd worker
#region worker1
private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
if (!done)
{
PushSuccessStatus("background worker1 job finished");
backgroundWorker2.RunWorkerAsync();
}
else
PushErrorStatus("Process cancelled due to the errors");
//lblAttendere.Visible = false;
}
private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
if (e.ProgressPercentage == 20)
{
PushStatus( "Estraggo gli indirizzi dal db.......");
//lblAttendere.Text = "Estraggo gli indirizzi dal db.......";
}
else if (e.ProgressPercentage == 40)
{
PushStatus( "Creo il file txt......");
//lblAttendere.Text = "Creo il file txt......";
}
else if (e.ProgressPercentage == 80)
{
PushStatus("Creazione TXT terminata!!!");
//lblAttendere.Text = "Creazione TXT terminata!!!";
}
}
private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
try
{
Log.ScriviLog("Preparo estrazione indirizzi");
//-----------------------------------------------------lancio la sp 'Estrazione_Indirizzi_CO'
backgroundWorker1.ReportProgress(20);
DataTable tabellaIndirizzi = LanciaEstrazioneIndirizzi();
if (tabellaIndirizzi.Rows.Count == 0)
{
//System.Windows.Forms.Application.Exit();
Log.ScriviLog("Fine procedura - Nessun indirizzo estratto");
throw new Exception("no data");
}
//prima di scrivere il txt rinomino l'eventuale esistente
ControllaErinomina();
//-----------------------------------------------------dalla tabella scrivo un txt
backgroundWorker1.ReportProgress(40);
CreaTxt(tabellaIndirizzi);
//fine
backgroundWorker1.ReportProgress(80);
}
catch (Exception ex)
{
PushErrorStatus(ex.Message);
done = true;
}
}
#endregion
//voodoo made by 1st worker
//then it will start worker2
#region helpers
//se c'è un altro file txt target nella directory lo rinomino con la data del giorno (es: EstrazioneIndirizziCO_20151111.txt)
private void ControllaErinomina()
{
PushStatus("Reading configuration");
Log.ScriviLog("ControllaErinomina... Start ");
string pathOut = UtilityManager.getAppSetting("Application_Folder");
PushStatus("Application Folder " + pathOut);
string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"];
PushStatus("Estensione File Host " + estensioneFile);
string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"];
PushStatus("Nome File Host " + nomeFile);
string ftpServerHost = ConfigurationManager.AppSettings["FTPServerHost"];
PushStatus("FTP Server host " + ftpServerHost);
string nomeFileOut = nomeFile + estensioneFile;
string extensionFilter = nomeFileOut;
string[] filePaths = Directory.GetFiles(pathOut, extensionFilter);
if (filePaths.Length > 0)
{
try
{
//il file è stato trovato, lo rinomino
string nuovoNomeFile = nomeFile + "_" + DateTime.Now.ToString("yyyyMMdd") + estensioneFile;
string oldPath = pathOut + "\\" + nomeFileOut;
string newPath = pathOut + "\\" + nuovoNomeFile;
System.IO.File.Move(oldPath, newPath);
}
catch (Exception e)
{
PushErrorStatus(e.Message);
//probabilmente il file già esiste non faccio nulla;
}
}
PushSuccessStatus("Reading configuration completed ");
Log.ScriviLog("ControllaErinomina... Fine ");
}
private void CreaTxt(DataTable tabellaIndirizzi)
{
Log.ScriviLog("CreaTxt... Start ");
string pathOut = UtilityManager.getAppSetting("Application_Folder");
string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"];
string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"];
string nomeFileOut = nomeFile + estensioneFile;
//StreamWriter outFile = new StreamWriter(pathOut + @"\EstrazioneIndirizziCO.txt");
StreamWriter outFile = new StreamWriter(pathOut + @"\" + nomeFileOut);
//scrivo il record iniziale
outFile.WriteLine("FLUSSOANAGRAFICA" + DateTime.Now.ToString("yyyyMMdd"));
//ciclo sulla tabella
Anagrafica anagagrafica = new Anagrafica();
foreach (DataRow dr in tabellaIndirizzi.Rows)
{
anagagrafica.codiceFiscale = Convert.ToString(dr["codiceFiscale"]);
anagagrafica.codiceContratto = Convert.ToString(dr["contratto"]);
anagagrafica.indirizzo = Convert.ToString(dr["indirizzo"]);
anagagrafica.provincia = Convert.ToString(dr["provincia"]);
anagagrafica.citta = Convert.ToString(dr["citta"]);
anagagrafica.cap = Convert.ToString(dr["cap"]);
anagagrafica.presso = Convert.ToString(dr["presso"]);
anagagrafica.nazione = Convert.ToString(dr["nazione"]);
anagagrafica.email = Convert.ToString(dr["email"]);
string riga = anagagrafica.codiceFiscale + anagagrafica.codiceContratto + anagagrafica.indirizzo + anagagrafica.provincia +
anagagrafica.citta + anagagrafica.cap + anagagrafica.presso + anagagrafica.nazione + anagagrafica.email;
outFile.WriteLine(riga);
}
outFile.WriteLine("ZZZZZZZZZZZZZZZZ99999999999");
outFile.Close();
Log.ScriviLog("CreaTxt... Fine ");
}
private DataTable LanciaEstrazioneIndirizzi()
{
Log.ScriviLog("LanciaEstrazioneIndirizzi... Start ");
List<Parametro> parametri = new List<Parametro>();
DataTable tabellaIndirizzi = DataAccess.ExecuteDataTableStoredProcedure(DBProvider.SqlServerStampeC6, "[dbo].[Estrazione_Indirizzi_CO]", parametri);
Log.ScriviLog(tabellaIndirizzi.Rows.Count + " righe estratte");
Log.ScriviLog("LanciaEstrazioneIndirizzi... Fine ");
return tabellaIndirizzi;
}
private void rinominaFileFtp()
{
Log.ScriviLog("rinominaFileFtp... Start ");
//preso qui: https://social.msdn.microsoft.com/Forums/en-US/8c541130-b571-4b1a-9117-ac610f3e8b34/ftpwebrequestrenameto-property?forum=netfxnetcom
string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"];
string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"];
string nomeFileHost = nomeFile + estensioneFile;
string FileUri = ConfigurationManager.AppSettings["FTPServerHost"] + nomeFileHost;
//string FileUri = "ftp://someftp/somedir/test.tmp";
FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create(FileUri);
ftp.Method = WebRequestMethods.Ftp.Rename;
ftp.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["FTPUserHost"], ConfigurationManager.AppSettings["FTPPasswordHost"]);
//ftp.Credentials = new NetworkCredential(UserName, Password);
//Don't include the path
string nuovoNomeFile = nomeFile + "_" + DateTime.Now.ToString("yyyyMMdd") + estensioneFile;
ftp.RenameTo = nuovoNomeFile;
FtpWebResponse r = (FtpWebResponse)ftp.GetResponse();
Log.ScriviLog("rinominaFileFtp... Fine response {0} " + r.StatusDescription);
}
private void inviaFlussoHostFTP()
{
Log.ScriviLog("inviaFlussoHostFTP... Start ");
string estensioneFile = "." + ConfigurationManager.AppSettings["EstensioneFileHost"];
string nomeFile = ConfigurationManager.AppSettings["NomeFileHost"];
string nomeFileBackup = nomeFile + estensioneFile;
//string pathFileBackup = ConfigurationManager.AppSettings["PathFileHostBackup"];
//if (!pathFileBackup.EndsWith("\\"))
// pathFileBackup += "\\";
//pathFileBackup += nomeFileBackup;
string nomeFileHost = nomeFile + estensioneFile;
//StringBuilder flussoHost = new StringBuilder();
//flussoHost.Append(pathFileBackup.ToString() + "\r\n");
string pathFileStream = ConfigurationManager.AppSettings["Application_Folder"] + "\\" + nomeFileHost;
Log.ScriviLog("inviaFlussoHostFTP... invio il file" + pathFileStream);
StreamReader sourceStream = new StreamReader(pathFileStream);
//byte[] flussoInByte = StrToByteArray(flussoHost.ToString());
byte[] flussoInByte = Encoding.UTF8.GetBytes(sourceStream.ReadToEnd());
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(ConfigurationManager.AppSettings["FTPServerHost"] + nomeFileHost);
request.Method = WebRequestMethods.Ftp.UploadFile;
request.ContentLength = flussoInByte.Length;
request.Credentials = new NetworkCredential(ConfigurationManager.AppSettings["FTPUserHost"], ConfigurationManager.AppSettings["FTPPasswordHost"]);
byte[] buffer = new byte[4096];
using (Stream writer = request.GetRequestStream())
using (MemoryStream ms = new MemoryStream(flussoInByte))
{
int bytesRead = 0;
int totalBytes = 0;
do
{
bytesRead = ms.Read(buffer, 0, buffer.Length);
if (bytesRead > 0)
{
writer.Write(buffer, 0, bytesRead);
totalBytes += bytesRead;
}
} while (bytesRead > 0);
}
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
//V
//LogFTP(response);
//
response.Close();
//File.WriteAllBytes(pathFileBackup, flussoInByte);
Log.ScriviLog("inviaFlussoHostFTP... Fine, status {0} " + response.StatusDescription);
}
#endregion
//not helping the User tho, just for us
}
}