Do More With SharePoint

Worry less about the problem. Bravo has the solution.

about bravo

Bravo Consulting Group, founded in 2007, specializes in customized Microsoft SharePoint solutions for the public sector. We help our clients strengthen business processes, productivity, communication, collaboration, and monitor and meet regulatory requirements. More importantly, we remove the barriers to critical and timely information and simplify the user’s everyday experience.

Vision

Year after year, Bravo and its people will be regarded as the best and most sought-after SharePoint experts in the federal government.

Mission

Bravo enables customers to achieve excellence in mission-critical initiatives by removing obstacles, reducing costs, and engineering roadmaps to success. As the employer of choice for SharePoint experts, Bravo provides trusted advisors and thought leaders to our customers.

Government Contracting

Bravo Consulting Group, LLC (Bravo) is a minority-owned 8(a) certified small business which specializes in providing SharePoint solutions specifically for Government clients. Bravo is a small business with a history of providing SharePoint solutions.

contract vehicles

8(a) sole source

  • 8(a) Sole Source — Small Business Administration (SBA) 8(a) Sole Source
  • Phone: 703.787.7905
  • Email: 8a@bravocg.com

GSA Schedule 70

  • GSA Schedule 70 — General Purpose Commercial Information Technology Services
  • Contract #: GS-35F-0590X
  • Phone: 703.787.7905
  • Email: GSA@bravocg.com

NAVY SeaPort-e

  • SeaPort-e — Engineering, Technical & Programmatic Support Services
  • Contract #: N00178-16-D-8614
  • Phone: 703.787.7905
  • Email: SeaPort-e@bravocg.com

North American Industry
Classification System (NAICS)

  • 541511 - Custom Computer Programming Services
  • 541611 - Consulting Services
  • 541690 - Tech Consulting Services
  • 541990 - Professional Services
  • 561499 - Business Support Services

Services

Bravo provides end to end SharePoint support services

Records Management

One-click Records Management
made possible by automating the information life-cycle

Bravo On Demand

Annual subscription with access to Bravo's premier support, Records Management, services catalog, and app catalog

Migration Services

Migrate your 2003-2013 SharePoint environments to the next version using Bravo's proven migration framework

Development

We work with you to design, develop, and deploy business driven solutions

Enterprise SharePoint Support

We have experience managing all aspects of customer's SharePoint environments with user bases of 150, 000+

SharePoint Maturity Model

A clear roadmap for organizations to achieve SharePoint Maturity at all support, infrastructure and development levels

Bravo On Demand

Organizations are facing increased pressure to maintain mission readiness with less resources and funding. Bravo On Demand was designed to specifically address that challenge by allowing organizations to benefit from IT investments made by other agencies and providing access to a proven team of subject matter experts.

Premier SupportApp CatalogRecords ManagementService CatalogOn Demand

Careers

Bravo Consulting Group is always looking for employees to join the Bravo team who are interested in SharePoint and ready to join a rapidly growing Washington, DC Metro area-based technology consulting company. Team members are able to collaborate with talented colleagues to design and implement cutting edge technological solutions using strong communication and problem-solving skills. They are also prepared to work closely with exciting clients engaged in critical business services.

If you're interested in joining the team, come explore the many career opportunities available at Bravo Consulting Group. Bravo offers technical training, coaching, and mentoring to ensure that our employees develop team and leadership skills, engage in proactive career development, and have fun in the process! Email us at jobs@bravocg.com

Contract Overview

SeaPort-e is the Navy's electronic platform for acquiring support services in 22 functional areas including Engineering, Financial Management, and Program Management. The Navy Systems Commands (NAVSEA, NAVAIR, SPAWAR, NAVFAC, and NAVSUP), the Office of Naval Research, Military Sealift Command, and the United States Marine Corps compete their service requirements amongst 2400+ SeaPort-e IDIQ multiple award contract holders.

For more information, email us at SeaPort-e@bravocg.com

Quality Assurance

For each task, Bravo implements Quality Assurance (QA) processes throughout every aspect of our work. QA is a continuous activity critical to assessing how Bravo's execution matches up against procedural expectations. Our QA plan details proactive methods for Bravo and the Government to avoid unacceptable or deficient performance and provides verifiable input for required performance evaluations. Bravo ensures high-quality work via the company's proven QA techniques, tailored to specific requirements. Bravo's approach to QA leverages industry standards, methodologies, and best practices established by the Project Management Body of Knowledge. Bravo further monitors performance metrics during quality control to ensure compliance with relevant quality standards, monitoring specific measurements based on the Quality Assurance Surveillance Plan's (QASP) Acceptable Quality Levels (AQL), identifying ways to eliminate causes of unsatisfactory performance. Bravo's QA plan establishes the specific QA activities performed throughout the life cycle of the program in order to accomplish these items in a transparent and systematic manner. The key components of our quality assurance processes are:

Bravo's Capabilities, Qualifications, and Experience

Bravo Consulting Group, LLC was founded in 2007 based on a concept of innovation and an outstanding customer service experience. Bravo brings a team of hand-selected, qualified professionals to provide agile, responsive, and proactive delivery of capabilities in the following functional areas:

Intro to SP Security

​Users often are not fully aware of how secure SharePoint is, and at what levels they can secure data. Bravo recently created a "Productivity Tip" video to better demonstrate the idea. Continue reading for more information on the who, what, where and why of SharePoint Security.

WHY: SharePoint should be properly secured to ensure data is accessible by those who should have access and at the level (read, contribute, etc.) they require, while restricting access to all other users.

WHERE: SharePoint security can be applied to your data at multiple levels within your control as well as at "farm" level containers. Locally, security can be applied at the item (word document), folder, list/library, sub-site and top-level site. In most scenarios, you will want to avoid item-level permissions.

WHO: Typically, security is restricted using the following: Active Directory (AD) users or security groups; SharePoint groups; or individual users. The best scenario is to use AD groups, as this keeps SharePoint sites and data security consistent with an organization's overall security. Use SharePoint Groups, if not AD groups, and make sure to begin first with the OOTB SharePoint groups for each site (Owners, Members, Visitors). In most scenarios, you will want to avoid using individual permissions; groups allow you to apply 'role-based' security instead.

WHAT: While there are many ways to configure permission levels in SharePoint to determine what users can do, in most scenarios you will find four levels are sufficient: no access; read; contribute; admin/design.

  • No Access – All users not added are assumed to have no need to access your data. This is not a permission, but you should think of these users as you plan.
  • Read – Users with this permission can view all data. This is known in SharePoint as a Visitor.
  • Contribute – Users with this permission can create, read, update, and delete data. This is known in SharePoint as a Member.
  • Administrator / Designer - Users with this permission can do all activities like a member can, as well as, pretty much all else including edit the look and feel, manage permissions, etc. This is known in SharePoint as an Owner.

Bulk Publish Content Types with PowerShell By: Neil McDonnell

​Use the following script to bulk publish content types that are added to the CTHub or to republish. This came in handy when deploying hundreds of content types and we wanted them pushed out to the subscribing site collections for their consumption.

Open up PowerShell ISE and insert the following and then hit play:

if ( (Get-PSSnapin -Name Microsoft.SharePoint.PowerShell -ErrorAction SilentlyContinue) -eq $null ) 
 {
     Add-PSSnapin Microsoft.SharePoint.Powershell
}
  
                                    function Publish-ContentTypeHub {
    param
    (
        [parameter(mandatory=$true)][string]$CTHUrl,
        [parameter(mandatory=$true)][string]$Group
    )

    $site = Get-SPSite $CTHUrl
    if(!($site -eq $null))
    {
        $contentTypePublisher = New-Object Microsoft.SharePoint.Taxonomy.ContentTypeSync.ContentTypePublisher ($site)
        $site.RootWeb.ContentTypes | ? {$_.Group -match $Group} | % {
            $contentTypePublisher.Publish($_)
            write-host "Content type" $_.Name "has been republished" -foregroundcolor Green
        }
    }
}

To run the script type "Publish-ContentTypeHub "[URL to CTH]" "[Group Name Containing Content Types]"

Dynamically filtering an array of objects in JavaScript By: Hasan Shingieti

I recently needed a way to filter an array of objects based on user input. The end-user experience would be similar to how filtering works in Excel (a column drop down filter where the user can select multiple values across multiple columns).

At first, it made sense to use Array.prototype.filter() to accomplish this, however that would require me to know the properties to filter by and the values to filter for. This wouldn't work since the properties (the field columns) and filter values would be controlled by the end-user.

To address this challenge, I wrote a helper function that filters an array of objects based on filter criteria. This allows for dynamic filtering with n filter criteria. This function, at the moment, checks for exact matches. So "green" wouldn't match "Green" and "4" wouldn't match 4. Future enhancements would be to include other operators and case-insensitive matching.

Array.prototype.flexFilter = function(info) {
  
  // Set our variables
  var matchesFilter, matches = [], count = 0;
  
  /***********
   Helper function to loop through the filter criteria to find 
   matching values.
   Each filter criteria is treated as "AND". So each item must 
   match all the filter criteria to be considered a match.
   Multiple filter values in a filter field are treated as "OR"
   i.e. ["Blue", "Green"] will yield items matching a value 
   of Blue OR Green.
  ************/
  matchesFilter = function(item) {
    for (var n = 0; n < info.length; n++) {
      if (info[n]['Values'].indexOf(item[info[n]['Field']]) > -1) {
        count++;
      }
    }
    // If TRUE, then the current item in the array meets 
    // all the filter criteria
    return count == info.length;
  }

  // Loop through each item in the array
  for (var i = 0; i < this.length; i++) {

    // Determine if the current item matches the filter criteria
    if (matchesFilter(this[i])) {
      matches.push(this[i]);
    }

  }

  // Give us a new array containing the objects matching the filter criteria
  return matches;
}


Usage
var data = [
  { ID: 1, Name: "John", Color: "Blue", Location: "Up" },
  { ID: 2, Name: "Pauline", Color: "Green", Location: "Up" },
  { ID: 3, Name: "Ahmed", Color: "Orange", Location: "Left" },
  { ID: 4, Name: "Diego", Color: "Pink", Location: "Up" },
  { ID: 5, Name: "Maria", Color: "Black", Location: "Down" },
  { ID: 6, Name: "Gus", Color: "Green", Location: "Up" },
  { ID: 7, Name: "Brian", Color: "Pink", Location: "Left" },
  { ID: 8, Name: "Shelley", Color: "Green", Location: "Right" },
  { ID: 9, Name: "Leonardo", Color: "Blue", Location: "Right" },
  { ID: 10, Name: "Big Daddy", Color: "Green", Location: "Down" }
];

var criteria = [
  { Field: 'Color', Values: ['Green'] },
  { Field: 'Location', Values: ['Up', 'Down'] }
];
var filtered = data.flexFilter(criteria);
console.log(filtered);

SharePoint Workflow Happy Path By: Neil McDonnell

Often when thinking about improving our business processes or creating an automated approach to business process, we tend to think of the whole picture. When thinking about a workflow, dataflow, etc., we tend to try and think of every scenario; every twist and turn of a flow diagram. This blog will talk about an approach to workflow design, and separately development, that focuses on the least information needed to complete a working, testable path – what some of us call the “Happy Path” but also might be considered the minimal viable (or valuable) product (MVP). The following bullets are designed to walk you through the process of developing the Happy Path; this is not a training blog, etc. but rather an introduction that might spur you to learn more from other sources.

  1. When creating your flow diagram, you will obviously begin with the trigger of the process. In an example of a Time Off Request process, the submittal of the request form will trigger the approval process. At this point, only write out the steps of the process from Start that are “yes” based. For example:
    1. Do I have time off available (can be yes or no but only focus on Yes)
    2. Is my workload covered (again only focus on Yes)
    3. Does my boss approve (yes)
    4. Register PTO in time keeping system
    5. End process
  2. Bullet one above represents the entire Happy Path for a time off request. Now, build it. In SharePoint for example, create the workflow OOTB, with SPD, Nintex, custom code, etc. But only create the Happy Path. Then fully test it. Deploy it to customer production and gain UAT approval. Then end the effort. This is the end of the Happy Path.
  3. Now we have a fully functioning workflow in production (whether released to full user base is another blog). The next step is to build the next MVP or Happy Path; these are always the next smallest effort we can complete in design, development and deployment. Using our time request example, the following steps will be designed next:
    1. Do I have time off (now focus on the No response)
    2. Will HR allow me to go in PTO debt (can be yes or no but only focus on Yes)
    3. Arrow goes back up to the Do I have Time Off Available
    4. Arrow for No goes all the way to the End since HR effectively disapproved the request. (we generally don’t focus on anything but the Happy Path, but in this situation, we’re doing nothing new, just ending the process.
    5. Flow continues as with first effort we’ve already deployed
    4. Bullet three above represents the next Happy Path or MVP for a time off request. I know it is small, but this allows us maximum control over risk of things not working. Now, build this new functionality that was designed in bullet three. Then fully test this new functionality as well as do full regression testing to make sure we didn’t break the original workflow. Deploy to production, gain UAT approval, and you’re done with this effort. 5. Move through each exception / option in your workflow process separately. You may think this is time consuming or tedious, but I guarantee you the overall time spent will be far less since you won’t have to troubleshoot an entire workflow. Watch our quick Productivity Tip 0003 for a different way of thinking about this.