Question

SharePoint 2013 Enterprise, Visual Studio 2013 Premium

I have a requirement to re-open a record that has been moved to a records center. In our case, records consist of a custom DocumentSet based content type and documents within the DocumentSet. When they re-open it, I am to reset the Completion Date to null.

I think the best way to accomplish this is via the DocumentSet.SendToOfficialFile method. The following code snippet is from a Console Application I am using for proof of concept.

        try
        {

            using (SPSite site = new SPSite(recordUrl))
            {

                using (SPWeb web = site.RootWeb)
                {

                    // Parse out some url parameters we will need
                    Hashtable hash = ParseParametersFromUrl(recordUrl);
                    if (!hash.ContainsKey("List"))
                        throw new ArgumentException(string.Format("Could not parse the ListId from Url '{0}'", recordUrl));

                    // Get the documentset
                    Guid ListId = new Guid(hash["List"].ToString());
                    SPList list = web.Lists[ListId];
                    SPListItem item = list.GetItemById(Convert.ToInt16(hash["ID"]));
                    DocumentSet docset = DocumentSet.GetDocumentSet(item.Folder);

                    // Is it a record
                    Console.WriteLine(string.Format("   Is DocSet Record: {0}", Records.IsRecord(docset.Item)));

                    // Unrecord the files
                    foreach (SPFile f in docset.Folder.Files)
                    {

                        if (Records.IsRecord(f.Item))
                            Records.UndeclareItemAsRecord(f.Item); 

                    } // end foreach file

                    // Null the completion date
                    docset.Item["PICompletionDate"] = null;
                    docset.Item.Update();

                    // Build SPOfficialFileHost
                    string additionalInfo;
                    Uri tgtUri = new Uri(string.Format("http://mywebapp/activesite/_vti_bin/OfficialFile.asmx", docset.ContentType.Name));
                    SPOfficialFileHost targetHost = new SPOfficialFileHost();
                    targetHost.Action = SPOfficialFileAction.Move;
                    targetHost.Explanation = "Move to active";
                    targetHost.OfficialFileName = docset.Item.Title;
                    targetHost.OfficialFileUrl = tgtUri;
                    targetHost.ShowOnSendToMenu = false;

                    // SendTo active edit site
                    OfficialFileResult result = docset.SendToOfficialFile(docset.ContentType.Name, out additionalInfo, targetHost, null, SPOfficialFileSubmissionMode.None);

                    Console.WriteLine("additionalInfo: {0}", additionalInfo);
                    Console.WriteLine("result: {0}", result.ToString());

                } // end using SPWeb

            } // end using SPSite

            return true;
        }
        catch(Exception ex)
        {

            string msg = string.Format("Exception in ReOpen: {0}", ex.Message);
            Console.WriteLine();
            Console.WriteLine(msg);
            return false;

        } // end catch

    } // end Method ReOpen

Via the VS Debugger and various Console.WriteLine() statements, I can tell you all goes well until the docset.SendToOfficialFile line. Even that line executes without an exception, however, additionalInfo is empty and result is "Not Found".

Things I have verified:
1) The Content Organizer Settings at the SendTo destination
2) The OfficialFile.asmx Url at the SendTo destination
3) DocumentSet and Files are undeclared as records
4) The Completion Date property is updated to null

Things I have tried: 1) Non-null email address in the docset.SendToOfficialFile method call
2) Various incarnations of properties on SPOfficialFileHost properties
3) Even reversing the direction and sending to the records center

Can anyone spot a likely problem? Is there some content organizer configuration I may have missed that is required? Any explanation for the result Not Found?

Was it helpful?

Solution

Well, of course I figured this out not long after posting the question. I saw something in the ULS logs about not finding or not Assessing the OfficialFile.asmx so I looked at permissions groups. I noticed a group named "Records Center Web Service Submitters" and I added my user to that group. Re-executed the code posted above and it returned success and completed the move. That's a couple days of my work life I can't get back!

Licensed under: CC-BY-SA with attribution
Not affiliated with sharepoint.stackexchange
scroll top