The only strange join will be for the billing period. It will depend on when you bill. If it is the period completed, it would look something like this:
select i.*, (select description from BillingPeriod where i.CompletedOn between StartsOn and EndsOn) as BillingPeriodDescription from invoice i