I am developing a "Vendor Invoice Approval" application in SharePoint 2013. My development platform is "Visual Studio 2013". This will be an "Intranet only" application running only on our internal SharePoint 2013 Farm.
I am planning on using a "Document Library" to store all of the Invoices. I believe the "correct" approach (or one of many, probably, lol) would be to create a "Content Type" called "Vendor Invoice". The "content type" would then need to have the following functionality:
Custom Columns. Some columns would be "required", some would be "optional".
- Vendor Name - Chosen from a “Vendors” list (a SharePoint "custom" list that contains "Vendor Name" and "People Responsible" (which will be a "People" type column and allow multiple choices/people from a SharePoint Group called "Vendor Invoice Person Responsible"). The user may also enter a new Vendor Name.
- Person Responsible - Limited to the users in the “Vendor Invoice Person Responsible” SharePoint Group. Will allow the selection of 1 or more "people" from that Group. (When a Vendor Name is "chosen" (above), this field should be populated with the values from the "People Responsible" record for that Vendor. The user can then ONLY choose between those users or choose them all. Optionally, I may just store a single Person in the "Vendors" list and use that to populate this field with a "default" value, but then allow the user to pick ANY user from the "Vendor Invoice Person Responsible" SharePoint Group).
- Invoice Number (Will probably renamed the “Title” column.)
- Invoice Date
- Invoice Amount
- PO Number (When entered, look it up in our ERP system and populate as many fields as possible, such as the Vendor Name, Account Number and Plant.)
- Status - Most likely this field will only be adjusted via "workflows". Choices are:
- “Created” – The initial Status when an Invoice is created (BEFORE any “Issue” or “Approved”).
- "Pending Issue" - An "Issue" needs to be resolved. (See "Issue" below.)
- "Issue Resolved” – The current “Issue” has been resolved. The next status could be “Pending Issue” (if there is another Issue to resolve) or “Approved”.
- "Approved” – All Issues have been resolved.
- “Issue Check” – The Invoice was “Approved” and a check may now be issued to the Vendor.
- "Completed” – The Invoice has been “Approved” and the vendor has been issued a check.
- Issue - Chosen from an “Invoice Issues” list (a SharePoint "custom" list that contains "Issue" and the name of a "WorkFlow" to execute on the "Invoice" in order to resolve that particular "Issue"). When an Issue is chosen, this will trigger a "Workflow" (or more than one?? probably only one...) to start.
- Account Number
- Plant (Choices: 1-New York, 2-Los Angeles,99-Headquarters)
- Invoice Notes
Template/Forms (Insert/Update)/Development/Event Receivers/Display Template/"UI". This is the part that I am unsure of and where "Visual Studio" will be used. (I have quite a bit of experience developing "SharePoint Solutions". I am not interested in using the new "App Model". I have read about it, studied it, setup a local "App Store", etc, but for this particular application, I am going to stick with the "old" Solution based model. I am more familiar with it and "believe" it will give me the most "power" and "flexibility". As I said.... I am unsure how to "categorize" the following "needs", so I am just going to lump the rest of the "features" I need into the list below and ask for any feedback and/or help. :)
Adding Invoices - Ideally, the "drag and drop" feature will (can) be utilized by the user to add the new Invoices (I can force them to only add one Invoice at a time). If this is just "too much trouble", I could require the user to only add them using the "Upload Document" control. Or, I could develop the UI (or just the Insert/Update UI) using traditional "ASP .Net" controls and insert/update the data using the Server Object Model or the Client Object Model (CSOM).
Preview Invoices - There are several times I would like to show the Invoice (pdf) as a "preview" (when the Invoice is being Added or Edited, when the user is "Approving" or "Denying" on Invoice via a "WorkFlow", or when an Invoice is "hovered" over in a Document Library View). Basically, anytime the Invoice needs to be acted on by a user, I would like to show the PDF in a "preview" window and I don't mean just open it in a separate Tab or Window. I mean use something like an "IFrame" in a certain area of the page (depending on what the page is doing: Inserting/Editing/Viewing/etc) to show that preview. (For the "hover preview", I believe I can use the same skills I learned when modifying how the "Enterprise Search Center" works with PDFs. Basically, it involved adding a new Display Template for the Search Item and referencing that template in a new "Search Result Type". The new Display Template created an "IFrame" and populated it using our Office Web App Server via "WOPI". Anyway, I believe I can simply do the same thing in a Document Library View and most likely in whatever "form" or "page" is responsible for the Insert/Edit. I suppose I am just looking for someone to tell me if this is "doable" (and as "easy" as I think it might be), what the "best" way to accomplish it would be, or if it is a bad idea, etc. etc.)
"Auto Populate" the columns. When a new Invoice is added, I would like to use the (Enterprise) Search functionality (OCR and "graphic matching") to somehow populate as many of the columns (metadata) as possible. This might involve looking for some particular "text" or graphic(s) (like a company logo?) to determine the Vendor. Then, once the Vendor is determined, I might be able to figure out other items, such as the "Invoice Number" and "PO". Usually our Vendor Invoices don't change very often. This would only serve as "default" values, so it wouldn't have to be 100% correct. Anything I can do to save the user time or make it easier to enter new Invoices will go along way towards acceptance of this application. (Currently, they use an Excel Spreadsheet, along with email. So, from their point of view, the existing "system", "works" and is very "easy" to use, etc....)
More uses for the "Search Index Results". It would also be "nice" if we could setup some "weighted rules" on a "per Vendor" basis to help determine who the "responsible user" is. (For instance, we may get Invoices from a single Vendor that could possibly go to 1 of several "responsible users". In order to determine the correct user, I would like to setup some "rules" for each vendor to give "weighted" values to certain "keywords". For instance, if the word "Computer" appears on the invoice, that might be worth "100 points" towards the "IT Manager". So, when the user is selecting the person responsible for this particular invoice, I could order the list they are choosing from by the "total points" (as calculated from the "weighted rules") which would put the "Person" who is most "likely" the "Person Responsible" at the top of the list, followed by the second most likely, and so on. I don't think this be that "hard" to do. I would simply need to store "keywords" and "values" and have access to the "Search Index Results" for the document (Invoice) the user is currently adding.
++Another "option" I have for developing this application is to basically develop it using a traditional "ASP .Net" framework and controls (which I definitely have more experience with, but as I mentioned, I also have quite a bit (4-5 years) of SharePoint development experience) and just using the "out of the box" features of SharePoint (and Custom Lists, Document Libraries, SharePoint Security Groups, WorkFlows), etc. What I am trying to describe is that I would develop the "UI" (add/change/delete) using traditional "ASP .Net" controls and just use SharePoint for my "Data Source". (I DO need to AT LEAST use SharePoint as the "Data Source". This is for reasons that I don't want to get into here and just bog down the discussion. I certainly realize this application could easily be a "traditional" "ASP .Net" application using "SQL" for the Data Source. So that part really isn't what I am looking for "advise" on.) Any help/advice/samples would be very MUCH appreciated! Shayne