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