The WHERE clause affects the whole row - as you have noticed. If you want to fetch the data as zero when you have a out-of-range date, then you need to move the condition from the WHERE clause into each of your individual SUM expressions:
sum(case when c.amount is not null then c.amount else 0 end) as amount,
...
where (c.startdate is null OR (c.startdate >= '2011-3-15' and c.startdate <= '2012-12-30'))
and (c.partnerid is null or c.partnerid) and p.manager = 1
becomes:
sum(case when c.amount is not null and not (c.startdate is null OR (c.startdate >= '2011-3-15' and c.startdate <= '2012-12-30')) then c.amount else 0 end) as amount,
...
where (c.partnerid is null or c.partnerid) and p.manager = 1