using BapPress.BapService.ServiceMessages; using BapFramework.Data.Generic; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Security.Permissions; using System.Web.Services.Protocols; using System.Web.Services.Configuration; using System.Reflection; using System.IO; using System.Net; namespace BapPress.BapService.Services.SPL { [GroupItem("Książki nadawcze", "Wysyłanie książki nadawczej Poczty Polskiej")] class Post //: GroupElement\ { private ConnectionBase conn; private string PostPassword_1; private string PostPassword_8; private string PostPassword_11; private string PostPassword_13; private int STAGE; public Post(ConnectionBase conn) //: base(conn) { this.conn = conn; STAGE = int.Parse(conn.GetScalar(string.Format("SELECT DBA.ConfigRead('{0}','STAGE');", this.GetType().ToString()))); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; } public event Action Message; private void SendMessage(MessageType type, string message, bool log) { Message?.Invoke(type, "Post", message, log); } public bool Execute() { bool ret = true; string sql = "select ID,CompanyID from DBA.IC_SendBooks with(nolock) WHERE EndDate > '2012-08-01' and ExportID is null and icsendkindid in (100,101,103)"; //SMYKOUT if (STAGE > 3) sql += " AND CompanyID <> 8"; sql += ";"; DataTable dt = conn.GetTable(sql); PostPassword_1 = null; PostPassword_8 = null; PostPassword_11 = null; PostPassword_13 = null; if (Properties.Settings.Default.Post_LogMessages.Value == "T") RegisterSoapExtension(typeof(TraceExtension), 1, PriorityGroup.Low); try { if (dt.Rows.Count > 0) { System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); foreach (int CompanyID in dt.Rows.Cast().Select(r => (int)r["CompanyID"]).Distinct()) { switch (CompanyID) { case 1: PostPassword_1 = CheckLogin(CompanyID); break; case 8: PostPassword_8 = CheckLogin(CompanyID); break; case 11: PostPassword_11 = CheckLogin(CompanyID); break; case 13: PostPassword_13 = CheckLogin(CompanyID); break; } } } } catch (Exception ex) { SendMessage(MessageType.Error, ex.Message, false); return false; } foreach (DataRow row in dt.Rows) { //wołaj webservice int id = (int)row["ID"]; SendMessage(MessageType.Info, "Wysyłanie manifestu pocztowego ID = " + id.ToString(), false); string ans = SendPostDocs(id); SendMessage(MessageType.Info, ans, false); if (Properties.Settings.Default.Post_LogMessages.Value == "T") { FileInfo fi = new FileInfo(Properties.Settings.Default.ManifestoSender_FilePath + "PostManifestoLog.log"); if (fi.Exists) fi.MoveTo(Properties.Settings.Default.ManifestoSender_FilePath + $"PostManifestoLog - {id}.log"); } } dt.Dispose(); return ret; } private string SendPostDocs(int SendBookID) { string response = ""; int export = -1; SendMessage(MessageType.Info, "Eksport książki nadawczej ID = " + SendBookID.ToString(), true); try { DataTable packets;// = new DataTable(); try { packets = conn.GetTable("CALL DBA.SPL_GetPostData(" + SendBookID.ToString() + ")"); response = SendPostManifesto(packets, out export); if (export > 0) { //update IC_SendBook //conn.Execute("UPDATE DBA.IC_SendBooks SET ExportID = " + export.ToString() + ",ExportDate = now() WHERE ID = " + SendBookID.ToString() + ";"); conn.Execute(string.Format("CALL DBA.IC_SetSendBookExport({0}, '{1}');", SendBookID, export)); SendMessage(MessageType.Info, "Koniec eksportu EnvelopeID = " + export.ToString(), true); } else SendMessage(MessageType.Warning, "Koniec eksportu Error: " + response, true); } catch (Exception ex) { response = "Exception trying to make database connection\n"; response += ex.Message; SendMessage(MessageType.Error, ex.Message, true); } } catch (Exception e) { response = "Exception\n"; response += e.Message; SendMessage(MessageType.Error, e.Message, true); } return response; } private string SendPostManifesto(DataTable packets, out int exportID) { string response = ""; exportID = -1; //string passwd = CheckLogin(); int STAGE = int.Parse(Properties.Settings.Default.STAGE.Value); System.Net.NetworkCredential c = new System.Net.NetworkCredential(); //SMYKOUT if (STAGE == 2) { switch ((int)packets.Rows[0]["CompanyID"]) { case 1: c.UserName = Properties.Settings.Default.Post_userId_1.Value; c.Password = PostPassword_1; break; case 8: c.UserName = Properties.Settings.Default.Post_userId_8.Value; c.Password = PostPassword_8; break; } } else if (STAGE > 2 && (int)packets.Rows[0]["CompanyID"] == 8) { return "Nie wysyłamy manifestów smykowych!"; } else { switch ((int)packets.Rows[0]["CompanyID"]) { case 1: c.UserName = Properties.Settings.Default.Post_userId_1.Value; c.Password = PostPassword_1; break; case 11: c.UserName = Properties.Settings.Default.Post_userId_11.Value; c.Password = PostPassword_11; break; case 13: c.UserName = Properties.Settings.Default.Post_userId_13.Value; c.Password = PostPassword_13; break; } } System.Net.CredentialCache cc = new System.Net.CredentialCache(); cc.Add(new Uri(Properties.Settings.Default.Post_url.Value), "Basic", c); Poczta.ElektronicznyNadawca nadawca = new Poczta.ElektronicznyNadawca(); nadawca.Credentials = cc; nadawca.Url = Properties.Settings.Default.Post_url.Value.Replace("en.wsdl", "en.php"); nadawca.Timeout = int.Parse(Properties.Settings.Default.Post_Timeout.Value); Poczta.errorType[] errors; bool retval;//, retvalSpecified; //string test = nadawca.hello("test"); //SMYKOUT - Stage 1 if (STAGE == 1) { switch ((int)packets.Rows[0]["CompanyID"]) { case 1: errors = nadawca.setAktywnaKarta(264298); break; case 8: errors = nadawca.setAktywnaKarta(451948); break; } } else if (STAGE == 2) { switch ((int)packets.Rows[0]["CompanyID"]) { case 1: errors = nadawca.setAktywnaKarta(461223); break; case 8: errors = nadawca.setAktywnaKarta(466756); break; } } /*Poczta.kartaType[] karty = nadawca.getKarty(); foreach (Poczta.kartaType k in karty) SendMessage(MessageType.Info, string.Format("Karta ID:{0}, state:{1}", k.idKarta, k.aktywna), false);*/ retval = nadawca.clearEnvelope(0, false, out errors); if (!retval) //(errors != null) return "Nie udało się zainicjalizować."; List przesylki = new List(); Poczta.addShipmentResponseItemType[] ShipResp = null; StringBuilder errorlog = new StringBuilder(); foreach (DataRow row in packets.Rows) { Poczta.adresType adres = new Poczta.adresType(); adres.nazwa = row["RecName"].ToString(); //adres.nazwa2 = row["Rec"].ToString(); adres.ulica = row["RecStreet"].ToString(); adres.numerDomu = row["RecStreetNumber"].ToString(); adres.numerLokalu = row["RecFlatNumber"].ToString(); adres.miejscowosc = row["RecTown"].ToString(); adres.kodPocztowy = row["RecZIP"].ToString(); adres.kraj = row["RecCountry"].ToString(); //adres.telefon = row["RecPhoneNumber"].ToString(); adres.mobile = row["RecPhoneNumber"].ToString(); adres.email = row["RecEmail"].ToString(); if ((int)row["ICSendKindID"] == 105 || (int)row["ICSendKindID"] == 106) adres.mobile = row["RecPhoneNumber"].ToString(); //adres.nip //adres.osobaKontaktowa Poczta.pobranieType pobranie; if ((decimal)row["Kwota"] > 0) { pobranie = new Poczta.pobranieType(); pobranie.sposobPobrania = Poczta.sposobPobraniaType.RACHUNEK_BANKOWY; pobranie.sposobPobraniaSpecified = true; pobranie.kwotaPobrania = (int)((decimal)row["Kwota"] * 100); pobranie.kwotaPobraniaSpecified = true; pobranie.nrb = row["AccountNumber"].ToString(); pobranie.tytulem = row["WayBill"].ToString(); pobranie.sprawdzenieZawartosciPrzesylkiPrzezOdbiorce = false; pobranie.sprawdzenieZawartosciPrzesylkiPrzezOdbiorceSpecified = false; } else pobranie = null; switch ((int)row["ICSendKindID"]) { case 100: //Poczta - kraj bez pobrania Poczta.paczkaPocztowaType paczka = new Poczta.paczkaPocztowaType(); paczka.guid = Guid.NewGuid().ToString();//row["PacketID"].ToString(); paczka.opakowanieGuid = null; paczka.opis = null; paczka.pakietGuid = null; paczka.numerNadania = row["WayBill"].ToString(); paczka.adres = adres; paczka.posteRestante = false; paczka.iloscPotwierdzenOdbioru = 0; paczka.kategoria = Poczta.kategoriaType.PRIORYTETOWA; paczka.gabaryt = Poczta.gabarytType.GABARYT_A; paczka.wartosc = 0; paczka.wartoscSpecified = (paczka.wartosc != 0); paczka.masa = (int)(((decimal)row["Weight"]) * 1000); paczka.masaSpecified = true; paczka.zwrotDoslanie = false; paczka.zwrotDoslanieSpecified = false; paczka.egzemplarzBiblioteczny = false; paczka.dlaOciemnialych = false; przesylki.Add(paczka); break; case 101: //Poczta - kraj pobranie Poczta.przesylkaPobraniowaType paczka1 = new Poczta.przesylkaPobraniowaType(); paczka1.guid = Guid.NewGuid().ToString();//row["PacketID"].ToString(); paczka1.opakowanieGuid = null; paczka1.opis = null; paczka1.pakietGuid = null; paczka1.numerNadania = row["WayBill"].ToString(); paczka1.adres = adres; paczka1.pobranie = pobranie; paczka1.posteRestante = false; paczka1.iloscPotwierdzenOdbioru = 0; paczka1.kategoria = Poczta.kategoriaType.PRIORYTETOWA; paczka1.gabaryt = Poczta.gabarytType.GABARYT_A; paczka1.ostroznie = false; paczka1.wartosc = 0; paczka1.masa = (int)(((decimal)row["Weight"]) * 1000); przesylki.Add(paczka1); break; case 102: //Poczta zagranica Poczta.przesylkaPoleconaZagranicznaType paczka2 = new Poczta.przesylkaPoleconaZagranicznaType(); paczka2.guid = Guid.NewGuid().ToString();//row["PacketID"].ToString(); paczka2.opakowanieGuid = null; paczka2.opis = null; paczka2.pakietGuid = null; paczka2.numerNadania = row["WayBill"].ToString(); paczka2.adres = adres; paczka2.posteRestante = false; paczka2.iloscPotwierdzenOdbioru = 0; paczka2.iloscPotwierdzenOdbioruSpecified = true; //paczka2.kategoria = Poczta.kategoriaType.PRIORYTETOWA; //paczka2.kategoriaSpecified = true; paczka2.masa = (int)(((decimal)row["Weight"]) * 1000); paczka2.masaSpecified = true; //paczka2.ekspres = false; //paczka2.ekspresSpecified = true; przesylki.Add(paczka2); break; case 103: case 105: case 106: case 108: Poczta.przesylkaBiznesowaType paczka3 = new Poczta.przesylkaBiznesowaType(); paczka3.guid = Guid.NewGuid().ToString(); paczka3.opakowanieGuid = null; paczka3.opis = null; paczka3.pakietGuid = null; paczka3.numerNadania = row["WayBill"].ToString(); paczka3.adres = adres; paczka3.pobranie = pobranie; paczka3.gabaryt = (Poczta.gabarytBiznesowaType)Enum.Parse(typeof(Poczta.gabarytBiznesowaType), row["Gabaryt"].ToString()); paczka3.gabarytSpecified = true; paczka3.Items = null; paczka3.masa = (int)(((decimal)row["Weight"]) * 1000); paczka3.masaSpecified = true; paczka3.ostroznie = false; paczka3.ostroznieSpecified = false; paczka3.wartosc = 0; paczka3.wartoscSpecified = false; //paczka3.epo //paczka3.ubezpieczenie //paczka3.zasadySpecjalne //paczka3.zasadySpecjalneSpecified //paczka3.terminSprawy //paczka3.sygnatura //paczka3.rodzaj //paczka3.opis //paczka3.numerTransakcjiOdbioru //paczka3.nadawca if (!row.IsNull("PickupPoint")) { if (!row.IsNull("WayBill2")) paczka3.numerTransakcjiOdbioru = row["WayBill2"].ToString(); paczka3.Items = new object[] { new Poczta.urzadWydaniaEPrzesylkiType() { id = (int)row["PickupPoint"] } }; } przesylki.Add(paczka3); break; } if (przesylki.Count >= 500) { ShipResp = nadawca.addShipment(przesylki.ToArray(), 0, false); PostLogSendPackets(ShipResp); foreach (Poczta.addShipmentResponseItemType resp in ShipResp.Where(r => r.error?.Length > 0)) { string guid = (new Guid(resp.guid)).ToString(); Poczta.przesylkaRejestrowanaType przesylka = przesylki.FirstOrDefault(p => p.guid == guid) as Poczta.przesylkaRejestrowanaType; if (przesylka != null) { string msg = string.Join("\n", resp.error.Select(e => $"{e.errorNumber}: {e.errorDesc}")); errorlog.Append($"{przesylka.numerNadania}\n{msg}\n\n"); } } przesylki.Clear(); } } if (przesylki.Count > 0) { ShipResp = nadawca.addShipment(przesylki.ToArray(), 0, false); PostLogSendPackets(ShipResp); foreach (Poczta.addShipmentResponseItemType resp in ShipResp.Where(r => r.error?.Length > 0)) { string guid = (new Guid(resp.guid)).ToString(); Poczta.przesylkaRejestrowanaType przesylka = przesylki.FirstOrDefault(p => p.guid == guid) as Poczta.przesylkaRejestrowanaType; if (przesylka != null) { string msg = string.Join("\n", resp.error.Select(e => $"{e.errorNumber}: {e.errorDesc}")); errorlog.Append($"{przesylka.numerNadania}\n{msg}\n\n"); } } } if (errorlog.Length != 0) { //wyślij raport z błędami errorlog.Insert(0, "\nBłędy w eksporcie paczek do Poczty Polskiej:\n\n"); conn.Execute(string.Format("CALL DBA.APP_Sender_SetEmailActions('PostError-{0:yyyyMMdd_HH}','{1}','{2}','','','Post Manifesto Errors','',0,30,1,'EmpikMail');", DateTime.Now, errorlog, Properties.Settings.Default.ManifestoErrorsEmail.Value)); } Poczta.urzadNadaniaFullType[] uNadania = nadawca.getUrzedyNadania(); Poczta.urzadNadaniaFullType urzad = uNadania.FirstOrDefault(u => u.urzadNadaniaSpecified && u.urzadNadania == (int)packets.Rows[0]["PostOffice"]); if (urzad != null) { int idEnvelope; bool idEnvelopeSpec; Poczta.envelopeStatusType envelopeStatus; bool envelopeStatusSpec; string envelopeFilename; Poczta.pakietType[] pakiety = new Poczta.pakietType[0]; Poczta.profilType profil = null; nadawca.sendEnvelope(uNadania[0].urzadNadania, true, pakiety, 0, false, profil, out idEnvelope, out idEnvelopeSpec, out envelopeStatus, out envelopeStatusSpec, out errors, out envelopeFilename); if (errors != null && errors.Length > 0) { StringBuilder sb = new StringBuilder(); foreach (Poczta.errorType err in errors) { sb.Append(err.errorNumber); sb.Append(" - "); sb.AppendLine(err.errorDesc); } response = sb.ToString(); } if (envelopeStatusSpec) response += "\n" + envelopeStatus.ToString(); if (idEnvelopeSpec) { exportID = idEnvelope; if (string.IsNullOrEmpty(response)) response = string.Format("Książka nadawcza '{0}' wysłana.", envelopeFilename); } } else { response = "Nie znaleziono urzędu: " + packets.Rows[0]["PostOffice"].ToString(); } nadawca.Dispose(); return response; } private string CheckLogin(int CompanyID) { string passwd = null; string newpasswd = null; try { object obj = conn.GetScalar(string.Format("Select DBA.ConfigRead('Global','PostPassword_{0}');", CompanyID)); if (obj != DBNull.Value) passwd = (string)obj; } catch (Exception ex) { passwd = null; SendMessage(MessageType.Error, ex.Message, true); } if (passwd != null) { Poczta.ElektronicznyNadawca nadawca = new Poczta.ElektronicznyNadawca(); System.Net.NetworkCredential c = new System.Net.NetworkCredential(); //SMYKOUT switch (CompanyID) { case 1: c.UserName = Properties.Settings.Default.Post_userId_1.Value; break; case 8: c.UserName = Properties.Settings.Default.Post_userId_8.Value; break; case 11: c.UserName = Properties.Settings.Default.Post_userId_11.Value; break; case 13: c.UserName = Properties.Settings.Default.Post_userId_13.Value; break; } c.Password = passwd; //c.UserName = Properties.Settings.Default.Post_userId_1.Value; //c.Password = passwd; System.Net.CredentialCache cc = new System.Net.CredentialCache(); cc.Add(new Uri(Properties.Settings.Default.Post_url.Value), "Basic", c); nadawca.Credentials = cc; nadawca.Url = Properties.Settings.Default.Post_url.Value.Replace("en.wsdl", "en.php"); DateTime date = nadawca.getPasswordExpiredDate(); if (date < DateTime.Today.AddDays(5)) { SendMessage(MessageType.Info, $"Hasło traci ważność w dniu {date.ToString("yyyy-MM-dd")}. Zmieniamy na nowe.", true); try { newpasswd = (string)conn.GetScalar(string.Format("CALL DBA.SPL_GetNewPostPassword({0});", CompanyID)); } catch (Exception ex) { passwd = null; SendMessage(MessageType.Error, ex.Message, true); } SendMessage(MessageType.Info, $"Nowe hasło '{newpasswd}'", true); Poczta.errorType[] errors = null; if (newpasswd != null) errors = nadawca.changePassword(newpasswd); if (errors != null && errors.Length > 0) { string err = ""; foreach (Poczta.errorType e in errors) err += "(" + e.errorNumber + ") - " + e.errorDesc + "\n"; SendMessage(MessageType.Error, err, true); throw new Exception(err); } passwd = newpasswd; } nadawca.Dispose(); } return passwd; } private void PostLogSendPackets(Poczta.addShipmentResponseItemType[] ShipResp) { for (int i = 0; i < ShipResp.Length; i++) { StringBuilder err = new StringBuilder(); if (ShipResp[i].error != null) { foreach (Poczta.errorType e in ShipResp[i].error) err.AppendFormat("({0}) - {1}; ", e.errorNumber, e.errorDesc); SendMessage(MessageType.Warning, $"{ShipResp[i].guid} - {ShipResp[i].numerNadania} err: {err}", false); } SendMessage(MessageType.Warning, $"{ShipResp[i].guid} - {ShipResp[i].numerNadania} err: {err}", true); } } //public string[] GetPostOffice() //{ // string passwd = null; // try // { // object obj = conn.GetScalar("Select DBA.ConfigRead('Global','PostPassword');"); // if (obj != DBNull.Value) // passwd = (string)obj; // } // catch (Exception ex) // { // passwd = null; // SendMessage(MessageType.Error, ex.Message, true); // } // List sl = new List(); // if (passwd != null) // { // Poczta.ElektronicznyNadawca nadawca = new Poczta.ElektronicznyNadawca(); // System.Net.NetworkCredential c = new System.Net.NetworkCredential(); // c.UserName = Properties.Settings.Default.Post_userId.Value; // c.Password = passwd; // System.Net.CredentialCache cc = new System.Net.CredentialCache(); // cc.Add(new Uri(Properties.Settings.Default.Post_url.Value), "Basic", c); // nadawca.Credentials = cc; // try // { // Poczta.urzadNadaniaFullType[] uNadania = nadawca.getUrzedyNadania(); // foreach (Poczta.urzadNadaniaFullType un in uNadania) // sl.Add(string.Format("{0};{1};{2}", un.urzadNadania, un.nazwaWydruk, un.opis)); // } // catch (Exception ex) // { // return new string[] { ex.Message }; // } // finally // { // nadawca.Dispose(); // } // } // return sl.ToArray(); //} /// /// Programatically registers a at runtime with the specified /// and settings. /// /// The of the to register. /// /// A value that indicates the relative order in which this SOAP extension runs when multiple SOAP extensions are /// specified. Within each group the priority attribute distinguishes the overall relative priority of the SOAP /// extension. A lower priority number indicates a higher priority for the SOAP extension. The lowest possible /// value for the priority attribute is 1. /// /// /// The relative priority group (e.g. Low or High) in which this SOAP extension runs when multiple SOAP extensions /// are configured to run. /// [ReflectionPermission(SecurityAction.Demand, Unrestricted = true)] public static void RegisterSoapExtension(Type type, int priority, PriorityGroup group) { if (!type.IsSubclassOf(typeof(SoapExtension))) { throw new ArgumentException("Type must be derived from SoapException.", "type"); } if (priority < 1) { throw new ArgumentOutOfRangeException("priority", priority, "Priority must be greater or equal to 1."); } // get the current web services settings... WebServicesSection wss = WebServicesSection.Current; // set SoapExtensionTypes collection to read/write... FieldInfo read BindingFlags.NonPublic | BindingFlags.Instance); readOnlyField.SetValue(wss.SoapExtensionTypes, false); // inject SoapExtension... wss.SoapExtensionTypes.Add(new SoapExtensionTypeElement(type, priority, group)); // set SoapExtensionTypes collection back to readonly and clear modified flags... MethodInfo resetModifiedMethod = typeof(System.Configuration.ConfigurationElement).GetMethod("ResetModified", BindingFlags.NonPublic | BindingFlags.Instance); resetModifiedMethod.Invoke(wss.SoapExtensionTypes, null); MethodInfo setRead BindingFlags.NonPublic | BindingFlags.Instance); setReadOnlyMethod.Invoke(wss.SoapExtensionTypes, null); } } }