ogoettlich

Members
  • Content Count

    50
  • Joined

  • Last visited

  • Days Won

    11

ogoettlich last won the day on June 12 2017

ogoettlich had the most liked content!

Community Reputation

6 Neutral

About ogoettlich

  • Rank
    Advanced Member

Recent Profile Visitors

1,280 profile views
  1. ogoettlich

    Wer hebt nicht ab?

    Hallo Jens, warum das nun unbedingt im Call Routing erfolgen soll erschließt sich mir nicht wirklich, zudem du über Gruppen keine Call Routing Funktion hast und auf Benutzerebene via Gruppenzustellung die Call Routings ignoriert werden. Ein Ansatz wäre zyklisch die CDR abzufragen, analog dazu die angemeldeten Benutzern innerhalb der Gruppe. Wenn CDR State "connected" und DestinationName = Benutzer aus der Gruppe, dann ist der Agent bekannt, der den Call angenommen hat - die restlichen aus der Gruppe eben nicht. Mit Powershell ist sowas relativ fix erledigt.
  2. ogoettlich

    Zentrales Telefonbuch auf DECT 800

    Wir lassen zyklisch einen Job laufen, welcher das globale Telefonbuch in CSV exportiert. Diese CSV wiederum wird per HTTP-POST an die DECT Basis gesendet. Ist in C# geschrieben, sollte sich aber in Powershell überführen lassen. // Get Swyx Gobale PB var cds = libManager(); var pbenum = cds.GetUserPhoneBookEnum(); var pbenumColl = pbenum.GetPBXPhoneBookEx("%", true, true, true, true).CreateSortableFilterCollection(); foreach (var pbenumCollE in pbenumColl) { PhonebookToDect800Contact entry = new PhonebookToDect800Contact(); entry.id = Guid.NewGuid().ToString(); entry.vorname = pbenumCollE.Name; entry.nachname = ""; entry.phone = pbenumCollE.Number; entry.vornameDect = pbenumCollE.Name; entry.nachnameDect = ""; entry.phoneDect = pbenumCollE.Number; // Prep for DECT // Vorname // Replace Umlaute, etc. // Replace Sonderzeichen //entry.vornameDect = entry.vornameDect.Replace(" ", string.Empty); entry.vornameDect = entry.vornameDect.Replace("/", string.Empty); entry.vornameDect = entry.vornameDect.Replace("-", string.Empty); entry.vornameDect = entry.vornameDect.Replace("(", string.Empty); entry.vornameDect = entry.vornameDect.Replace(")", string.Empty); entry.vornameDect = entry.vornameDect.Replace("{", string.Empty); entry.vornameDect = entry.vornameDect.Replace("}", string.Empty); entry.vornameDect = entry.vornameDect.Replace("&", string.Empty); entry.vornameDect = entry.vornameDect.Replace("@", string.Empty); entry.vornameDect = entry.vornameDect.Replace("*", string.Empty); entry.vornameDect = entry.vornameDect.Replace("'", string.Empty); entry.vornameDect = entry.vornameDect.Replace(".", string.Empty); entry.vornameDect = entry.vornameDect.Replace("\"", string.Empty); entry.vornameDect = entry.vornameDect.Replace(",", string.Empty); entry.vornameDect = entry.vornameDect.Replace("ö", "oe"); entry.vornameDect = entry.vornameDect.Replace("ä", "ae"); entry.vornameDect = entry.vornameDect.Replace("ü", "ue"); entry.vornameDect = entry.vornameDect.Replace("Ö", "Oe"); entry.vornameDect = entry.vornameDect.Replace("Ä", "Ae"); entry.vornameDect = entry.vornameDect.Replace("Ü", "Ue"); entry.vornameDect = entry.vornameDect.Replace("ß", "ss"); entry.vornameDect = entry.vornameDect.Replace("é", "e"); entry.vornameDect = entry.vornameDect.Replace("ó", "o"); entry.vornameDect = entry.vornameDect.Replace("ú", "u"); entry.vornameDect = entry.vornameDect.Replace("í", "i"); if (entry.vornameDect.Length >= 20) { entry.vornameDect = entry.vornameDect.Substring(0, 20); } // Phone // +49 wird nicht unterstützt - entfernen und + durch 000 ersetzen if (entry.phoneDect.Contains("+")) { entry.phoneDect = entry.phoneDect.Substring(1, (entry.phoneDect.Length - 1)); //Phones brauchen für +49 drei Nullen --> 00049 entry.phoneDect = "000" + entry.phoneDect; } lPhonebookToDect800Contact.Add(entry); } // write pro Eintrag foreach (var contact in lPhonebookToDect800Contact) { fileCsv.WriteLine(contact.vornameDect + ";;" + contact.phoneDect + ";"); } //Freeing pbenum.FreeForReuse(); cds.FreeForReuse(); } else if (selectedDevice.mode == "manual") { // aus JSON Datei foreach (var contact in selectedDevice.contacts) { if (contact.id != "0") { fileCsv.WriteLine(contact.vornameDect + ";" + contact.nachnameDect + ";" + contact.phoneDect + ";"); } } } fileCsv.Close(); // upload nur DECT string urlDect = "https://" + selectedDevice.ipaddress + "/PHONEBOOK/post_file.xml"; string uploadPathAndFile = path + filenameCsv; System.Net.ServicePointManager.CertificatePolicy = new MyPolicy(); WebClient myWebClient = new WebClient(); myWebClient.Credentials = new NetworkCredential(selectedDevice.adminusername, selectedDevice.adminpassword); var result = new { Success = true, Message = "Telefonbucheinträge erfolgreich importiert" }; try { byte[] responseArray = myWebClient.UploadFile(urlDect, uploadPathAndFile); } catch(WebException ex) { result = new { Success = false, Message = "Telefonbucheinträge nicht erfolgreich importiert, Fehler: " + ex }; }
  3. ogoettlich

    Rufjournal Probleme

    Hallo Janson, für das Journal müsstest du folgendes Objekt "manipulieren": PBXCall.PhoneCallListEntry
  4. ogoettlich

    Anrufernummer vergleichen Extern

    Was ist hinter den Ausgängen 1 und 2 hinterlegt? Ansonsten trace mal die Variablen/Cases, z.B.: Dim Anrufer Dim KonfRaumNummer Anrufer = IpPbx.CallingNumber PBXScript.OutputTrace "Anrufer: " & Anrufer Select Case Anrufer Case "001234567890" ' Konf-Raum 1 = NSt 414 KonfRaumNummer = "414" PBXScript.OutputTrace "Case 001234567890" Case "163" ' Konf-Raum 1 = NSt 414 KonfRaumNummer = "414" PBXScript.OutputTrace "Case 163" Case Else ' Always open PBXScript.OutputTrace "Case Else" UseExit = 1 End Select UseExit = 0
  5. ogoettlich

    Anrufernummer vergleichen Extern

    Hallo Philipp, nimm das UseExit = 0 mal ans Ende des Scripts, also hinter End Select
  6. ogoettlich

    Active Call Monitoring

    For a Globale-Phonebook Lookup: Get-IpPbxCall | ForEach-Object { (Get-IpPbxPhonebookEntry -SearchNumber $($_.DestinationNumber).Replace('+','') -GlobalPhoneBook).Name }
  7. ogoettlich

    Active Call Monitoring

    Hi Arian, a good way to work with Windows PowerShell is the ISE. I.e. you are able to use Intellisense and the Command-Overview-Box on the right site, where you get a list of all Cmdlets. "import-modules ippbx" and just choose this Module and you will have a great overview about Parameters, Properties, Description and so on. In this Example Get-IpPbxCall gives you an Object (ActiveCallEntry) with some Properties. Just put it an Variable and typing this Variable with a dot, so Intellisense will show up its properties. Have a look here ("More Cool Intellisense").
  8. ogoettlich

    Active Call Monitoring

    Hi Arian, regarding point 2) I highly recommand to use the Config Data Store API SDK (have a look here). In combination with ASP.NET WebAPI you could represent your data by a simple URI, so your dashboard/frontend can consume data easily. For Duration have a look on: Get-IpPbxCall | ForEach-Object { "{0:HH:mm:ss,fff}" -f ([datetime](([TimeSpan]::FromMilliseconds($_.Duration).Ticks) / 10000)) }
  9. ogoettlich

    Wer telefoniert mit wem / Übersicht

    Hallo Kris, zu empfehlen wäre hier das CDSAPI SDK zu verwenden. Per ASP.NET MVC/WebAPI hast du komfortable Möglichkeiten die Rufe als Backend anzuzeigen, das ist relativ fix gemacht. In der WebExtension empfehle ich das Backend (API) zyklisch per SPA (Angular, React, Knockout, o.ä.) oder auch jQuery die WebAPI abzurufen.. auch das ist relativ fix erledigt. Setzt natürlich voraus, dass du in beiden Themen etwas Erfahrung hast. Solltest du Hilfe benötigen, kann ich gerne ein paar Beispiele bereitstellen.
  10. ogoettlich

    Visualisierung von aktiver Nachtschaltung

    Hallo Daniel, für das Beispiel benötigst du das CDS SDK, schau mal hier. Die C# Konsolenanwendung auf dem Server hinterlegen und per Call Routing (VB Block) aufrufen. Dim shell Set shell = CreateObject("WScript.Shell") shell.Run "C:\PfadZur\Konsolenanwendung.exe"
  11. ogoettlich

    Visualisierung von aktiver Nachtschaltung

    Hallo Daniel, sollte der Kunde nur Systemtelefone (SwyxPhones) im Einsatz haben, dann könnte man die Leitungstasten zur Signalisierung "missbrauchen". Eine Taste als Leitungstaste konfigurieren, die der Benutzer nicht benutzt - hier könnte dann via SDK die Leitungssperre getoggelt werden. Sobald die Leitungstaste gesperrt ist, blinkt/leuchtet die LED. Anbei die Togglesteuerung: private void ApplyLeitungstasteToggle(string username) { var cds = libManager(); var userEnum = cds.GetUserEnum(); userEnum.ExecuteNameFilter(username, new SWConfigDataClientLib.Data.OrderByList()); var useritem = userEnum.PrimaryCollection.CreateSortableFilterCollection().FirstOrDefault(); if (useritem == null) { return; } var phoneClientFacade = cds.GetPhoneClientFacade(); var ucd = phoneClientFacade.GetUserConfigData(useritem.UserID); // Linekeys befinden sich im BLOB - Lib IpPbxBlob32 einbinden UserSettings blob = new UserSettings(); blob.SetBLOB(ucd); var linekeySettings = blob.m_LineKeySettings; // Leitungstastenindex 0 = Leitungstaste 1 // Leitungstastenindex 1 = Leitungstaste 2 // ... if (linekeySettings[2] != null) { if (linekeySettings[2].LineDisabled == 1) { linekeySettings[2].LineDisabled = 0; } else { linekeySettings[2].LineDisabled = 1; } } // Save Blob Change ucd = blob.GetBLOB(); phoneClientFacade.SetUserConfigData(useritem.UserID, ucd); //Freeing phoneClientFacade.FreeForReuse(); userEnum.FreeForReuse(); cds.FreeForReuse(); } Viel Erfolg
  12. ogoettlich

    SwyxWare 2015 R40 - Probleme mit CDR in Datenbank

    Okay, Fehler gefunden. ConnectionString angepasst.. von Driver={SQL Server};Server=SERVERNAME;Database=CDR;Trusted_Connection=Yes; nach Provider=SQLOLEDB;Data Source=SERVERNAME;Initial Catalog=CDR;Integrated Security=SSPI
  13. Hallo zusammen, hat jemand schon Erfahrungen mit dem jüngsten 2015 R40 Release machen können, bezgl. CDR Daten in die Datenbank (Microsoft SQL Server 2014) zu schreiben? Momentan stehe ich vor dem Problem, dass nach einem Upgrade von R3 auf R40 die CDR Daten nicht mehr weggeschrieben werden. Habe die Tabellenstruktur schon angepasst á la: ALTER TABLE [CDR].[dbo].[IpPbxCDR] ADD MEMCallID INT NULL; Und in der Registry die Einstellung vorgenommen, wie im KB2491 beschrieben: Fraglich ist außerdem, warum bei der CSV Variante "MEMCallId" und bei der Datenbankvariante MEMCallID" verwendet wird... Naja, aber das ist eine andere Frage. In den Traces werden jedenfalls folgende Fehler geloggt... Warum er am Ende failed ist fraglich. 08 14:55:13.881 001dac Inf3 SrvCDRWrtr 06378810 00000000 SCDRWrThread::OpenDBConn () success 08 14:55:13.881 001dac Inf3 SrvCDRWrtr 06378810 00000000 SCDRWrThread::Main () rs opened. 08 14:55:13.881 001dac Inf3 SrvCDRWrtr 06378810 00000001 SCDRWrThread::Main () assemble CDR 0x04971070 08 14:55:13.883 001dac Info SrvCDRWrtr 06378810 00000001 SCDRWrThread::Main () will commit CDR 0x04971070 08 14:55:13.889 001dac Warn SrvCDRWrtr 06378810 00000000 SCDRWrThread::Main () failed to insert CDR, err: 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]Die parametrisierte Abfrage '(@P1 int,@P2 nvarchar(4),@P3 nvarchar(7),@P4 nvarchar(4),@P5 nva' erwartet den @P9-Parameter, der nicht bereitgestellt wurde. 08 14:55:13.892 001dac Info SrvCDRWrtr 06378810 00000000 SCDRWrThread::OpenDBConn () will open DB connection @ level 2... 08 14:55:15.883 000e40 Warn SrvCDRWrtr 06378810 00000000 SCDRWrThread::OnDatabaseDiagTimer () CDR commit timer elapsed -> check CDR database connectivity 08 14:55:19.912 001dac Inf3 SrvCDRWrtr 06378810 00000000 SCDRWrThread::OpenDBConn () success 08 14:55:19.912 001dac Inf3 SrvCDRWrtr 06378810 00000000 SCDRWrThread::Main () rs opened. 08 14:55:19.912 001dac Inf3 SrvCDRWrtr 06378810 00000001 SCDRWrThread::Main () assemble CDR 0x04971070 08 14:55:19.913 001dac Info SrvCDRWrtr 06378810 00000001 SCDRWrThread::Main () will commit CDR 0x04971070 08 14:55:19.914 001dac Warn SrvCDRWrtr 06378810 00000000 SCDRWrThread::Main () failed to insert CDR, err: 80040e14 [Microsoft][ODBC SQL Server Driver][SQL Server]Die parametrisierte Abfrage '(@P1 int,@P2 nvarchar(4),@P3 nvarchar(7),@P4 nvarchar(4),@P5 nva' erwartet den @P9-Parameter, der nicht bereitgestellt wurde. Werde bei Swyx mal ein Ticket öffnen.. Aber vllt. hat hier schon jemand ähnliche Erfahrung gemacht?
  14. ogoettlich

    Vorwahl aus Rufnummer ermitteln

    Hallo Andre, das machst du am besten über ein Call Routing, welches bei extern, eingehenden Rufen die ersten 8 Chars ausliest, per VBS Block. Daraufhin müsstet du nur noch validieren, ob es sich um eine 2, 3, 4 oder 5-stellige Vorwahl handelt, die ersten Chars "+49" sind im Fall "DE" eh statisch. Validieren, tja, am besten gegen eine Datenbank, welche alle Vorwahlen beinhaltet. Viel Erfolg!
  15. ogoettlich

    aktivierte Umleitung auf Namenstaste anzeigen

    Hallo srom, ein Lösungsansatz wäre per Web-Extension eine eigene Webapplication zu bauen, welche analog zur xPhone Variante ebenfalls per MouseOver ein Event auslöst und benötigte Information über den CDS bereitstellt. Mit JavaScript und AJAX ist so etwas relativ einfach im Frontend gelöst. Viel Erfolg!