Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;Functions
- WM_KEYDOWN(wParam, lParam, nMsg, hWnd)
- {
- global pipa
- static keys:={9:"tab", 13:"enter", 46:"delete", 38:"up", 40:"down"}
- if keys.HasKey(wParam)
- {
- WinGetClass, ClassName, ahk_id %hWnd%
- if (ClassName = "Internet Explorer_Server")
- {
- ;// Build MSG Structure
- VarSetCapacity(Msg, 48)
- for i,val in [hWnd, nMsg, wParam, lParam, A_EventInfo, A_GuiX, A_GuiY]
- NumPut(val, Msg, (i-1)*A_PtrSize)
- ;// Call Translate Accelerator Method
- TranslateAccelerator := NumGet(NumGet(1*pipa)+5*A_PtrSize)
- DllCall(TranslateAccelerator, "Ptr",pipa, "Ptr",&Msg)
- return, 0
- }
- }
- }
- MessageBoxCheck(Text, Title := "", Options := 0, RegVal := "", Owner := 0) {
- If (DllCall("GetVersion") & 0xFF < 6) {
- hModule := DllCall("GetModuleHandle", "Str", "shlwapi.dll", "Ptr")
- SHMessageBoxCheck := DllCall("GetProcAddress", "Ptr", hModule, "UInt", (A_IsUnicode) ? 191 : 185, "Ptr")
- } Else {
- SHMessageBoxCheck := "Shlwapi\SHMessageBoxCheck"
- }
- Ret := DllCall(SHMessageBoxCheck
- , "Ptr" , Owner ? Owner : DllCall("GetDesktopWindow", "Ptr")
- , "Str" , Text
- , "Str" , Title
- , "UInt", Options
- , "int" , 0
- , "Str" , (RegVal != "") ? RegVal : A_ScriptFullPath)
- Return {0: "Suppressed", 1: "OK", 2: "Cancel", 3: "Abort", 4: "Retry", 5: "Ignore", 6: "Yes", 7: "No", 10: "Try Again", 11: "Continue"}[Ret]
- }
- GrabMPRs(checkit)
- {
- Main:
- Gosub,init
- url:="https://dealertrack-production.my.salesforce.com/00O0e000004iT67"
- WB.Navigate(url)
- loop
- If !WB.busy
- break
- Text := "Please login to salesforce, once logged in you may click OK and contine. DO NOT CLICK OK WITHOUT LOGGING IN!"
- MessageBoxCheck(Text, "Login to Salesforce to continue", 0x30, "")
- UrlDownloadToFile,https://dealertrack-production.my.salesforce.com/00O0e000004iT67, %A_Desktop%\MPRDownload.txt
- MsgBox, Thanks! We have captured your MPRs for the month!
- Gui,Destroy
- FileRead,expression,%A_Desktop%\MPRDownload.txt
- FileDelete, %A_Desktop%\MPRDownload.txt
- pos := 0
- While(pos := RegExMatch(expression, "<tr class=""even"" valign=""top""><td ><a href=""\/[0-9a-zA-Z]+"">(.*?)<\/a><\/td><td >(.*?)<\/td><\/tr>\s", res,pos+1)) {
- ;RegExMatch(res,">.^?<",res2,pos+1)
- FileAppend,%res%,%A_desktop%\MPRDownload.txt
- }
- MsgBox,First Cleanup Passthrough Completed
- FileRead,cleanedOutput,%A_Desktop%\MPRDownload.txt
- FileDelete, %A_Desktop%\MPRDownload.txt
- pos:=0
- while(pos := RegExMatch(cleanedOutput,">.*?<", res, pos + 1)) {
- FileAppend,%res%,%A_desktop%\MPRDownload.txt
- }
- MsgBox,Second Cleanup passthrough Completed
- FileRead,checkMe,%A_Desktop%\MPRDownload.txt
- StringReplace,checkMe2,checkMe,<><><>,|,All
- StringReplace,checkMe3,checkMe2,<><><><>,|,All
- StringReplace,checkMe4,checkMe3,>,,All
- StringReplace,checkMe5,checkMe4,<,,All
- FileDelete %A_Desktop%\MPRDownload.txt
- FileAppend,%checkMe5%,%A_desktop%\MPRdownload.txt
- MsgBox,StringReplaces have been completed
- ;Working example of regex & replace to clean up our MPR ID numbers
- /*FileRead,Haystack,%A_desktop%\MPRDownload.txt
- Needle = %checkit%
- StringGetPos, pos, Haystack, %Needle%
- Offset := StrLen(Needle)+2
- MsgBox, %offset%
- MsgBox, The string was found at position %pos%.
- Final:=subStr(Haystack,pos + Offset,15)
- MsgBox,%final%
- */
- return
- }
- ;**************************************************************************************inital setup**************************************************************************************
- #Include %A_ScriptDir%\Internal\Settings.txt ;Pull in our values from the text file as vars
- #include %A_ScriptDir%\internal\functions.ahk ;Pull in our function list
- ;Set up our path vars
- settingsPath=%A_WorkingDir%\Internal\Settings.txt
- AccountListPath=%A_WorkingDir%\Assets\Accounts.txt
- emailTemplatePath = %A_WorkingDir%\Assets\MPRTemplate.docx
- ;Loop through our accounts list & add accounts to listbox var
- Loop,Read,%AccountListPath%
- ListVar .= (A_Index == 1 ? "" : "|") . A_LoopReadLine
- /*in the above lines, A_Index is the number of the loop, for instance the first time it runs, the A_index is 1. The ? : symbols are the teriary operator, a shorthand for if else. so this line litterally says:
- ListVar = 1=1 if blank then replace with |
- So in this case, at the end of each line, add a | so the listBox knows where to delimit the values
- */
- ;Collect Notes for our FordDirect deck from our Word Document
- ;***********
- ;TODO
- ;This should be a function
- ;***********
- Clipsave := ClipboardAll ; Saves previous Clipboard
- Clipboard = ;Empty the Clipboard to prep for template load
- oWord := ComObjCreate("Word.Application") ; create MS Word object
- oDoc := oWord.documents.Open(emailTemplatePath) ;Sliently opens our template
- oWord.Selection.WholeStory ;This is akin to Select All
- oWord.Selection.copy ;Copy all the text with formatting
- emailTemplate = %ClipboardAll% ;Load the template into a var to free up our clipboard
- oDoc.Close(0) ;Unload the MS Word object
- oWord.Quit() ;Quit MS Word
- Clipboard = %ClipSave% ;Restore our old Clipboard so the user doesn't know what we did.
- ;Set up our time based vars
- LMoutputDate = %A_YYYY%%A_MM%01 ;Set the output format for the date for "Last Month"
- LMoutputDate += -1, days ;In the previous line we set the day to "01" so we subtracted one to get the previous months' end date
- TMoutputDate = %A_YYYY%%A_MM%01 ;we're doing the same thing here for "This Month"
- TMoutputDate += -0, days ;No need to subtract a day
- FormatTime, LMmonthEnd, %LMoutputDate%, yyyy-MM-dd ;Sets var output for the end of month date
- FormatTime, LMmonthStart, %LMoutputDate%, yyyy-MM-01 ;Sets var output for beginning of month date, we know that the day will always start with 01.
- FormatTime, lastMonthFull, %LMoutputDate%, MMMM ;Sets var output to grab the text for last month's date
- FormatTime, TMmonthEnd, %TMoutputDate%,yyyy-MM-dd ;Sets var output to end of this month's date
- FormatTime, TMmonthStart,%TMoutputDate%, yyyy-MM-01 ;Sets var output to start of this month's date
- FormatTime, thisMonthFull,%TMoutputDate%, MMMM ;Sets var output to grab the text for this month's date
- ;**************************************************************************************Run errorCheck**************************************************************************************
- If(emailTemplate="" ) ;Alert if emailTemplate isn't set.
- {
- MsgBox, There is no Email Template Loaded! You will not be able to send an email.
- }
- If(SFName="" ) ;Alert if SFname isn't set
- {
- MsgBox, You don't have a SalesForce name input, please add it in the settings.
- }
- If(MPRPath="" ) ;Alert if MPRPath isn't set
- {
- MsgBox, You don't have a MPR deck selected for your template MPRs, please choose one in the settings
- }
- Process,Exist,OUTLOOK.EXE ;Check if Outlook is running. If it isn't, the app will break. This line sets ErrorLevel to the Task Manager ID of the process, so we'll just check if it's over 0
- IF(ErrorLevel < 1) ;If errorlevel is present, we'll alert the user, and open outlook.
- {
- MsgBox,Looks like outlook isn't running. This program runs faster when Outlook is already running. Since this program is about making life faster, we'll go ahead and start it up for you! Please leave it running while using this app.
- run outlook.exe
- }
- ErrorLevel= ;Reset ErrorLevel, we might need it later.
- ;**************************************************************************************Set up 1st Gui**************************************************************************************
- Gui, 1:Add, Button, x2 y825 w120 h50 , Email Only
- Gui, 1:Add, Button, x302 y825 w120 h50 Default, Begin MPR Preview
- Gui, 1:Add, Button, x550 y825 w120 h50 , Web Page Only
- Gui, 1:Add, Button, x492 y50 w100 h50 , Add Account
- Gui, 1:Add, Text, x215 y58, You will enter your account id in a `n popup
- Gui, 1:Add, Button, x492 y0 w100 h50 , Delete Account
- Gui, 1:Add, Button, x492 y100 w100 h50 , Edit Template
- Gui, 1:Add, Button, x492 y150 w100 h50, Bulk Account Edit
- Gui, 1:Add, Button, x492 y250 w100 h50, Start MPR Loop
- Gui, 1:Add, Button, x492 y300 w100 h50, Open MPR Dashboard
- Gui, 1:Add, Button, x492 y350 w100 h50, Grab MPRs
- Gui, 1:Add, Text, x215 y302, Open an MPR Dashboard to show`nyour MPR stats for the month.
- Gui, 1:Add, Text, x215 y5,Select your account from the left`nand click delete to remove it
- Gui, 1:Add, Text, x215 y108,Click to edit your email template
- Gui, 1:Add, Text, x215 y153, Edit Accounts in bulk. Enter one`nper line
- Gui, 1:Add, Text, x215 y258, Clicking this will start your MPR loop
- Gui, 1:Add, ListBox, x6 y-1 w200 h836 vAccountSelector , %ListVar%
- Gui, 1:Add, Radio, x492 y200 vTemplateMPR, Template MPR
- Gui, 1:Add, Radio, vCustomMPR, Custom MPR
- Gui, 1:Add, Text, x215 y203, Select Custom if you want to`nspecify a file to attach to the email
- Gui, 1:Add, Button, x492 y750 w100 h50, Edit Settings
- Gui, 1:Show, w700 h888, MPR Preview Generator
- Gui, 2:Add, Button, x60 y440 w100 h50,Close Settings
- Gui, 2:Add, Button, x360 y440 w100 h50,Save Settings
- Gui, 2:Add, Edit, vSFNameTextBox x250 y10 w200 h30,%SFName%
- Gui, 2:Add, Edit, vMPRPathTextBox x250 y90 w200 h30,%MPRPath%
- Gui, 2:Add, Text, x10 y10,Enter your name as it appears`nin salesforce
- Gui, 2:Add, Text, x10 y90,Enter the path for your MPR Deck`nTemplate
- Gui, 2:Add, Button, x240 y150 w100 h50, Browse
- Gui, 3: +LastFound +Resize +OwnDialogs
- Gui, 3:Add, ActiveX, w510 h600 x0 y0 vWB hwndATLWinHWND, Shell.Explorer
- WB.silent := true
- IOleInPlaceActiveObject_Interface:="{00000117-0000-0000-C000-000000000046}"
- pipa := ComObjQuery(WB, IOleInPlaceActiveObject_Interface)
- OnMessage(WM_KEYDOWN:=0x0100, "WM_KEYDOWN")
- OnMessage(WM_KEYUP:=0x0101, "WM_KEYDOWN")
- GuiControl,,TemplateMPR,1 ;Let's default the radio button to Template MPR. Even if its not set we'll use that by default, but let's cue in the user
- return
- GuiClose: ;Click the X button in the top corner to close App
- ExitApp
- ;**************************************************************************************Begin Button/Gui Control**************************************************************************************
- 2ButtonBrowse:
- FileSelectFile,MPRPathBrowser,1 ;Launch the filebrowser. Can't find a way to pass the path between this and the save button so we'll pass it to the clipboard for now.
- ClipSave=%ClipBoard% ;save old clipboard contents
- Clipboard=%MPRPathBrowser% ;send file browser path to clipboard
- ;***********************
- ;TODO
- ;I had to pass this to the clipboard to get it to go between buttons, find a way around this
- ;***********************
- return
- 2ButtonSaveSettings:
- Gui, submit, NoHide
- newSFName=%SFNameTextBox%`n ;Pull the var from the SFname textbox, add a new line at the end
- newMPRPath=%ClipBoard%`n ;^same but with MPRPath
- FileDelete,%settingsPath% ;Delete exisiting settings file
- FileAppend,SFname=%newSFName%,%settingsPath% ;put in the new value from the txtBox. prefix it with SFname= so our #include can pick it up
- FileAppend,MPRPath=%newMPRPath%,%settingsPath% ;^same but with MPRPath
- Clipboard=%ClipSave% ;Restore clipboard. Why can I pass this through the buttons but not a var?
- MsgBox, Settings Saved`,Reloading application to catch new settings ;alert user
- Reload ;Refresh application so user will see changed settings.
- return
- 2ButtonCloseSettings: ;Hides the settings gui
- Gui, submit,NoHide
- Gui, 2:hide
- return
- ButtonOpenMPRDashboard:
- MPRDashboardURL = https://dealertrack-production.my.salesforce.com/01Z0e000000UIsl
- run chrome.exe %MPRDashboardURL%
- return
- ButtonGrabMPRs:
- Gui,Submit,NoHide
- checkit=%AccountSelector%
- GrabMPRs(checkit)
- ButtonStartMPRLoop:
- breakLoop=0 ;Set breakLoop to 0, user will use ALT + END to end the loop, that hotkey sets breakloop to 1.
- Gui, Submit, NoHide ; Save the input from the user to each control's associated variable.
- ServiceID = %AccountSelector% ;Collect Service account ID for script from listBox
- MsgBox,Starting your MPR Loop from %ServiceID%, When you complete the MPR Preview, press PAGE DOWN on your keyboard to automatically start the next one. Hold ALT and press the END key a couple times on your keyboard to stop the loop.
- Loop{ ;Start up our loop! First, we'll check if breakLoop is one to see if we should continue
- if(breakLoop = 1)
- {
- break
- }
- Gui,Submit,NoHide
- ServiceID = %AccountSelector% ;Collect Service account ID for script from listBox
- execSummaryURL=https://apps.dealer.com/analytics/as/%ServiceID%/%ServiceID%-admin/report/executive-summary?endDate=%LMmonthEnd%&startDate=%LMmonthStart% ;set executive summary for account to last month
- admiralURL=http://admiral.dealer.com/#/accounts/%ServiceId%?endDate=%LMmonthEnd%&startDate=%LMmonthStart% ;set admirial to last month
- ClipSave = %Clipboard%
- if(customMPR=1) ;Check the MPR type!
- {
- FileSelectFile,MPRPath,1
- }
- else
- {
- MPRPath=%MPRPath%
- }
- run outlook.exe /c ipm.note /a "%MPRPath%" /m %ServiceID%&subject=MPR`%20Preview`%20%thisMonthFull% ;Open email, use account ID as the contact group in the TO field.
- Sleep, 2000
- Clipboard = %emailTemplate% ;Load our template back into the clipboard.
- Send ^v ;Paste contents from our notes doc into our email, then we'll restore the old clipboard so no one notices what we did.
- Sleep, 500
- Send ^{Home}
- Sleep, 500 ;add a moment for clipboard to paste before we restore it
- Clipboard = %ClipSave% ; Restore Clipboard
- run chrome.exe %execSummaryURL% %admiralURL% ;Open chrome with 2 active tabs above
- KeyWait,PgDn,D ;We're waiting for the user to press down the PAGE DOWN button to continue. Tip: the ",D" stands for DOWN
- WinActivate, MPR Preview Generator ;Activate our window, it's probably minimized right now.
- GuiControl, Focus,AccountSelector ;Focus on the list box
- Send,{Down} ;Send the down arrow key to select the next account
- continue ;Iterate our loop!
- ;***********************
- ;TODO
- ;This needs to be a function as well
- ;***********************
- }
- return
- !END:: ;Setup the END key to break our loop above
- breakLoop = 1
- return
- ButtonEditSettings: ;Launch settings gui
- Gui, Submit, NoHide
- Gui, 2:show, w500 h500,Edit Settings
- return
- ButtonBulkAccountEdit: ;Allow users to directly edit their account's text file. We'll move this to a CSV later so we can pull additional account info.
- run, %AccountListPath%
- Process WaitClose,notepad.exe
- MsgBox,Reloading application to get new Account List
- Reload
- ;***********************
- ;TODO
- ;Switch to a CSV
- ;***********************
- return
- ButtonEditTemplate: ;Allow users to edit their Word Doc containing the email template directly.
- run %emailTemplatePath% ;Open word
- Process WaitClose, WINWORD.EXE ;Watch the word process in the task manager, when it closes, we'll reload the app so the new template is catched.
- MsgBox, Reloading application to get new template ;alert user
- Reload
- return
- ButtonDeleteAccount: ;Users will select the account to remove from the ListBox and click here, removing account's string from the text file. <-
- Gui, Submit, NoHide ; Save the input from the user to each control's associated variable. ; Watch out for those carriage returns `r`n, they were crazy difficult to get rid of.
- ListVar= ;empty ListVar so it doesn't duplicate accounts on rebuild of ListBox.
- ServiceID = %AccountSelector% ;Collect Service account ID for script from listBox
- FileRead, accountList, %accountListPath% ;Read the account list and load it into memory for manipulation.
- StringReplace, accountList,accountList,%serviceID%,,All ;Replace the ServiceID with empty String
- MsgBox, %ServiceID% has been removed from Account List. ;Notify user of replacement
- FileDelete, %AccountListPath% ;No easy way in AHK to replace a string, so we have to delete existing file.
- FileAppend, %accountList%, %AccountListPath% ;We append the account list sans deleted string from memory into a new copy of the file, our user doesn't know that just happened.
- Loop,Read,%AccountListPath% ;We're looking for those damn blank lines and removing them to keep our list clean, blank lines are found with `r`n.
- If (A_LoopReadLine!="")
- newText.=A_LoopReadLine "`r`n" C
- {
- FileDelete,%AccountListPath%
- FileAppend,%newText%,%AccountListPath%
- }
- GuiControl,, AccountSelector, | ;Empty the existing values in ListBox from memory, prep for redraw of box via the below loop.
- ListVar2 = ;Set var to load from loop as empty.
- Loop,Read,%accountListPath% ;Re-read the edited accounts file and load it into memory.
- ListVar2 .= (A_Index == 1 ? "" : "|") . A_LoopReadLine
- GuiControl,,AccountSelector,%ListVar2% ;Since the ListBox is already added, we use GuiControl to update the box.
- return
- ButtonAddAccount: ;Users click this button and an input box will come up, asking them to input new service ID. Later, this will be a second gui with <-
- ListVar= ; more boxes saved to a settings file.
- GuiControl,, AccountSelector, | ;Clear ListBox for update
- InputBox, addAccountvar,Add Account,Add an account to your list ;Popup our input box, store input in addAccountvar
- FileAppend,`n%addAccountvar% ,%accountListPath% ;Add the serviceID to end of the txt file, in a new line.
- Loop,Read,%accountListPath% ;Re-read the account file to prep for ListBox Update.
- ListVar .= (A_Index == 1 ? "" : "|") . A_LoopReadLine
- GuiControl,,AccountSelector,%ListVar% ;Update ListBox
- return
- ButtonWebPageOnly: ;This will grab ServiceID from the Listbox, and only launch chrome, instead of also launching outlook
- Gui, Submit, NoHide ; Save the input from the user to each control's associated variable.
- ServiceID = %AccountSelector% ;Collect Service account ID for script from listBox
- execSummaryURL=https://apps.dealer.com/analytics/as/%ServiceID%/%ServiceID%-admin/report/executive-summary?endDate=%LMmonthEnd%&startDate=%LMmonthStart% ;set executive summary for account to last month
- admiralURL=http://admiral.dealer.com/#/accounts/%ServiceID%?endDate=%LMmonthEnd%&startDate=%LMmonthStart% ;set admirial to last month
- run chrome.exe %execSummaryURL% %admiralURL% ;Open Chrome with 2 tabs
- ;***********************
- ;TODO
- ;We're repeating this code, this should be a function
- ;***********************
- return
- ButtonEmailOnly:
- Gui, Submit, NoHide ; Save the input from the user to each control's associated variable.
- ServiceID = %AccountSelector% ;Collect Service account ID for script from listBox
- ClipSave = %Clipboard% ;Store clipboard in var
- if(customMPR=1)
- {
- FileSelectFile,MPRPath,1
- }
- else
- {
- MPRPath=%MPRPath%
- }
- run outlook.exe /c ipm.note /a "%MPRPath%" /m %ServiceID%&subject=MPR`%20Preview`%20%thisMonthFull%&body= ;Open email, use account ID as the contact group in the TO field.
- Sleep, 2000
- Clipboard = %emailTemplate% ;Load our template back into the clipboard.
- Send ^v ;Paste contents from our notes doc into our email, then we'll restore the old clipboard so no one notices what we did.
- Sleep, 500
- Send ^{Home}
- Sleep, 500 ;add a moment for clipboard to paste before we restore it
- Clipboard = %ClipSave% ; Restore Clipboard
- ;***********************
- ;TODO
- ;We're repeating this code, it should also be a function.
- ;***********************
- return
- ButtonBeginMPRPreview:
- Gui, Submit, NoHide ; Save the input from the user to each control's associated variable.
- ServiceID = %AccountSelector% ;Collect Service account ID for script from listBox
- execSummaryURL=https://apps.dealer.com/analytics/as/%ServiceID%/%ServiceID%-admin/report/executive-summary?endDate=%LMmonthEnd%&startDate=%LMmonthStart% ;set executive summary for account to last month
- admiralURL=http://admiral.dealer.com/#/accounts/%ServiceId%?endDate=%LMmonthEnd%&startDate=%LMmonthStart% ;set admirial to last month
- ClipSave = %Clipboard%
- if(customMPR=1)
- {
- FileSelectFile,MPRPath,1
- }
- else
- {
- MPRPath=%MPRPath%
- }
- run outlook.exe /c ipm.note /a "%MPRPath%" /m %ServiceID%&subject=MPR`%20Preview`%20%thisMonthFull% ;Open email, use account ID as the contact group in the TO field.
- Sleep, 1000
- Clipboard = %emailTemplate% ;Load our template back into the clipboard.
- Send ^v ;Paste contents from our notes doc into our email, then we'll restore the old clipboard so no one notices what we did.
- Sleep, 1000
- Send ^{Home}
- Sleep, 1000 ;add a moment for clipboard to paste before we restore it
- Clipboard = %ClipSave% ; Restore Clipboard
- run chrome.exe %execSummaryURL% %admiralURL% ;Open chrome with 2 active tabs above
- ;***********************
- ;TODO
- ;This needs to be a function as well
- ;***********************
- return
- ;**************************************************************************************Future Feature List**************************************************************************************
- ;Refactor Code to use functions so things look all pretty and the like
- ;Our reloads for new settings depend on user closing all process of that type. If they have two notepads open we don't reload the script. Lets grab the actual process ID and reload with that specific one is closed instead
- ;In emailOnly & MPR Preview, find another way to get the emailTemplate in there other than pasting it from the clipboard, it feels dirty.
- ;Use the AHK mini browser to open a report for the new MPRS and get their IDs. Users will be able to login and it will autodownload and scrape the page.
- ;MPR Dashboard in salesforce that users can click on their name in a filter box
- ;https://dealertrack-production.my.salesforce.com/00T/e?what_id=5000e00001ETDxY&retURL=%2F5000e00001ETDxY&RecordType=012320000001Ewh&ent=Task&tsk5=test%20call&00N60000001maZs=Call%20-%20Outbound&00N60000002HjXN=Schedule%20Meeting&tsk12=Completed&tsk4=9/29/2017&tsk13=Normal
- ;^One click link to log a call, all we need to know is the MPR case's ID.
- ;ref:_00D30JqC._5000e1ETDxY:ref
- ;00D30 is ORG ID
- ;JqC._ = a random string of chars it looks like.
- ;5000e1ETDxY = portion of case id
- ;^use above ex to auto attach an email to an MPR
- ;Use our browser to download the executive summary PDF
- ;***********************SUPER FEATURES***********************
- ;Using COM, open a browser and login to SF.
- ;Using COM, be able to log a call
- ;Using COM, be able to open or close a case/MPR
- ;Using COM, download a flat file for the user containing their accounts, and the MPRs that exist on those accounts. We can loop through that and save it to a settings file, that way the user can click a button and launch chrome to that MPR
- ;
- ;***********************
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement