Consolidated Statements of Income - USD ($) shares in Thousands, $ in Thousands |
12 Months Ended | ||
|---|---|---|---|
Dec. 31, 2019 |
Dec. 31, 2018 |
Dec. 31, 2017 |
|
| Income Statement [Abstract] | |||
| Revenue | $ 1,382,642 | $ 1,279,304 | $ 1,114,788 |
| Cost of revenue | 1,252,711 | 1,164,609 | 1,012,840 |
| Selling, general and administrative expenses | 78,316 | 66,372 | 60,728 |
| Operating income | 51,615 | 48,323 | 41,220 |
| Interest expense, net | (6,470) | (5,071) | (4,640) |
| Income from operations before income taxes | 45,145 | 43,252 | 36,580 |
| Income tax expense (benefit) | 10,429 | 7,956 | (22,917) |
| Net income | $ 34,716 | $ 35,296 | $ 59,497 |
| Earnings Per Share | |||
| Basic (in dollars per share) | $ 3.03 | $ 3.14 | $ 5.40 |
| Diluted (in dollars per share) | $ 2.99 | $ 3.10 | $ 5.31 |
| Weighted average common shares outstanding - basic (in shares) | 11,444 | 11,224 | 11,021 |
| Weighted average common shares outstanding - diluted (in shares) | 11,612 | 11,378 | 11,209 |