def test_turnover(self): current_month = date.today().replace(day=1) next_month = nextMonth(current_month) previous_month = previousMonth(current_month) lead = Lead.objects.get(id=1) c1 = Consultant.objects.get(id=1) c2 = Consultant.objects.get(id=2) mission = Mission(lead=lead, subsidiary_id=1, billing_mode="TIME_SPENT", nature="PROD", probability=100) mission.save() cache.clear() # avoid bad computation due to rates cache with previous values # Add some timesheet - we fake with all charge on the first day Timesheet(mission=mission, working_date=previous_month, consultant=c1, charge=10).save() Timesheet(mission=mission, working_date=previous_month, consultant=c2, charge=5).save() Timesheet(mission=mission, working_date=current_month, consultant=c1, charge=10).save() Timesheet(mission=mission, working_date=current_month, consultant=c2, charge=5).save() # Add financial conditions for this mission FinancialCondition(consultant=c1, mission=mission, daily_rate=2000).save() FinancialCondition(consultant=c2, mission=mission, daily_rate=1000).save() done_work = (10 + 10) * 2000 + (5 + 5) * 1000 # Define mission price mission.price = 40 mission.billing_mode = "TIME_SPENT" mission.save() # In time spent, turnover is what we did self.assertEqual(c1.get_turnover(end_date=next_month), 20 * 2000) mission.billing_mode = "FIXED_PRICE" mission.save() # In fixed price, turnover is limited by price in proportion of all work self.assertEqual(c1.get_turnover(end_date=next_month), 20 * 2000 * mission.price * 1000 / done_work) self.assertEqual(c1.get_turnover(end_date=next_month) + c2.get_turnover(end_date=next_month), mission.price * 1000) # Let add some margin by changing mission price. mission.price = 60 mission.save() self.assertEqual(c1.get_turnover(end_date=next_month), 20 * 2000) # like in time spent self.assertEqual(c1.get_turnover(end_date=next_month) + c2.get_turnover(end_date=next_month), done_work) # Let archive mission to validate margin mission.active = False mission.save() self.assertEqual(c1.get_turnover(end_date=next_month), 20 * 2000 * mission.price * 1000 / done_work) # like in time spent self.assertEqual(c1.get_turnover(end_date=next_month) + c2.get_turnover(end_date=next_month), mission.price * 1000)
if lead.state in ("OFFER_SENT", "NEGOTIATION", "WON"): mission = Mission(lead=lead) mission.price = lead.sales # Initialise with lead price mission.subsidiary = lead.subsidiary mission.responsible = lead.responsible mission.save() # Create default staffing mission.create_default_staffing() messages.add_message( request, messages.INFO, ugettext("A mission has been initialized for this lead.")) for mission in lead.mission_set.all(): if mission.subsidiary != lead.subsidiary: mission.subsidiary = lead.subsidiary mission.save() if lead.state == "WON": mission.probability = 100 mission.active = True mission.save() messages.add_message( request, messages.INFO, ugettext("Mission's probability has been set to 100%")) elif lead.state in ("LOST", "FORGIVEN", "SLEEPING"): mission.probability = 0 mission.active = False mission.save() messages.add_message( request, messages.INFO, ugettext("According mission has been archived"))
messages.add_message(request, messages.INFO, ugettext("Lead sent to business mailing list")) except Exception, e: messages.add_message(request, messages.ERROR, ugettext("Failed to send mail: %s") % e) # Create or update mission if needed if lead.mission_set.count() == 0: if lead.state in ("OFFER_SENT", "NEGOTIATION", "WON"): mission = Mission(lead=lead) mission.price = lead.sales # Initialise with lead price mission.subsidiary = lead.subsidiary mission.responsible = lead.responsible mission.save() # Create default staffing mission.create_default_staffing() messages.add_message(request, messages.INFO, ugettext("A mission has been initialized for this lead.")) for mission in lead.mission_set.all(): if mission.subsidiary != lead.subsidiary: mission.subsidiary = lead.subsidiary mission.save() if lead.state == "WON": mission.probability = 100 mission.active = True mission.save() messages.add_message(request, messages.INFO, ugettext("Mission's probability has been set to 100%")) elif lead.state in ("LOST", "FORGIVEN", "SLEEPING"): mission.probability = 0 mission.active = False mission.save() messages.add_message(request, messages.INFO, ugettext("According mission has been archived"))