Files
GMW/GMW/WebUserControls/mod_animeMult.ascx.cs
T

691 lines
27 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Net;
using SteamWare;
using GMW_data;
namespace GMW.WebUserControls
{
public partial class mod_animeMult : System.Web.UI.UserControl
{
/// <summary>
/// flusso associato (hard coded) a Anime EXT
/// </summary>
protected string flusso = "AN";
/// <summary>
/// stato associato (hard coded) a Anime EXT
/// </summary>
protected string statoUDC = "AnimExt";
/// <summary>
/// dati x verifica CodSoggetto / matricola
/// </summary>
protected string preCodSogg = memLayer.ML.confReadString("prefCodSogg");
public event EventHandler eh_reqUpdate;
/// <summary>
/// stringa UID univoca
/// </summary>
public string uid
{
get
{
return this.UniqueID.Replace("$", "_").Replace("-", "_");
}
}
/// <summary>
/// caricamento pagina
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
traduciObj();
checkNumKeyIn();
}
doChecks();
}
/// <summary>
/// verifico se ci sia in sessione un input da NumKeyb e nel caso lometto in barcodeIn e processo...
/// </summary>
private void checkNumKeyIn()
{
if (memLayer.ML.isInSessionObject("numKeyIn"))
{
barcodeIn = memLayer.ML.StringSessionObj("numKeyIn");
// svuoto valore in sessione...
memLayer.ML.emptySessionVal("numKeyIn");
// controllo barcode...
checkBarcode();
}
}
/// <summary>
/// richiesta (ri)stampa UDC
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void ristampa()
{
bool fatto = false;
// registro ri-stampa UDC
DateTime adesso = DateTime.Now;
// calcolo particolare...
DS_magazzino.ElencoCartelliniRow rigaUDC;
string particolare = "";
try
{
rigaUDC = MagClass.magazzino.taCartellini.getByUdc(udcReq)[0];
particolare = rigaUDC.Particolare;
fatto = MagClass.magazzino.ristampaUdc(udcReq, Postazione.printer, Request.UserHostName);
}
catch
{
logger.lg.scriviLog(string.Format("Errore recupero particolare UDC AnimeExt {0}", udcReq), tipoLog.EXCEPTION);
}
if (fatto) MagClass.magazzino.taSAO.insertQuery(adesso, MagClass.magazzino.CodSoggCurrUser, Postazione.name, Postazione.IP, udcReq, particolare, "stampaUDC", "Ri-Stampato UDC Anime Mult");
}
/// <summary>
/// udc da stampare
/// </summary>
protected string udcReq
{
get
{
return memLayer.ML.StringSessionObj("udcSelSAO");
}
}
/// <summary>
/// controlla particolare selezionato
/// </summary>
private void checkParticolare()
{
if (currParticolare != "")
{
lblParticolareAttivo.Text = string.Format("Particolare selezionato <b>{0}</b>", currParticolare);
// aggiungo descrizione del particolare
string descr = "";
string disegno = "";
try
{
DS_magazzino.AnagParticolariRow riga = MagClass.magazzino.taAnagPart.likeSearch(currParticolare, memLayer.ML.StringSessionObj("CodCS"))[0];
descr = riga.DescParticolare;
disegno = string.Format("( {0} )", riga.DisegnoGrezzo);
}
catch
{ }
lblDescrAttivo.Text = descr;
lblDisegno.Text = disegno;
}
else
{
lblParticolareAttivo.Text = "...";
lblDescrAttivo.Text = "";
lblDisegno.Text = "";
}
}
/// <summary>
/// effettua controlli visibilità
/// </summary>
private void doChecks()
{
checkBarcode();
checkStampa();
checkParticolare();
}
/// <summary>
/// sistemo labels oggetti
/// </summary>
private void traduciObj()
{
//txtBox
txtQta.Text = memLayer.ML.confReadString("QtaImballoAnime");
txtQtaUDC.Text = "0";
txtNumUDC.Text = "0";
// buttons
btnEmptyNote.Text = traduci("btnEmptyNote");
}
/// <summary>
/// wrapper traduzione
/// </summary>
/// <param name="lemma"></param>
/// <returns></returns>
public string traduci(object lemma)
{
return user_std.UtSn.Traduci(lemma.ToString());
}
/// <summary>
/// indica il codice articolo correntemente selezionato
/// </summary>
protected string currParticolare
{
get
{
return memLayer.ML.StringSessionObj(string.Format("currParticolare_{0}", uid));
}
set
{
memLayer.ML.setSessionVal(string.Format("currParticolare_{0}", uid), value, memLayer.ML.confReadBool("keepParticolareSel"));
}
}
/// <summary>
/// indica se i caratteri vadano forzati a maiuscoli
/// </summary>
public bool forceUppercase
{
get
{
return memLayer.ML.confReadBool("forceUppercase");
}
}
/// <summary>
/// num pezzi dell'ultimo UDC del particolare generato
/// </summary>
public int pezziUdc
{
get
{
int answ = 0;
try
{
answ = (int)MagClass.magazzino.taCartellini.getLastByParticolareStato(memLayer.ML.StringSessionObj("CodCS"), currParticolare, statoUDC)[0].Qta;
}
catch
{ }
return answ;
}
}
/// <summary>
/// decodifica il tipo barcode acquisito
/// </summary>
public tipoCodiceBarcode tipoBCode
{
get
{
tipoCodiceBarcode answ = tipoCodiceBarcode.ND;
int trovati = 0;
int matricola = -1;
// provo a convertire in intero barcode x verifica eventuale matricola...
try
{
matricola = Convert.ToInt32(barcodeIn);
}
catch
{ }
// controllo non si tratti di un comando...
string preCmd = memLayer.ML.confReadString("prefComandi");
if (barcodeIn.StartsWith(preCmd))
{
answ = tipoCodiceBarcode.Comando;
}
else if ((TermClass.Ter.riconosciBarcode(barcodeIn) == tipoCodiceBarcode.Particolare) && TermClass.Ter.isAnima(barcodeIn)) // è un particolare... ed un anima...
{
answ = tipoCodiceBarcode.Particolare;
}
else if (barcodeIn.StartsWith(preCodSogg))
{
// cerco cod soggetto...
if (DataProxy.obj.taTrascSogg.getByKey(barcodeIn, 0).Rows.Count == 1)
{
answ = tipoCodiceBarcode.Operatore;
}
}
else if (matricola >= 0)
{
if (DataProxy.obj.taTrascSogg.getByKey("", matricola).Rows.Count == 1)
{
answ = tipoCodiceBarcode.Operatore;
}
}
else
{
try
{
// cerco tra gitterbox (UDC)...
trovati = MagClass.magazzino.taCartellini.getByUdc(barcodeIn).Rows.Count;
if (trovati > 0)
{
answ = tipoCodiceBarcode.UDC;
}
}
catch
{
}
}
return answ;
}
}
/// <summary>
/// valore barcode
/// </summary>
public string barcodeIn
{
get
{
return txtBarcode.Text.Trim();
}
set
{
txtBarcode.Text = value;
}
}
/// <summary>
/// qta pezzi TOTALE
/// </summary>
public int qta
{
get
{
int qta = 0;
try
{
qta = Convert.ToInt32(txtQta.Text.Trim());
}
catch
{ }
return qta;
}
set
{
txtQta.Text = value.ToString();
}
}
/// <summary>
/// qta pezzi x UDC
/// </summary>
public int qtaUDC
{
get
{
int qtaUDC = 0;
try
{
qtaUDC = Convert.ToInt32(txtQtaUDC.Text.Trim());
}
catch
{ }
return qtaUDC;
}
set
{
txtQtaUDC.Text = value.ToString();
}
}
/// <summary>
/// num UDC
/// </summary>
public int numUDC
{
get
{
int numUDC = 0;
try
{
numUDC = Convert.ToInt32(txtNumUDC.Text.Trim());
}
catch
{ }
return numUDC;
}
set
{
txtNumUDC.Text = value.ToString();
}
}
/// <summary>
/// controlla se ci sia un barcode
/// </summary>
private void checkBarcode()
{
if (barcodeIn != "")
{
Postazione.messaggiText = string.Format("Barcode digitato: {0}", barcodeIn);
switch (tipoBCode)
{
case tipoCodiceBarcode.Particolare:
// imposto il particolare corrente
currParticolare = barcodeIn;
// controllo esista il particolare scansionato
if (DataProxy.obj.taAnagParticolari.getByParticolare(currParticolare).Rows.Count == 0)
{
currParticolare = "";
Postazione.messaggiText += " - codice particolare non valido / non trovato in RILPRO.";
Postazione.CssClass = "stileComandoKo";
}
else
{
Postazione.messaggiText += " - impostato particolare!";
Postazione.CssClass = "stileComandoOk";
}
// leggo la qta dell'ultimo UDC del particolare, SE C'E', e la imposto...
if (pezziUdc > 0)
{
txtQta.Text = pezziUdc.ToString();
}
else // rimette default
{
txtQta.Text = memLayer.ML.confReadString("QtaImballoAnime");
}
break;
case tipoCodiceBarcode.UDC:
// procedo solo se UDC esistente
if (MagClass.magazzino.checkUDC(barcodeIn))
{
// recupero il particolare dai dati del cartellino preesistente
currParticolare = DataProxy.obj.taCartellini.stp_getByUdc(barcodeIn)[0].Particolare;
// controllo esista il particolare
if (DataProxy.obj.taAnagParticolari.getByParticolare(currParticolare).Rows.Count == 0)
{
currParticolare = "";
Postazione.messaggiText += " - codice particolare da UDC non valido / non trovato in RILPRO.";
Postazione.CssClass = "stileComandoKo";
}
else
{
Postazione.messaggiText += " - impostato particolare!";
Postazione.CssClass = "stileComandoOk";
}
}
break;
case tipoCodiceBarcode.Operatore:
// calcolo matricola utente
int MatrUtente = -1;
string preCodSogg = memLayer.ML.confReadString("prefCodSogg");
if (barcodeIn.StartsWith(preCodSogg))
{
MatrUtente = DataProxy.obj.taTrascSogg.getByKey(barcodeIn, 0)[0].CodMatricola;
}
else
{
MatrUtente = Convert.ToInt32(barcodeIn);
}
if (MatrUtente >= 0)
{
// salvo in sessione operatore con AUTH
OpAuth.startOpAuth(MatrUtente);
// mostro che ho autorizzato...
Postazione.messaggiText += traduci("userAuthRec");
Postazione.CssClass = "stileComandoOk";
Response.Redirect(user_std.pagCorrente);
}
else
{
Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
Postazione.CssClass = "stileComandoND";
}
break;
default:
// cerco se sia "0" = reset utente...
if (barcodeIn == memLayer.ML.CRS("resetCodSogg"))
{
// salvo in sessione operatore con AUTH
OpAuth.stopAuth();
// mostro che ho autorizzato...
Postazione.messaggiText += traduci("userAuthRem");
Postazione.CssClass = "stileComandoOk";
Response.Redirect(user_std.pagCorrente);
}
Postazione.messaggiText += " - codice <b>non riconosciuto</b>!";
Postazione.CssClass = "stileComandoND";
break;
}
barcodeIn = "";
}
doUpdate();
}
/// <summary>
/// aggiorna tabella + focus a barcode
/// </summary>
public void doUpdate()
{
updatePart();
// raise dell'evento
if (eh_reqUpdate != null)
{
eh_reqUpdate(this, new EventArgs());
}
checkStampa();
txtBarcode.Focus();
}
/// <summary>
/// aggiorna visualizzazioen dati particolare
/// </summary>
private void updatePart()
{
if (currParticolare != "")
{
lblParticolareAttivo.Text = string.Format("{0} <b>{1}</b>", traduci("particSel"), currParticolare);
// aggiungo descrizione del particolare
string descr = "";
string disegno = "";
try
{
DS_magazzino.AnagParticolariRow riga = MagClass.magazzino.taAnagPart.likeSearch(currParticolare, memLayer.ML.StringSessionObj("CodCS"))[0];
descr = riga.DescParticolare;
disegno = string.Format("( {0} )", riga.DisegnoGrezzo);
}
catch
{ }
lblDescrAttivo.Text = descr;
lblDisegno.Text = disegno;
}
else
{
lblParticolareAttivo.Text = "...";
lblDescrAttivo.Text = "";
lblDisegno.Text = "";
}
}
/// <summary>
/// controllo l'abilitazioen alla stampa UDC:
/// - particolare ok
/// - qta > 0
/// - almeno 1 trattamento
/// altrimenti disabilito btn stampa
/// </summary>
private void checkStampa()
{
bool stampaOk = false;
//controllo siano inseriti valori qta
if (qta > 0 && qtaUDC > 0 && numUDC > 0)
{
// controllo ci siano particolare e qta tornino (numUdc x qtaUdc = qtaTOT)
if (currParticolare != "" && ((numUDC * qtaUDC) == qta))
{
stampaOk = true;
}
}
divNote.Visible = stampaOk;
}
/// <summary>
/// genera i barcode di
/// - trattamenti
/// - nuovo x pezzi liquidi
/// e lancia la relativa stampa
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void lbtStampaUDC_Click(object sender, EventArgs e)
{
bool needsRedirect = false;
// verifico postazione x procedere...
if (Postazione.printer != "n.d.")
{
// verifico auth utente OPPURE se NON sia richiesta...
if (OpAuth.isAuth || !OpAuth.opAuthReq)
{
string newUdcChild = "";
int qta = memLayer.ML.confReadInt("QtaImballoAnime");
string noteTrim = txtNote.Text.Trim();
try
{
qta = Convert.ToInt32(txtQtaUDC.Text);
}
catch
{ }
// effettuo controlli che cod_soggetto e cod particolare siano disponibili...
string codSogg = "";
string particolare = "";
try
{
codSogg = MagClass.magazzino.CodSoggCurrUser;
particolare = currParticolare;
}
catch
{
}
if (codSogg != "" && particolare != "")
{
for (int i = 0; i < numUDC; i++)
{
// genero cartellino anima
DateTime adesso = DateTime.Now;
try
{
// creo nuovo UDC anime multiple
newUdcChild = MagClass.magazzino.creaUdc(flusso, "", currParticolare, "", "", "", "", "", 0, memLayer.ML.confReadString("CodImballoAnime"), "U", MagClass.magazzino.CodSoggCurrUser, qta, 0, 0, adesso, 0, statoUDC, memLayer.ML.confReadInt("IdxPosizioneAnimeExt"), "IdxPosizioneAnimeExt", "UDC_ANIMA", noteTrim, "", adesso.Year, Request.UserHostName);
if (OpAuth.isAuth)
{
// salvo attributo dell'OpAuth...
MagClass.magazzino.taAtt2UDC.Insert(newUdcChild, memLayer.ML.CRS("attrOpAuth"), OpAuth.currAuth.CodSoggetto, DateTime.Now, codSogg);
// consumo una auth...
OpAuth.currAuth.remAuth--;
if (OpAuth.currAuth.remAuth == 0)
{
OpAuth.stopAuth();
needsRedirect = true;
}
}
// registro creazione nuovo UDC
MagClass.magazzino.taSAO.insertQuery(adesso, codSogg, Postazione.name, Postazione.IP, newUdcChild, particolare, "creaUDC", string.Format("Creato nuovo UDC Anime EX, qta: {0} {1}", qta, noteTrim));
}
catch (Exception exc)
{
httpLog(string.Format("Errore creazione UDC anime mult: {0}", exc), tipoLog.EXCEPTION);
}
// se ho cart liquidi genero (se non ci sono) cart trattamenti
if (newUdcChild != "")
{
/***************************************************************************************
* dopo che l'ho creato lo sposto da post anime ext a post anime int (NO UPDATE AS400...)
* IdxPosizioneAnimeExt --> IdxPosizioneAnime
* !!! DEVO CALCOLARE LA CELLA !!! parto dal blocco calcolato da tab transizioni
***************************************************************************************/
int idxBloccoTo = StateMachine.SM.getIdxBloccoTo("UDC_ANIMA", memLayer.ML.confReadInt("IdxPosizioneAnimeExt"));
int idxCellaTo = 0;
try
{
idxCellaTo = MagClass.magazzino.taCelle.getByIdxBlocco(idxBloccoTo)[0].IdxCella;
}
catch
{ }
if (idxCellaTo != 0)
{
MagClass.magazzino.spostaUDC(memLayer.ML.StringSessionObj("CodCS"), newUdcChild, idxCellaTo, memLayer.ML.confReadBool("spostaUdcResettaLdp"), Request.UserHostName);
// incremento timing...
adesso = DateTime.Now;
adesso = adesso.AddSeconds(1);
// registro creazione nuovo UDC
MagClass.magazzino.taSAO.insertQuery(adesso, codSogg, Postazione.name, Postazione.IP, newUdcChild, particolare, "spostaUDC", "Sposta UDC Anime EXT in Int");
}
// ora stampo il nuovo cartellino!!!
MagClass.magazzino.stampaUdc(newUdcChild, Postazione.printer, tipoCartellino.cartAnime, Request.UserHostName);
// incremento timing...
adesso = DateTime.Now;
adesso = adesso.AddSeconds(2);
// registro stampa nuovo UDC
MagClass.magazzino.taSAO.insertQuery(adesso, codSogg, Postazione.name, Postazione.IP, newUdcChild, particolare, "stampaUDC", "Stampato UDC Anime EXT");
}
}
// resetto
doResetData();
}
else
{
httpLog(string.Format("ANIME MULTIPLE, Errore persi utente/particolare, ricarico!"), tipoLog.ERROR);
Response.Redirect("~/login.aspx");
}
}
else
{
Postazione.messaggiText = traduci("noOpAuth");
Postazione.CssClass = "stileComandoKo";
httpLog(string.Format("Errore manca OpAuth x UDC anime"), tipoLog.ERROR);
}
}
else
{
Response.Redirect("~/menu.aspx");
}
// raise dell'evento
if (eh_reqUpdate != null)
{
eh_reqUpdate(this, new EventArgs());
}
if (needsRedirect)
{
Response.Redirect(user_std.pagCorrente);
}
}
/// <summary>
/// wrapper per log con salvataggio dell'IP del chiamante
/// </summary>
/// <param name="_testoPre"></param>
/// <returns></returns>
public bool httpLog(string _testoPre)
{
bool answ = false;
logger.lg.scriviLog(Postazione.IP + _testoPre);
return answ;
}
/// <summary>
/// wrapper per log con salvataggio dell'IP del chiamante
/// </summary>
/// <param name="_testoPre"></param>
/// <returns></returns>
public bool httpLog(string testoLog, tipoLog tipo)
{
bool answ = false;
logger.lg.scriviLog(Postazione.IP + testoLog, tipo);
return answ;
}
/// <summary>
/// effettua reset dati
/// </summary>
private void doResetData()
{
// resetto i dati QtaTot e particolare...
qta = 0;
currParticolare = "";
txtQta.Text = "";
doChecks();
}
/// <summary>
/// svuoto le note
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnEmptyNote_Click(object sender, EventArgs e)
{
txtNote.Text = "";
Postazione.messaggiText = traduci("AttesaBCode");
Postazione.CssClass = "stileAttesa";
// raise dell'evento
if (eh_reqUpdate != null)
{
eh_reqUpdate(this, new EventArgs());
}
}
}
}