Jump to content

MaxITGarrett

Members
  • Posts

    14
  • Joined

  • Last visited

Reputation Activity

  1. Upvote
    MaxITGarrett got a reaction from Lukasz in Record Remote Control Sessions   
    We currently use TeamViewer as our remote support software and like to have Pulseway as a backup to that, but one thing that we like to do is record our sessions for both accountability and to have the ability to reference something we have done in the past to resolve an issue or to double check one's work.
    If Pulseway is to compete with this, I would like to see the ability to record these sessions.
  2. Upvote
    MaxITGarrett got a reaction from Kenny Carlsson in Record Remote Control Sessions   
    We currently use TeamViewer as our remote support software and like to have Pulseway as a backup to that, but one thing that we like to do is record our sessions for both accountability and to have the ability to reference something we have done in the past to resolve an issue or to double check one's work.
    If Pulseway is to compete with this, I would like to see the ability to record these sessions.
  3. Thanks
    MaxITGarrett got a reaction from flydev in [C#] 3CX Windows Plugin to Open Ticket in PSA   
    Not sure how many people use 3CX for their phone systems, but our company utilizes the system and have recently adopted Pulseway as well. As a result, I have developed a plugin for 3CX Windows Client that opens a ticket as you pick up the phone from an incoming call. I have included the source code for reference if anyone else has a need for it.
    Instructions:
    Create a new project. Select C# Language and create a new “Windows Class Library” project. Ensure that the project targets .NET Framework 4.5.1 Add a reference to the library “MyPhoneCRMIntegration.dll” installed with 3CXPhone for Windows (usually C:\ProgramData\3CXPhone for Windows\PhoneApp). Rename Class1.cs to PulsewayTicketPlugin.cs and replace the code with the following: using System; using System.IO; namespace _PulsewayTicketPlugin { [MyPhonePlugins.CRMPluginLoader] public class PulsewayTicketPlugin { // Initialization of Variables private static PulsewayTicketPlugin instance = null; // Holds the instance private MyPhonePlugins.IMyPhoneCallHandler callHandler = null; // Holds the handler private static MyPhonePlugins.CallState lastStatus = MyPhonePlugins.CallState.Undefined; // Holds the last relevant phone status // Called upon loading 3CX Client [MyPhonePlugins.CRMPluginInitializer] public static void Loader(MyPhonePlugins.IMyPhoneCallHandler callHandler) { // Create a new instance of the plugin instance = new PulsewayTicketPlugin(callHandler); } // Constructor for plugin, to add event handler private PulsewayTicketPlugin(MyPhonePlugins.IMyPhoneCallHandler callHandler) { this.callHandler = callHandler; // As the status of the call changes, process the changes callHandler.OnCallStatusChanged += new MyPhonePlugins.CallInfoHandler(callHandler_OnCallStatusChanged); } // Processes the status of the call private void callHandler_OnCallStatusChanged(object sender, MyPhonePlugins.CallStatus callInfo) { // Process the current state // - If it is ringing, a call is incoming, so we want to monitor it // - If it has ended, no longer need to monitor it (happens when we end it or someone else picks it up) // - Don't process other cases, not necessary switch (callInfo.State) { case MyPhonePlugins.CallState.Ended: { lastStatus = MyPhonePlugins.CallState.Undefined; break; }; case MyPhonePlugins.CallState.Ringing: { lastStatus = MyPhonePlugins.CallState.Ringing; break; }; default: { break; }; } // If the phone was ringing and we picked it up, open a new ticket if (lastStatus == MyPhonePlugins.CallState.Ringing && callInfo.State == MyPhonePlugins.CallState.Connected) { // Windows will automatically use the default application used to open URL's System.Diagnostics.Process.Start("https://psa.pulseway.com/MSP/TicketEdit.aspx"); } } } } Build the DLL and place it into the 3CX Phone Directory (C:\ProgramData\3CXPhone for Windows\PhoneApp). Edit the 3CX Phone Configuration file (C:\ProgramData\3CXPhone for Windows\PhoneApp\3CXWin8Phone.user.config) and add the following: <add key="CRMPlugin" value="CallNotifier,3CXPhoneTapiPlugin,PulsewayTicketPlugin"/> Reload your 3CX Windows Client and it should work with the next incoming call!
  4. Like
    MaxITGarrett got a reaction from Sean in [PHP] WHMCS Hook to Automatically Add to PSA   
    For those of you who would like to use WHMCS (Automated web hosting platform) but wish to use Pulseway PSA for your main ticketing software and for managing your consulting business if you are an MSP like us, I had to make a hook for WHMCS which takes the client details and automatically makes a client account for them within PSA and grants them access to the ticketing system, using the same password for WHMCS. This vastly simplifies things for the client, and conforms the tickets into one system.
    Once this file is created, it needs to be placed into the following directory with any name:
    \includes\hooks\AddClientToPSA.php YOU WILL NEED TO QUERY SOME VALUES YOURSELF THROUGH THE API TO MAKE THE HOOK VALID (mentioned as comments) (if you need help with this, I can provide code)
    <?php add_hook('ClientAdd', 1, function($vars) { // Setup the curl request for PSA $curl = curl_init(); // Set the endpoint curl_setopt($curl, CURLOPT_URL, "https://psa.pulseway.com/api/token"); // POST Request curl_setopt($curl, CURLOPT_POST, true); // Credentials for Authorization curl_setopt($curl, CURLOPT_POSTFIELDS, "grant_type=password&username=username&password=userpassword&tenant=companyname"); // Proper header information curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); // Return the transfer as a string curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Get the response $response = json_decode(curl_exec($curl)); // Close the curl curl_close($curl); // Extract the token $token = $response->access_token; // Now to create a new company $curl = curl_init(); // Set the endpoint curl_setopt($curl, CURLOPT_URL, "https://psa.pulseway.com/api/crm/accounts"); // POST Request curl_setopt($curl, CURLOPT_POST, true); // Gather current datetime $date = new DateTime(); // Gather a company name, if specified $companyName = $vars['companyname']; // If they don't have a company name, make it their first name and last name if (empty($companyName)) { $companyName = $vars['firstname'] . $vars['lastname']; } // Build the JSON to go with the request $account = json_encode(array( "AccountCode" => (string)$vars['userid'], "AccountTypeId" => 12345, // UNIQUE TO YOU "AccountName" => $companyName, "Description" => "From WHMCS.", "Website" => null, "BusinessTypeId" => 0, "ServiceTypeId" => 123, // UNIQUE TO YOU "CurrencyId" => 1, "SalesTaxItemId" => null, "AccountManagerId" => 12345, // UNIQUE TO YOU "IsActive" => true, "IsBilling" => true, "AcquiredDate" => $date->format('Y-m-d\TH:i:s.u'), "CreditLimit" => null, "NetDays" => null, "Locations" => [array( "LocationName" => "Main", "IsActive" => true, "IsMain" => true, "Addresses" => [array( "Address1" => $vars['address1'], "Address2" => $vars['address2'], "City" => $vars['city'], "State" => $vars['state'], "ZipCode" => $vars['postcode'], "Phone" => $vars['phonenumber'], "Latitude" => null, "Longitude" => null, "EmailAddress" => $vars['email'], "Fax" => null, "AddressTypeId" => 1 )] )] )); // Add the JSON to the request curl_setopt($curl, CURLOPT_POSTFIELDS, $account); // Set the header, with the authorization token curl_setopt($curl, CURLOPT_HTTPHEADER, array( "Authorization: Bearer " . $token, "Content-Type: application/json", "Accept: application/json" )); // Return the transfer as a string curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Get the response $response = curl_exec($curl); // Close the curl curl_close($curl); // Get the ID of the new account $response_json = json_decode($response); $account_id = $response_json->{'Id'}; // Create a new Contact now $curl = curl_init(); // Set the endpoint curl_setopt($curl, CURLOPT_URL, "https://psa.pulseway.com/api/Import/contacts"); // POST Request curl_setopt($curl, CURLOPT_POST, true); // Build the JSON to go with the request $contact = json_encode(array( "AccountName" => $companyName, "LocationName" => "Main", "FirstName" => $vars['firstname'], "LastName" => $vars['lastname'], "Email" => $vars['email'], "Phone" => $vars['phonenumber'], "JobTitle" => "Client", "Poc" => true, "IsClientPortal" => true, "PortalUsername" => $vars['email'], "PortalPassword" => $vars['password'], "PortalSecurityLevel" => "External User" )); // To conform with Pulseway API format $contact = '[' . $contact . ']'; // Add the JSON to the request curl_setopt($curl, CURLOPT_POSTFIELDS, $contact); // Set the header, with the authorization key curl_setopt($curl, CURLOPT_HTTPHEADER, array( "Authorization: Bearer " . $token, "Content-Type: application/json", "Accept: application/json" )); // Return the transfer as a string curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Close the curl curl_close($curl); }); ?>  
  5. Thanks
    MaxITGarrett got a reaction from karbonphyber in Hardware Assets management   
    Yes, you can have 1 account for the client and many contacts for each person. You can assign things to accounts and then assign it to a corresponding contact.
  6. Like
    MaxITGarrett got a reaction from karbonphyber in [C#] 3CX Windows Plugin to Open Ticket in PSA   
    Not sure how many people use 3CX for their phone systems, but our company utilizes the system and have recently adopted Pulseway as well. As a result, I have developed a plugin for 3CX Windows Client that opens a ticket as you pick up the phone from an incoming call. I have included the source code for reference if anyone else has a need for it.
    Instructions:
    Create a new project. Select C# Language and create a new “Windows Class Library” project. Ensure that the project targets .NET Framework 4.5.1 Add a reference to the library “MyPhoneCRMIntegration.dll” installed with 3CXPhone for Windows (usually C:\ProgramData\3CXPhone for Windows\PhoneApp). Rename Class1.cs to PulsewayTicketPlugin.cs and replace the code with the following: using System; using System.IO; namespace _PulsewayTicketPlugin { [MyPhonePlugins.CRMPluginLoader] public class PulsewayTicketPlugin { // Initialization of Variables private static PulsewayTicketPlugin instance = null; // Holds the instance private MyPhonePlugins.IMyPhoneCallHandler callHandler = null; // Holds the handler private static MyPhonePlugins.CallState lastStatus = MyPhonePlugins.CallState.Undefined; // Holds the last relevant phone status // Called upon loading 3CX Client [MyPhonePlugins.CRMPluginInitializer] public static void Loader(MyPhonePlugins.IMyPhoneCallHandler callHandler) { // Create a new instance of the plugin instance = new PulsewayTicketPlugin(callHandler); } // Constructor for plugin, to add event handler private PulsewayTicketPlugin(MyPhonePlugins.IMyPhoneCallHandler callHandler) { this.callHandler = callHandler; // As the status of the call changes, process the changes callHandler.OnCallStatusChanged += new MyPhonePlugins.CallInfoHandler(callHandler_OnCallStatusChanged); } // Processes the status of the call private void callHandler_OnCallStatusChanged(object sender, MyPhonePlugins.CallStatus callInfo) { // Process the current state // - If it is ringing, a call is incoming, so we want to monitor it // - If it has ended, no longer need to monitor it (happens when we end it or someone else picks it up) // - Don't process other cases, not necessary switch (callInfo.State) { case MyPhonePlugins.CallState.Ended: { lastStatus = MyPhonePlugins.CallState.Undefined; break; }; case MyPhonePlugins.CallState.Ringing: { lastStatus = MyPhonePlugins.CallState.Ringing; break; }; default: { break; }; } // If the phone was ringing and we picked it up, open a new ticket if (lastStatus == MyPhonePlugins.CallState.Ringing && callInfo.State == MyPhonePlugins.CallState.Connected) { // Windows will automatically use the default application used to open URL's System.Diagnostics.Process.Start("https://psa.pulseway.com/MSP/TicketEdit.aspx"); } } } } Build the DLL and place it into the 3CX Phone Directory (C:\ProgramData\3CXPhone for Windows\PhoneApp). Edit the 3CX Phone Configuration file (C:\ProgramData\3CXPhone for Windows\PhoneApp\3CXWin8Phone.user.config) and add the following: <add key="CRMPlugin" value="CallNotifier,3CXPhoneTapiPlugin,PulsewayTicketPlugin"/> Reload your 3CX Windows Client and it should work with the next incoming call!
  7. Like
    MaxITGarrett got a reaction from karbonphyber in [C#] Inventory Product Import Tool from Excel   
    Our business operates with hundreds of products in our inventory and going through all of them and manually entering them into PSA was not exactly an option, and without an import function, I had to develop an import tool that uses the PSA API. I developed it originally with hard coded parameters, in a single class, but went back today and improved it for distribution to everyone here.
    To view the source code, check out the repository at https://bitbucket.org/garrettbromley/pulseway-product-import/
    To download the executable files, download PulsewayProductImport-v2.zip at https://bitbucket.org/garrettbromley/pulseway-product-import/downloads/
     
    Instructions:
    Download the Excel template and add your inventory into that sheet. I personally had a Microsoft Surface that I walked around with and inventoried everything. To change the categories/sub categories, open the "Back End" tab on the sheet and edit those tables to your liking The only column that isn't required is the UPC Code. Run the Import Tool Input your PSA credentials Type in the full directory to the excel sheet (make sure its closed before running it) Confirm the number of detected items Watch the tool work Make a stock adjustment with the levels of stock for each item (this unfortunately cannot be automated) It will notify you how many items have successfully been imported and which ones failed (if any) and why.  
    Please let me know if you have any questions! I will post changelogs if any updates are made.
  8. Upvote
    MaxITGarrett reacted to Gary Haberl in Huge Ticket Titles from RMM Events   
    I couldn't agree more Max.
    It feels like the RMM is putting all the info for a ticket in the title and description of the ticket.  The title of the ticket needs to be short.  Our Techs have complained about this many times, and again in our meeting today.
     
    Gary
  9. Upvote
    MaxITGarrett reacted to ArrowNM in Record Remote Control Sessions   
    +1
    This would be a great feature for activity auditing and training purposes.
  10. Like
    MaxITGarrett reacted to Gary Haberl in [C#] 3CX Windows Plugin to Open Ticket in PSA   
    FANTISTIC.
    Yes we use 3CX, and will look at this. 
    Thank you.
  11. Like
    MaxITGarrett got a reaction from Paul in [PHP] WHMCS Hook to Automatically Add to PSA   
    For those of you who would like to use WHMCS (Automated web hosting platform) but wish to use Pulseway PSA for your main ticketing software and for managing your consulting business if you are an MSP like us, I had to make a hook for WHMCS which takes the client details and automatically makes a client account for them within PSA and grants them access to the ticketing system, using the same password for WHMCS. This vastly simplifies things for the client, and conforms the tickets into one system.
    Once this file is created, it needs to be placed into the following directory with any name:
    \includes\hooks\AddClientToPSA.php YOU WILL NEED TO QUERY SOME VALUES YOURSELF THROUGH THE API TO MAKE THE HOOK VALID (mentioned as comments) (if you need help with this, I can provide code)
    <?php add_hook('ClientAdd', 1, function($vars) { // Setup the curl request for PSA $curl = curl_init(); // Set the endpoint curl_setopt($curl, CURLOPT_URL, "https://psa.pulseway.com/api/token"); // POST Request curl_setopt($curl, CURLOPT_POST, true); // Credentials for Authorization curl_setopt($curl, CURLOPT_POSTFIELDS, "grant_type=password&username=username&password=userpassword&tenant=companyname"); // Proper header information curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded')); // Return the transfer as a string curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Get the response $response = json_decode(curl_exec($curl)); // Close the curl curl_close($curl); // Extract the token $token = $response->access_token; // Now to create a new company $curl = curl_init(); // Set the endpoint curl_setopt($curl, CURLOPT_URL, "https://psa.pulseway.com/api/crm/accounts"); // POST Request curl_setopt($curl, CURLOPT_POST, true); // Gather current datetime $date = new DateTime(); // Gather a company name, if specified $companyName = $vars['companyname']; // If they don't have a company name, make it their first name and last name if (empty($companyName)) { $companyName = $vars['firstname'] . $vars['lastname']; } // Build the JSON to go with the request $account = json_encode(array( "AccountCode" => (string)$vars['userid'], "AccountTypeId" => 12345, // UNIQUE TO YOU "AccountName" => $companyName, "Description" => "From WHMCS.", "Website" => null, "BusinessTypeId" => 0, "ServiceTypeId" => 123, // UNIQUE TO YOU "CurrencyId" => 1, "SalesTaxItemId" => null, "AccountManagerId" => 12345, // UNIQUE TO YOU "IsActive" => true, "IsBilling" => true, "AcquiredDate" => $date->format('Y-m-d\TH:i:s.u'), "CreditLimit" => null, "NetDays" => null, "Locations" => [array( "LocationName" => "Main", "IsActive" => true, "IsMain" => true, "Addresses" => [array( "Address1" => $vars['address1'], "Address2" => $vars['address2'], "City" => $vars['city'], "State" => $vars['state'], "ZipCode" => $vars['postcode'], "Phone" => $vars['phonenumber'], "Latitude" => null, "Longitude" => null, "EmailAddress" => $vars['email'], "Fax" => null, "AddressTypeId" => 1 )] )] )); // Add the JSON to the request curl_setopt($curl, CURLOPT_POSTFIELDS, $account); // Set the header, with the authorization token curl_setopt($curl, CURLOPT_HTTPHEADER, array( "Authorization: Bearer " . $token, "Content-Type: application/json", "Accept: application/json" )); // Return the transfer as a string curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Get the response $response = curl_exec($curl); // Close the curl curl_close($curl); // Get the ID of the new account $response_json = json_decode($response); $account_id = $response_json->{'Id'}; // Create a new Contact now $curl = curl_init(); // Set the endpoint curl_setopt($curl, CURLOPT_URL, "https://psa.pulseway.com/api/Import/contacts"); // POST Request curl_setopt($curl, CURLOPT_POST, true); // Build the JSON to go with the request $contact = json_encode(array( "AccountName" => $companyName, "LocationName" => "Main", "FirstName" => $vars['firstname'], "LastName" => $vars['lastname'], "Email" => $vars['email'], "Phone" => $vars['phonenumber'], "JobTitle" => "Client", "Poc" => true, "IsClientPortal" => true, "PortalUsername" => $vars['email'], "PortalPassword" => $vars['password'], "PortalSecurityLevel" => "External User" )); // To conform with Pulseway API format $contact = '[' . $contact . ']'; // Add the JSON to the request curl_setopt($curl, CURLOPT_POSTFIELDS, $contact); // Set the header, with the authorization key curl_setopt($curl, CURLOPT_HTTPHEADER, array( "Authorization: Bearer " . $token, "Content-Type: application/json", "Accept: application/json" )); // Return the transfer as a string curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); // Close the curl curl_close($curl); }); ?>  
  12. Thanks
    MaxITGarrett got a reaction from Paul in [C#] 3CX Windows Plugin to Open Ticket in PSA   
    Of course! I have some more snippets to share on the API side of things as well.
  13. Like
    MaxITGarrett got a reaction from Paul in [C#] 3CX Windows Plugin to Open Ticket in PSA   
    Not sure how many people use 3CX for their phone systems, but our company utilizes the system and have recently adopted Pulseway as well. As a result, I have developed a plugin for 3CX Windows Client that opens a ticket as you pick up the phone from an incoming call. I have included the source code for reference if anyone else has a need for it.
    Instructions:
    Create a new project. Select C# Language and create a new “Windows Class Library” project. Ensure that the project targets .NET Framework 4.5.1 Add a reference to the library “MyPhoneCRMIntegration.dll” installed with 3CXPhone for Windows (usually C:\ProgramData\3CXPhone for Windows\PhoneApp). Rename Class1.cs to PulsewayTicketPlugin.cs and replace the code with the following: using System; using System.IO; namespace _PulsewayTicketPlugin { [MyPhonePlugins.CRMPluginLoader] public class PulsewayTicketPlugin { // Initialization of Variables private static PulsewayTicketPlugin instance = null; // Holds the instance private MyPhonePlugins.IMyPhoneCallHandler callHandler = null; // Holds the handler private static MyPhonePlugins.CallState lastStatus = MyPhonePlugins.CallState.Undefined; // Holds the last relevant phone status // Called upon loading 3CX Client [MyPhonePlugins.CRMPluginInitializer] public static void Loader(MyPhonePlugins.IMyPhoneCallHandler callHandler) { // Create a new instance of the plugin instance = new PulsewayTicketPlugin(callHandler); } // Constructor for plugin, to add event handler private PulsewayTicketPlugin(MyPhonePlugins.IMyPhoneCallHandler callHandler) { this.callHandler = callHandler; // As the status of the call changes, process the changes callHandler.OnCallStatusChanged += new MyPhonePlugins.CallInfoHandler(callHandler_OnCallStatusChanged); } // Processes the status of the call private void callHandler_OnCallStatusChanged(object sender, MyPhonePlugins.CallStatus callInfo) { // Process the current state // - If it is ringing, a call is incoming, so we want to monitor it // - If it has ended, no longer need to monitor it (happens when we end it or someone else picks it up) // - Don't process other cases, not necessary switch (callInfo.State) { case MyPhonePlugins.CallState.Ended: { lastStatus = MyPhonePlugins.CallState.Undefined; break; }; case MyPhonePlugins.CallState.Ringing: { lastStatus = MyPhonePlugins.CallState.Ringing; break; }; default: { break; }; } // If the phone was ringing and we picked it up, open a new ticket if (lastStatus == MyPhonePlugins.CallState.Ringing && callInfo.State == MyPhonePlugins.CallState.Connected) { // Windows will automatically use the default application used to open URL's System.Diagnostics.Process.Start("https://psa.pulseway.com/MSP/TicketEdit.aspx"); } } } } Build the DLL and place it into the 3CX Phone Directory (C:\ProgramData\3CXPhone for Windows\PhoneApp). Edit the 3CX Phone Configuration file (C:\ProgramData\3CXPhone for Windows\PhoneApp\3CXWin8Phone.user.config) and add the following: <add key="CRMPlugin" value="CallNotifier,3CXPhoneTapiPlugin,PulsewayTicketPlugin"/> Reload your 3CX Windows Client and it should work with the next incoming call!
×
×
  • Create New...