using ApiSoftway.Models; using ApiSoftway.Models.Gesa_DbContext; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal; using Microsoft.Extensions.Configuration; using Microsoft.IdentityModel.Tokens; using System; using System.Diagnostics; using System.IdentityModel.Tokens.Jwt; using System.Runtime.InteropServices; using System.Security.Claims; using System.Text; namespace ApiSoftway.Controllers { [Route("api/[controller]")] [ApiController] public class GiriController : ControllerBase { private readonly ILogger _logger; private readonly GESA_GIRI_DbContext _giri_context; private readonly GESA_GIRICONSEGNE_DbContext _giricons_context; private readonly GESA_DESTINAZIONI_DbContext _destinazioni_context; private readonly GESA_CONSEGNE_DbContext _consegne_context; private readonly GESA_GIRICONSEGNEVISTA_DbContext _consegnevista_context; private readonly GESA_SBR_ORD_DbContext _sbrord_context; private readonly GESA_PERSONALE_DbContext _personale_context; private readonly GESA_AUTOMEZZI_DbContext _automezzi_context; private readonly IConfiguration? _configuration; private readonly GESA_GIRICONSEGNEDACREARE_DbContext _daCreare_context; private readonly GESA_CONSEGNE_M_DbContext _consegne_m_context; private DbSet? _giri; private DbSet? _giriCons; private DbSet? _giriConsView; private DbSet? _destinazioni; private DbSet? _consegne; private DbSet? _sbrord; private DbSet? _personale; private DbSet? _automezzi; private DbSet? _GiriDaCreare; private DbSet? _testate; public GiriController(ILogger logger, IConfiguration? configuration, GESA_GIRI_DbContext giri_context, GESA_DESTINAZIONI_DbContext destinazioni_context , GESA_CONSEGNE_DbContext consegne_context, GESA_GIRICONSEGNE_DbContext giricons_context, GESA_GIRICONSEGNEVISTA_DbContext consegnevista_context, GESA_SBR_ORD_DbContext sbrord_context , GESA_PERSONALE_DbContext personale_context, GESA_AUTOMEZZI_DbContext automezzi_context, GESA_GIRICONSEGNEDACREARE_DbContext daCreare_context , GESA_CONSEGNE_M_DbContext consegne_m_context) { _logger = logger; _configuration = configuration; _giri_context = giri_context; _destinazioni_context = destinazioni_context; _consegne_context = consegne_context; _giricons_context = giricons_context; _consegnevista_context = consegnevista_context; _sbrord_context = sbrord_context; _personale_context= personale_context; _automezzi_context = automezzi_context; _daCreare_context = daCreare_context; _consegne_m_context = consegne_m_context; } [HttpGet("listaGiri")] public async Task>> listaGiri(string? autista, DateTime? data, bool aperto=true) { List lst = new List(); _giriConsView = _consegnevista_context.GiriView; var gc= aperto?await _giriConsView.Where(t=>t.DataChiusura==null).OrderByDescending(t => t.DataGiro).ToListAsync(): await _giriConsView.Where(t => t.DataChiusura != null).OrderByDescending(t => t.DataGiro).ToListAsync(); if(data!=null) { gc= gc.Where(t=>t.DataGiro!=null && t.DataGiro==data).ToList(); } if (!string.IsNullOrEmpty( autista)) { gc = gc.Where(t => t.CodAutista != null && t.CodAutista.Trim().Equals(autista.Trim())).ToList(); } return gc; } [HttpGet("listaGiriDaCreare")] public async Task>> listaGiriDaCreare() { List lst = new List(); _GiriDaCreare = _daCreare_context.GiriDaCreare; var gc = await _GiriDaCreare.OrderByDescending(t => t.DataGiro).ToListAsync() ; return gc; } [HttpGet("listaGiriDaCreareByData")] public async Task>> listaGiriDaCreareByData(DateTime dt) { List lst = new List(); _GiriDaCreare = _daCreare_context.GiriDaCreare; var gc = await _GiriDaCreare.Where(t=>t.DataGiro.Equals(dt)).OrderByDescending(t => t.DataGiro).ToListAsync(); return gc; } [HttpGet("listaAutisti")] public async Task>> listaAutisti() { _personale = _personale_context.Personale; //var pers = await _personale.Where(t => t.Tcuser != null && t.Tcpwd != null && t.Tcruolo!=null && t.Tcruolo.Equals("AUT")).ToListAsync(); var pers = await _personale.Where(t => t.Tcruolo.Equals("AUT")).ToListAsync(); return pers; } [HttpGet("listaAutomezzi")] public async Task>> listaAutomezzi() { _automezzi = _automezzi_context.Automezzi; var aut = await _automezzi.ToListAsync(); return aut; } /// Salva i dati della consegna [HttpPost] [Route("addGiro")] public async Task> addGiro(string? autista,int? bancali, decimal? importo, DateTime? data) { GiriConsegna_out tOut = new GiriConsegna_out(); //string usr = getClaimValueByToken(token, "codice"); try { //step 1 : calcolo il nuovo seriale _giriConsView = _consegnevista_context.GiriView; var ser= await _giriConsView.Take(1).OrderByDescending(t => t.SerialeGiro).ToListAsync(); string ultSer = ser.First().SerialeGiro; string newSer = calcolaNuovoSeriale(ultSer); //step 2 : inserisco in PIGIRCON GiriConsegna gc=new GiriConsegna(); gc.Piautist = autista; gc.Pitbancar = bancali; gc.Pidata = data; gc.Pisergir = newSer; gc.Pidarecu = importo; using (var transactionGiri = _giricons_context.Database.BeginTransaction()) { await _giricons_context.GiriCons.AddAsync(gc); await _giricons_context.SaveChangesAsync(); transactionGiri.Commit(); } //step 3 aggiorno con il seriale le righe delle destinazioni _destinazioni = _destinazioni_context.Destinazioni; var dest = await _destinazioni.Where(t => t.CodAutista != null && t.CodAutista.Equals(autista) && t.DataCarico != null && t.DataCarico == data && t.serialeGiro==null).OrderByDescending(t => t.DataCarico).ToListAsync(); foreach(Destinazioni d in dest) { Sbr_ord sbr_Ord = new Sbr_ord(); sbr_Ord.Brserial = d.Brserial; sbr_Ord.Pisergir = newSer; using (var transactionDest = _sbrord_context.Database.BeginTransaction()) { _sbrord_context.Entry(sbr_Ord).State = EntityState.Modified; await _sbrord_context.SaveChangesAsync(); transactionDest.Commit(); } } var giro = await _giriConsView.Where(t=>t.SerialeGiro.Equals(newSer)).ToListAsync(); return StatusCode(StatusCodes.Status200OK, giro.First()); } catch (Exception ex) { string errmsg = ex.InnerException != null ? ex.InnerException.Message : ex.Message; tOut.err_title = ex.Message; tOut.err_detail = errmsg; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } } [HttpPost] [Route("addGiro2")] public async Task> addGiro2([FromBody] GiriConsegnaView model) { GiriConsegna_out tOut = new GiriConsegna_out(); //string usr = getClaimValueByToken(token, "codice"); try { //step 1 : calcolo il nuovo seriale _giriConsView = _consegnevista_context.GiriView; var ser = await _giriConsView.Take(1).OrderByDescending(t => t.SerialeGiro).ToListAsync(); string ultSer = "0"; if (ser!=null && ser.Count>0) { ultSer = ser.First().SerialeGiro; } string newSer = calcolaNuovoSeriale(ultSer); //step 2 : inserisco in PIGIRCON GiriConsegna gc = new GiriConsegna(); gc.Piautist = model.CodAutista; gc.Pitbancar = model.BancaliCaricati; gc.Pidata = model.DataGiro; gc.Pisergir = newSer; gc.Pidarecu = model.ImportoDaRecuperare; gc.Pimezzo = model.CodMezzo; using (var transactionGiri = _giricons_context.Database.BeginTransaction()) { await _giricons_context.GiriCons.AddAsync(gc); await _giricons_context.SaveChangesAsync(); transactionGiri.Commit(); } //step 3 aggiorno con il seriale le righe delle destinazioni _destinazioni = _destinazioni_context.Destinazioni; var dest = await _destinazioni.Where(t => t.CodAutista != null && t.CodAutista.Equals(model.CodAutista) && t.DataCarico != null && t.DataCarico == model.DataGiro && t.serialeGiro == null && t.CodAutomezzo!=null && t.CodAutomezzo.Equals(model.CodMezzo)).OrderByDescending(t => t.DataCarico).ToListAsync(); foreach (Destinazioni d in dest) { Sbr_ord sbr_Ord = new Sbr_ord(); sbr_Ord.Brserial = d.Brserial; sbr_Ord.Pisergir = newSer; using (var transactionDest = _sbrord_context.Database.BeginTransaction()) { _sbrord_context.Entry(sbr_Ord).State = EntityState.Modified; await _sbrord_context.SaveChangesAsync(); transactionDest.Commit(); } } var giro = await _giriConsView.Where(t => t.SerialeGiro.Equals(newSer)).ToListAsync(); return StatusCode(StatusCodes.Status200OK, giro.First()); } catch (Exception ex) { string errmsg = ex.InnerException != null ? ex.InnerException.Message : ex.Message; tOut.err_title = ex.Message; tOut.err_detail = errmsg; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } } [HttpPost] [Route("closeGiro")] public async Task> closeGiro(string? serialeGiro, int? bancaliRecuperati, decimal? importoRecuperato) { GiriConsegna_out tOut = new GiriConsegna_out(); //string usr = getClaimValueByToken(token, "codice"); try { //step 1 : calcolo il nuovo seriale _giriConsView = _consegnevista_context.GiriView; var giro = await _giriConsView.Where(t=>t.SerialeGiro!=null && t.SerialeGiro.Equals(serialeGiro)).FirstAsync(); GiriConsegna gc=new GiriConsegna(); gc.Pisergir = giro.SerialeGiro; gc.Pidarecu = giro.ImportoDaRecuperare; gc.Piautist = giro.CodAutista; gc.Pirecupe = importoRecuperato; gc.Pidata = giro.DataGiro; gc.Pidatchi = DateTime.Now; gc.Pitbancar = giro.BancaliCaricati; gc.Pitbanrec=bancaliRecuperati; using (var transactionGiri = _giricons_context.Database.BeginTransaction()) { _giricons_context.Entry(gc).State = EntityState.Modified; await _giricons_context.SaveChangesAsync(); transactionGiri.Commit(); } giro = await _giriConsView.Where(t => t.SerialeGiro != null && t.SerialeGiro.Equals(serialeGiro)).FirstAsync(); tOut.Pisergir = giro.SerialeGiro; tOut.Pirecupe = giro.ImportoRecuperato; tOut.Pidarecu=giro.ImportoDaRecuperare; tOut.Piautist=giro.CodAutista; tOut.Pidata = giro.DataGiro; tOut.Pidatchi = giro.DataChiusura; tOut.Pitbancar = giro.BancaliCaricati; tOut.Pitbanrec = giro.BancaliRecuperati; return StatusCode(StatusCodes.Status200OK, tOut); } catch (Exception ex) { string errmsg = ex.InnerException != null ? ex.InnerException.Message : ex.Message; tOut.err_title = ex.Message; tOut.err_detail = errmsg; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } } [HttpPost] [Route("modGiro")] public async Task> modGiro(GiriConsegnaView model) { GiriConsegna_out tOut = new GiriConsegna_out(); try { //step 1 : calcolo il nuovo seriale GiriConsegna gc = new GiriConsegna(); gc.Pisergir = model.SerialeGiro; gc.Pidarecu = model.ImportoDaRecuperare; gc.Piautist = model.CodAutista; gc.Pirecupe = model.ImportoRecuperato; gc.Pidata = model.DataGiro; gc.Pidatchi = null; gc.Pitbancar = model.BancaliCaricati; gc.Pitbanrec = null; gc.Pimezzo = model.CodMezzo; using (var transactionGiri = _giricons_context.Database.BeginTransaction()) { _giricons_context.Entry(gc).State = EntityState.Modified; await _giricons_context.SaveChangesAsync(); transactionGiri.Commit(); } _giriConsView = _consegnevista_context.GiriView; var giro = await _giriConsView.Where(t => t.SerialeGiro != null && t.SerialeGiro.Equals(model.SerialeGiro)).FirstAsync(); tOut.Pisergir = giro.SerialeGiro; tOut.Pirecupe = giro.ImportoRecuperato; tOut.Pidarecu = giro.ImportoDaRecuperare; tOut.Piautist = giro.CodAutista; tOut.Pidata = giro.DataGiro; tOut.Pidatchi = giro.DataChiusura; tOut.Pitbancar = giro.BancaliCaricati; tOut.Pitbanrec = giro.BancaliRecuperati; return StatusCode(StatusCodes.Status200OK, tOut); } catch (Exception ex) { string errmsg = ex.InnerException != null ? ex.InnerException.Message : ex.Message; tOut.err_title = ex.Message; tOut.err_detail = errmsg; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } } [HttpPost] [Route("delGiro")] public async Task> delGiro(string? serialeGiro, string? autista, DateTime? data) { GiriConsegna_out tOut = new GiriConsegna_out(); //string usr = getClaimValueByToken(token, "codice"); try { //step 1 : controllo che si possa cancellare _destinazioni = _destinazioni_context.Destinazioni; var r = await _destinazioni.Where(t => t.CodAutista != null && t.CodAutista.Equals(autista) && t.DataCarico != null && t.DataCarico == data ).OrderByDescending(t => t.DataCarico).ToListAsync(); if (r.Count() > 0) { var destFatte = r.Where(x => x.consFattaSerial != null).ToList(); if (destFatte.Count > 0) { //messaggio di errore tOut.err_title = "Impossibile eliminare"; tOut.err_detail = "Impossibile eliminare il giro. Alcune consegne sono state già effettuate"; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } else { //step 2 : aggiorno le destinazioni cancellando il seriale del giro var dest = await _destinazioni.Where(t => t.CodAutista != null && t.CodAutista.Equals(autista) && t.DataCarico != null && t.DataCarico == data && t.serialeGiro != null).OrderByDescending(t => t.DataCarico).ToListAsync(); foreach (Destinazioni d in dest) { Sbr_ord sbr_Ord = new Sbr_ord(); sbr_Ord.Brserial = d.Brserial; sbr_Ord.Pisergir = null; using (var transactionDest = _sbrord_context.Database.BeginTransaction()) { _sbrord_context.Entry(sbr_Ord).State = EntityState.Modified; await _sbrord_context.SaveChangesAsync(); transactionDest.Commit(); } } //step 3 : cancello il giro GiriConsegna model=new GiriConsegna(); model.Pisergir = serialeGiro; using (var transaction = _giricons_context.Database.BeginTransaction()) { _giricons_context.Entry(model).State = EntityState.Deleted; await _giricons_context.SaveChangesAsync(); transaction.Commit(); } } } else { //il giro cretao non ha destinazioni associate. cancello solo il record detro pigircon GiriConsegna model = new GiriConsegna(); model.Pisergir = serialeGiro; using (var transaction = _giricons_context.Database.BeginTransaction()) { _giricons_context.Entry(model).State = EntityState.Deleted; await _giricons_context.SaveChangesAsync(); transaction.Commit(); } } return StatusCode(StatusCodes.Status200OK, tOut); } catch (Exception ex) { string errmsg = ex.InnerException != null ? ex.InnerException.Message : ex.Message; tOut.err_title = ex.Message; tOut.err_detail = errmsg; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } } [HttpGet("listaDestinazioni")] public async Task>> listaDestinazioni2(string token) { //step 1: ricavo la data a partire dal login string usr = getClaimValueByToken(token, "codice"); _giri = _giri_context.Giri; var g = await _giri.Where(t => t.Brautist != null && t.Brautist.Equals(usr)).OrderByDescending(t => t.Brdatcar).Take(1).ToListAsync(); DateTime? data = g.First().Brdatcar; List lst = new List(); _destinazioni = _destinazioni_context.Destinazioni; var r = await _destinazioni.Where(t => t.CodAutista != null && t.CodAutista.Equals(usr) && t.DataCarico != null && t.DataCarico == data && !string.IsNullOrEmpty(t.serialeGiro) ).OrderBy(t => t.serialeGiro).ToListAsync(); //2024-07-29: se un autista ha due o più giri da fare nello stesso giorno li devo separare. li ho ordinati per seriale giro e gli do quelli del primo // giro disponibile che non sia chiuso (PIDATCHI di GESAPIGIRCON deve essere nulla) int giro = 0; string seriale_attuale = string.Empty; foreach (Destinazioni d in r) { if(giro==0) { seriale_attuale = d.serialeGiro; } giro++; if(d.serialeGiro.Equals(seriale_attuale)) { Destinazioni_out o = new Destinazioni_out(); string _aut= !string.IsNullOrEmpty(d.Autista) ? d.Autista.Trim() : string.Empty; o.Autista = _aut; string _autCod = !string.IsNullOrEmpty(d.CodAutista) ? d.CodAutista.Trim() : string.Empty; o.CodAutista = _autCod; string _automezzo = !string.IsNullOrEmpty(d.DescAutomezzo) ? d.DescAutomezzo.Trim() : string.Empty; o.DescAutomezzo = _automezzo; string _automezzoCod = !string.IsNullOrEmpty(d.CodAutomezzo) ? d.CodAutomezzo.Trim() : string.Empty; o.CodAutomezzo = d.CodAutomezzo; o.DataCarico = d.DataCarico; o.Brserial = d.Brserial; o.Brmerce = d.Brmerce; o.Brnote = d.Brnote; o.Cproword = d.Cproword; o.Cprownum=d.Cprownum; string _sedeInd = !string.IsNullOrEmpty(d.IndirizzoSede) ? d.IndirizzoSede.Trim() : string.Empty; o.IndirizzoSede = _sedeInd; string _sede = !string.IsNullOrEmpty(d.Sede) ? d.Sede.Trim() : string.Empty; o.Sede = _sede; o.CodCommittente = d.CodCommittente; string _committente = !string.IsNullOrEmpty(d.Committente) ? d.Committente.Trim() : string.Empty; o.Committente = _committente; o.CodSede = d.CodSede; o.ItemList = formattaDestinazione(d); o.ImportoDaRitirare = d.ImportoDaRitirare; o.serialeGiro=d.serialeGiro; o.Casse = d.Casse; o.Trasf=d.Trasf; o.Colli=d.Colli; o.num_cons = d.num_cons; o.Uova=d.Uova; o.Cist=d.Cist; o.Note = d.Note; o.Seq = d.Seq; o.Prog = d.Prog; if (!string.IsNullOrEmpty(d.consFattaSerial)) { ConsegnaFatta cf=new ConsegnaFatta(); cf.consFattaSerial= d.consFattaSerial; cf.consFattaRow= d.consFattaRow; cf.consFattaAut= d.consFattaAut; cf.consFattaBanSca = d.consFattaBanSca; cf.consFattaBanCar= d.consFattaBanCar; string nota = !string.IsNullOrEmpty(d.consFattaNotBan) ? d.consFattaNotBan.Trim() : string.Empty; cf.consFattaNotBan= nota; cf.consFattaImpor=d.consFattaImpor; cf.consFattaMezzo= d.consFattaMezzo; string nota2 = !string.IsNullOrEmpty(d.consFattaNotImp) ? d.consFattaNotImp.Trim() : string.Empty; cf.consFattaNotImp=nota2; cf.consFattaFlagCons=d.consFattaFlagCons; cf.consFattaDataOra = d.consFattaDataOra; o.ConsFatta=cf; } lst.Add(o); } } return lst; } [HttpGet("listaDestinazioniByAutistaDataMezzo")] public async Task>> listaDestinazioniByAutistaData(string autista, DateTime? dataGiro,string mezzo) { List lst = new List(); _destinazioni = _destinazioni_context.Destinazioni; var r = await _destinazioni.Where(t => t.CodAutista != null && t.CodAutista.Equals(autista) && t.DataCarico != null && t.DataCarico == dataGiro && t.CodAutomezzo!=null && t.CodAutomezzo.Equals(mezzo)).OrderByDescending(t => t.DataCarico).ThenBy(t=>t.Seq).ToListAsync(); foreach (Destinazioni d in r) { Destinazioni_out o = new Destinazioni_out(); string _aut = !string.IsNullOrEmpty(d.Autista) ? d.Autista.Trim() : string.Empty; o.Autista = _aut; string _autCod = !string.IsNullOrEmpty(d.CodAutista) ? d.CodAutista.Trim() : string.Empty; o.CodAutista = _autCod; string _automezzo = !string.IsNullOrEmpty(d.DescAutomezzo) ? d.DescAutomezzo.Trim() : string.Empty; o.DescAutomezzo = _automezzo; string _automezzoCod = !string.IsNullOrEmpty(d.CodAutomezzo) ? d.CodAutomezzo.Trim() : string.Empty; o.CodAutomezzo = d.CodAutomezzo; o.DataCarico = d.DataCarico; o.Brserial = d.Brserial; o.Brmerce = d.Brmerce; o.Brnote = d.Brnote; o.Cproword = d.Cproword; o.Cprownum = d.Cprownum; string _sedeInd = !string.IsNullOrEmpty(d.IndirizzoSede) ? d.IndirizzoSede.Trim() : string.Empty; o.IndirizzoSede = _sedeInd; string _sede = !string.IsNullOrEmpty(d.Sede) ? d.Sede.Trim() : string.Empty; o.Sede = _sede; o.CodCommittente = d.CodCommittente; string _committente = !string.IsNullOrEmpty(d.Committente) ? d.Committente.Trim() : string.Empty; o.Committente = _committente; o.CodSede = d.CodSede; o.ItemList = formattaDestinazione(d); o.ImportoDaRitirare = d.ImportoDaRitirare; o.serialeGiro = d.serialeGiro; o.Casse=d.Casse; o.Trasf=d.Trasf; o.Colli=d.Colli; o.num_cons = d.num_cons; o.Uova=d.Uova; o.Cist=d.Cist; o.Note = d.Note; o.Seq = d.Seq; o.Prog = d.Prog; if (!string.IsNullOrEmpty(d.consFattaSerial)) { ConsegnaFatta cf = new ConsegnaFatta(); cf.consFattaSerial = d.consFattaSerial; cf.consFattaRow = d.consFattaRow; cf.consFattaAut = d.consFattaAut; cf.consFattaBanSca = d.consFattaBanSca; cf.consFattaBanCar = d.consFattaBanCar; string nota = !string.IsNullOrEmpty(d.consFattaNotBan) ? d.consFattaNotBan.Trim() : string.Empty; cf.consFattaNotBan = nota; cf.consFattaImpor = d.consFattaImpor; cf.consFattaMezzo = d.consFattaMezzo; string nota2 = !string.IsNullOrEmpty(d.consFattaNotImp) ? d.consFattaNotImp.Trim() : string.Empty; cf.consFattaNotImp = nota2; cf.consFattaFlagCons = d.consFattaFlagCons; cf.consFattaDataOra = d.consFattaDataOra; o.ConsFatta = cf; } lst.Add(o); } return lst; } [HttpGet("listaDestinazioneBySerial")] public async Task> listaDestinazioneBySerial(string seriale) { Destinazioni_out lst = new Destinazioni_out(); _destinazioni = _destinazioni_context.Destinazioni; var r = await _destinazioni.Where(t => t.Brserial != null && t.Brserial.Equals(seriale)).OrderByDescending(t => t.DataCarico).ThenBy(t => t.Seq).FirstAsync(); Destinazioni_out o = new Destinazioni_out(); string _aut = !string.IsNullOrEmpty(r.Autista) ? r.Autista.Trim() : string.Empty; o.Autista = _aut; string _autCod = !string.IsNullOrEmpty(r.CodAutista) ? r.CodAutista.Trim() : string.Empty; o.CodAutista = _autCod; string _automezzo = !string.IsNullOrEmpty(r.DescAutomezzo) ? r.DescAutomezzo.Trim() : string.Empty; o.DescAutomezzo = _automezzo; string _automezzoCod = !string.IsNullOrEmpty(r.CodAutomezzo) ? r.CodAutomezzo.Trim() : string.Empty; o.CodAutomezzo = r.CodAutomezzo; o.DataCarico = r.DataCarico; o.Brserial = r.Brserial; o.Brmerce = r.Brmerce; o.Brnote = r.Brnote; o.Cproword = r.Cproword; o.Cprownum = r.Cprownum; string _sedeInd = !string.IsNullOrEmpty(r.IndirizzoSede) ? r.IndirizzoSede.Trim() : string.Empty; o.IndirizzoSede = _sedeInd; string _sede = !string.IsNullOrEmpty(r.Sede) ? r.Sede.Trim() : string.Empty; o.Sede = _sede; o.CodCommittente = r.CodCommittente; string _committente = !string.IsNullOrEmpty(r.Committente) ? r.Committente.Trim() : string.Empty; o.Committente = _committente; o.CodSede = r.CodSede; o.ItemList = formattaDestinazione(r); o.ImportoDaRitirare = r.ImportoDaRitirare; o.serialeGiro = r.serialeGiro; o.Casse = r.Casse; o.Trasf = r.Trasf; o.Colli = r.Colli; o.num_cons = r.num_cons; o.Uova = r.Uova; o.Cist = r.Cist; o.Note = r.Note; o.Seq = r.Seq; o.Prog=r.Prog; if (!string.IsNullOrEmpty(r.consFattaSerial)) { ConsegnaFatta cf = new ConsegnaFatta(); cf.consFattaSerial = r.consFattaSerial; cf.consFattaRow = r.consFattaRow; cf.consFattaAut = r.consFattaAut; cf.consFattaBanSca = r.consFattaBanSca; cf.consFattaBanCar = r.consFattaBanCar; string nota = !string.IsNullOrEmpty(r.consFattaNotBan) ? r.consFattaNotBan.Trim() : string.Empty; cf.consFattaNotBan = nota; cf.consFattaImpor = r.consFattaImpor; cf.consFattaMezzo = r.consFattaMezzo; string nota2 = !string.IsNullOrEmpty(r.consFattaNotImp) ? r.consFattaNotImp.Trim() : string.Empty; cf.consFattaNotImp = nota2; cf.consFattaFlagCons = r.consFattaFlagCons; cf.consFattaDataOra = r.consFattaDataOra; o.ConsFatta = cf; } return o; } /// Salva i dati della consegna [HttpPost] [Route("destinazione/salva")] public async Task> destinazione_salva([FromBody] Consegna model, string token) { Consegna_out tOut = new Consegna_out(); string usr = getClaimValueByToken(token, "codice"); try { ConsegnaTable ct = fillConsegna(model, token,DateTime.Now); //string tecnico = getClaimValueByToken(token, "tccodice"); if (await checkConsegnaPresente(token, ct) == 0) { DateTime dateTime = DateTime.Now; ConsegnaTable t = fillConsegna(model, token, dateTime); /* //Step 1: mi calcolo il nuovo seriale _consegne = _consegne_context.Cons; var ser = await _consegne.Take(1).OrderByDescending(t => t.Pisergir).ToListAsync(); string ultSer = "0"; if (ser != null && ser.Count > 0) { ultSer = ser.First().Pisergir; } string newSer = calcolaNuovoSeriale(ultSer); t.Pisergir = newSer; */ //Step 1: il seriale è quello della PIGIRCON che ho scritto nelle righe di SBR_ORD // lo leggo da li passando il seriale della destinazione. contemporaneamente mi ricavo anche gli altri valori //che devo scrivere successivamente _sbrord = _sbrord_context.Cons; var ti = await _sbrord.Where(t => t.Brserial.Equals(model.Serial)).FirstAsync(); string _committente = ti.Brcodcom; string _cliFatturazione = ti.Brclifat; string _codSede = ti.Brcodsed; string _pisergir = ti.Pisergir; int _seque = ti.Brnumseq.Value; t.Cca = _committente; t.Ccda=_cliFatturazione; t.Cprownum = _seque; t.Piconseg=_codSede; t.Pisergir = _pisergir; //Step 3 : testata la testata va scritta solo per la prima destinazione (cioè la devo scrivere SOLO se non l'ho già scritta) if (await checkTestataPresente(_pisergir) == 0) { Consegna_m m = new Consegna_m(); m.Pisergir = t.Pisergir; m.Data = dateTime; m.Cpccchk = getCpccchk(10); using (var transactionM = _consegne_m_context.Database.BeginTransaction()) { await _consegne_m_context.Cons.AddAsync(m); await _consegne_m_context.SaveChangesAsync(); transactionM.Commit(); } } //step 4 : riga (è sempre e solo una) using (var transaction = _consegne_context.Database.BeginTransaction()) { await _consegne_context.Cons.AddAsync(t); await _consegne_context.SaveChangesAsync(); transaction.Commit(); } tOut = fillConsegna_out(model, token); tOut.err_status_code = "200"; return StatusCode(StatusCodes.Status200OK, tOut); } else { return StatusCode(StatusCodes.Status500InternalServerError, "timbratura presente."); } //return tOut; } catch (Exception ex) { string errmsg = ex.InnerException != null ? ex.InnerException.Message : ex.Message; tOut.err_title = ex.Message; tOut.err_detail = errmsg; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } } /// Salva i dati della consegna [HttpPost] [Route("destinazione/non_effettuata")] public async Task> destinazione_non_effettuata([FromBody] Consegna model, string token) { Consegna_out tOut = new Consegna_out(); string usr = getClaimValueByToken(token, "codice"); try { ConsegnaTable ct = fillConsegna(model, token, DateTime.Now); //string tecnico = getClaimValueByToken(token, "tccodice"); if (await checkConsegnaPresente(token, ct) == 0) { DateTime dateTime = DateTime.Now; ConsegnaTable t = fillConsegnaNonEffettuata(model, token); ////Step 1: mi calcolo il nuovo seriale //_consegne = _consegne_context.Cons; //var ser = await _consegne.Take(1).OrderByDescending(t => t.Pisergir).ToListAsync(); //string ultSer = "0"; //if (ser != null && ser.Count > 0) //{ // ultSer = ser.First().Pisergir; //} //string newSer = calcolaNuovoSeriale(ultSer); //t.Pisergir = newSer; //Step 1: il seriale è quello della PIGIRCON che ho scritto nelle righe di SBR_ORD // lo leggo da li passando il seriale della destinazione. contemporaneamente mi ricavo anche gli altri valori //che devo scrivere successivamente _sbrord = _sbrord_context.Cons; var ti = await _sbrord.Where(t => t.Brserial.Equals(model.Serial)).FirstAsync(); string _committente = ti.Brcodcom; string _cliFatturazione = ti.Brclifat; string _codSede = ti.Brcodsed; string _pisergir = ti.Pisergir; int _seque = ti.Brnumseq.Value; t.Cca = _committente; t.Ccda = _cliFatturazione; t.Cprownum = _seque; t.Piconseg = _codSede; t.Pisergir = _pisergir; //Step 2 : testata if (await checkTestataPresente(_pisergir) == 0) { Consegna_m m = new Consegna_m(); m.Pisergir = t.Pisergir; m.Data = dateTime; m.Cpccchk = getCpccchk(10); using (var transactionM = _consegne_m_context.Database.BeginTransaction()) { await _consegne_m_context.Cons.AddAsync(m); await _consegne_m_context.SaveChangesAsync(); transactionM.Commit(); } } //step 3 : riga (è sempre e solo una) using (var transaction = _consegne_context.Database.BeginTransaction()) { await _consegne_context.Cons.AddAsync(t); await _consegne_context.SaveChangesAsync(); transaction.Commit(); } tOut = fillConsegna_out(model, token); tOut.err_status_code = "200"; return StatusCode(StatusCodes.Status200OK, tOut); } else { return StatusCode(StatusCodes.Status500InternalServerError, "timbratura presente."); } //return tOut; } catch (Exception ex) { string errmsg = ex.InnerException != null ? ex.InnerException.Message : ex.Message; tOut.err_title = ex.Message; tOut.err_detail = errmsg; tOut.err_status_code = "500"; return StatusCode(StatusCodes.Status500InternalServerError, tOut); } } private async Task checkConsegnaPresente(string token, ConsegnaTable model) { int trovati = 0; _consegne = _consegne_context.Cons; var ti = await _consegne.Where(t => t.Pisergir.Equals(model.Pisergir) && t.Cprownum == model.Cprownum ).ToListAsync(); if (ti.Any()) { trovati = ti.Count(); } return trovati; } private string getClaimValueByToken(string token, string claimName) { string t = string.Empty; var handler = new JwtSecurityTokenHandler(); var jwtSecurityToken = handler.ReadJwtToken(token); if (jwtSecurityToken != null) { var id = jwtSecurityToken.Claims.First(claim => claim.Type == claimName).Value; t = id; } return t; } private string formattaGiro(Giri g) { string item = string.Empty; if (g != null) { StringBuilder sb = new StringBuilder(); var dateString1 = g.Brdatcar.Value.ToString("dd-MM-yyyy"); sb.AppendLine("Giro del "+dateString1); sb.AppendLine("Assegnato a "+g.Autista); sb.AppendLine("Numero consegne " + g.num_dest.ToString()); item=sb.ToString(); sb = null; } return item; } private string formattaDestinazione(Destinazioni d) { string item = string.Empty; if (d != null) { StringBuilder sb = new StringBuilder(); //var dateString1 = d.DataCarico.Value.ToString("dd-MM-yyyy"); string comm = !string.IsNullOrEmpty(d.Committente) ? d.Committente.Trim() : string.Empty; sb.Append("Committente " + comm); sb.Append("
"); string sed = !string.IsNullOrEmpty(d.Sede) ? d.Sede.Trim() : string.Empty; sb.Append("Sede Consegna " + sed); sb.Append("
"); string ind = !string.IsNullOrEmpty(d.IndirizzoSede) ? d.IndirizzoSede.Trim() : string.Empty; sb.Append("Indirizzo " + ind); sb.Append("
"); string _casse=d.Casse!=null && d.Casse >0 ? Convert.ToInt16(d.Casse).ToString() : string.Empty; if(!string.IsNullOrEmpty(_casse)) { sb.Append("Casse " + _casse + " "); } string _trasf = d.Trasf != null && d.Trasf > 0 ? Convert.ToInt16( d.Trasf).ToString() : string.Empty; if (!string.IsNullOrEmpty(_trasf)) { sb.Append("Trasf " + _trasf + " "); } string _colli = d.Colli != null && d.Colli > 0 ? Convert.ToInt16(d.Colli).ToString() : string.Empty; if (!string.IsNullOrEmpty(_colli)) { sb.Append("Colli " + _colli + " "); } string _num_cons = d.num_cons != null && d.num_cons > 0 ? Convert.ToInt16(d.num_cons).ToString() : string.Empty; if (!string.IsNullOrEmpty(_num_cons)) { sb.Append("Nr.Cons " + _num_cons + " "); } string _uova = d.Uova != null && d.Uova > 0 ? d.Uova.ToString() : string.Empty; if (!string.IsNullOrEmpty(_uova)) { sb.Append("Uova " + _uova + " "); } string _cist = d.Cist != null && d.Cist > 0 ? d.Cist.ToString() : string.Empty; if (!string.IsNullOrEmpty(_cist)) { sb.Append("Cist " + _cist + " "); } string _note=!string.IsNullOrEmpty(d.Note) ? d.Note.Trim() :string.Empty; if (!string.IsNullOrEmpty(_note)) { sb.Append("
"); sb.Append("Note " + _note); } item = sb.ToString(); sb = null; } return item; } private ConsegnaTable fillConsegna(Consegna i, string token, DateTime d) { ConsegnaTable r = new ConsegnaTable(); string usr = getClaimValueByToken(token, "codice"); r.Piautist = usr; r.Cprownum = i.Cprownum; r.Cprownum=i.Cprownum; r.Ccddd = i.Ccddd; r.cpccchk = getCpccchk(10); r.Ccda = i.Ccda; r.Dcda = i.Dcda; r.Pinotban = i.Pinotban; r.Ccadd = i.Ccadd; r.Ccda = i.Ccda; r.Ccddd=i.Ccddd; r.Datdoc= d; r.Dcda=i.Dcda; r.Descb=i.Descb; r.Nbanc = i.Nbanc; r.Ndoc = i.Ndoc; r.Pibansca = i.Pibansca; r.Pinotban = i.Pinotban; r.Pinotimp = i.Pinotimp; r.Tipob1 = i.Tipob1; r.Tipob2 = i.Tipob2; r.Tipob =i.Tipob; r.Sdoc = i.Sdoc; r.Pisergir = i.Serial; r.Tcda="S"; r.Tca = i.Tca; r.Cca = i.Cca; r.Dca = i.Dca; r.Piconseg = i.Piconseg; r.Pimezzo = i.Pimezzo; r.Piimport= i.Piimport; r.Serial=i.Serial; return r; } private ConsegnaTable fillConsegnaNonEffettuata(Consegna i, string token) { ConsegnaTable r = new ConsegnaTable(); string usr = getClaimValueByToken(token, "codice"); r.Piautist = usr; r.Cprownum = i.Cprownum; r.Ccddd = i.Ccddd; r.cpccchk = getCpccchk(10); r.Ccda = i.Ccda; r.Dcda = i.Dcda; r.Pinotban = i.Pinotban; r.Ccadd = i.Ccadd; r.Ccda = i.Ccda; r.Ccddd = i.Ccddd; r.Datdoc = DateTime.Now; r.Dcda = i.Dcda; r.Descb = "Consegna non effetuata"; r.Nbanc = i.Nbanc; r.Ndoc = i.Ndoc; r.Pibansca = i.Pibansca; r.Pinotban = i.Pinotban; r.Pinotimp = i.Pinotimp; r.Tipob1 = i.Tipob1; r.Tipob2 = i.Tipob2; r.Tipob = i.Tipob; r.Sdoc = i.Sdoc; r.Pisergir = i.Serial; //r.Tcda=i.Tcda; r.Tcda = "N"; r.Tca = i.Tca; r.Cca = i.Cca; r.Dca = i.Dca; r.Piconseg = i.Piconseg; r.Pimezzo = i.Pimezzo; r.Piimport = i.Piimport; r.Serial=i.Serial; return r; } private Consegna_out fillConsegna_out(Consegna i, string token) { Consegna_out r = new Consegna_out(); string usr = getClaimValueByToken(token, "codice"); r.Piautist = usr; r.Cprownum = i.Cprownum; r.Cprownum = i.Cprownum; r.Ccddd = i.Ccddd; r.cpccchk = i.cpccchk; r.Ccda = i.Ccda; r.Dcda = i.Dcda; r.Pinotban = i.Pinotban; r.Ccadd = i.Ccadd; r.Ccda = i.Ccda; r.Ccddd = i.Ccddd; r.Datdoc = i.Datdoc; r.Dcda = i.Dcda; r.Descb = i.Descb; r.Nbanc = i.Nbanc; r.Ndoc = i.Ndoc; r.Pibansca = i.Pibansca; r.Pinotban = i.Pinotban; r.Pinotimp = i.Pinotimp; r.Tipob1 = i.Tipob1; r.Tipob2 = i.Tipob2; r.Tipob = i.Tipob; r.Sdoc = i.Sdoc; r.Pisergir = i.Serial; r.Tcda = i.Tcda; r.Tca = i.Tca; r.Cca = i.Cca; r.Dca = i.Dca; r.Piconseg = i.Piconseg; r.Pimezzo = i.Pimezzo; r.Piimport = i.Piimport; return r; } private string calcolaNuovoSeriale(string ultSer) { string newSer = string.Empty; int ser=Convert.ToInt32(ultSer); ser++; newSer=Convert.ToString(ser); if (ser > 0) { newSer = newSer.PadLeft(10, '0'); } return newSer; } private static Random random = new Random(); /// crea un cpccchk public static string getCpccchk(int length) { const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray()); } private async Task checkTestataPresente(string pisergir) { int trovati = 0; _testate = _consegne_m_context.Cons; var ti = await _testate.Where(t => t.Pisergir.Equals(pisergir)).ToListAsync(); if (ti.Any()) { trovati = ti.Count(); } return trovati; } } }