6.6.0.1
TimSession.allInstances->first.checkFeature('fcResourcen')
TimSession.allInstances->first.checkFeature('fcPhasen')
Timsession.allinstances->first.licproduct=2
Auswahlproperty.allinstances->select(propertyName='ResourcePlanEbene')->first.propertyvalue=1
(Auswahlproperty.allinstances->select(propertyname='ResourcePlanningKind')->size = 0) or (Auswahlproperty.allinstances->select(propertyname='ResourcePlanningKind')->first.propertyvalue=0)
ClassSettingProjectPhaseSales
<Page Override="ProjectPhase">
<TextArea Override="Remarks" Visible="False"/>
<Group PlaceAfter="StartEndGroup">
<Group Name="ProbabilityGroup" Appearance="NoSpacing">
<TextBox Label="{Translate 'Probability'}" ValueExpression="wahrscheinlichkeit" ContentAlignment="Right" FlexWidth="4"/>
<TextBlock Text="%" ShowLabel="False" FlexWidth="3"/>
</Group>
</Group>
<ValueSetComboBox Override="Status" PlaceBefore="ProbabilityGroup"/>
<UserComboBox Override="Responsible" WidthFraction="0.5"/>
</Page>
<Page Override="ProjectPhaseFurtherInfo">
<TextArea Label="{Translate 'Remarks'}" ValueExpression="bemerkung" Lines="5" />
</Page>
ProjektPhase
ProjectphaseOfferSoldUtilizationDimension
Offer/Sold
true
235
ProjektPhase
Expression
if not owningprojekt.typ.produktiv then 'Internal'->translate else if status = 0 then 'Offered'->translate else if status = 3 then 'Refused'->translate else 'Sold'->translate endif endif endif
true
Nine
AuswahlProperty.allInstances->select(propertyname='ResourcePlanEbene')->first.propertyvalue = 1
ProjectphaseOfferSoldWeightedUtilizationDimension
Offer/Sold weighted
true
250
ProjektPhase
PythonClass
module_ressource_planning_sales.PhaseOfferSoldUtilizationProvider
true
Nine
AuswahlProperty.allInstances->select(propertyname='ResourcePlanEbene')->first.propertyvalue = 1
ProjectphasePhasesWeightedUtilizationDimension
Phases weighted
true
220
ProjektPhase
PythonClass
module_ressource_planning_sales.PhaseProbabilityUtilizationProvider
true
Nine
AuswahlProperty.allInstances->select(propertyname='ResourcePlanEbene')->first.propertyvalue = 1
ScriptModuleRessourcePlanningSales
module_ressource_planning_sales
false
# coding: windows-1252
#
#---Bezeichnung: module_ressource_planning_sales
# Klassen:
# CondExpression:
# ObjectScript: N
# ContainerScript: N
# EventType:
# EventClass:
# EventMembers:
# ExtendedRights: N
from vtcplanningcore import ResourcePlanningProvider
import vtcplanning
class PhaseUtilizationProvider:
def initialize(self, entries, startdate, enddate, subscriber):
# planning level is phases, so we have to collect the corresponding phases when entries are projects
if vtcplanning.is_project(entries):
source_entries = vtcplanning.get_phases_for_projects(entries, subscriber)
# when entries are not projects, they are phases or abstract workers
# in both cases we take the entry list as source entries
else:
source_entries = entries
self.provider = ResourcePlanningProvider(source_entries, startdate, enddate)
# to get the planned minutes, there are two cases: source_entries are phases or source_entries are abstractworkers
# if source_entries are abstractworkers, we get the phases via get_otherside_entries
self.provider_is_generated_for_phases = not (vtcplanning.is_abstractworker(source_entries))
if self.provider_is_generated_for_phases:
self.phases = source_entries
else:
self.phases = self.provider.get_otherside_entries(subscriber)
def get_planned_minutes(self, phase, startdate, subscriber):
# we have to distinguish two cases: source_entries of the provider are phases or source_entries are abstractworkers
# depending on that the first or second argument is set
# get_planned_minutes_aggregated(source_entry, otherside_entry, dateFrom, dateTo=None, subscriber=None)
if self.provider_is_generated_for_phases:
planned_minutes = self.provider.get_planned_minutes_aggregated(phase, None, startdate, None, subscriber)
else:
planned_minutes = self.provider.get_planned_minutes_aggregated(None, phase, startdate, None, subscriber)
return planned_minutes
class PhaseProbabilityUtilizationProvider(PhaseUtilizationProvider):
def generate(self, startdate, enddate, subscriber):
for phase in self.phases:
planned_minutes = self.get_planned_minutes(phase, startdate, subscriber)
if planned_minutes:
probability = self.evalocl("wahrscheinlichkeit", phase)
weighted_minutes = probability / 100.0 * planned_minutes
yield(phase.code, weighted_minutes)
class PhaseOfferSoldUtilizationProvider(PhaseUtilizationProvider):
def generate(self, startdate, enddate, subscriber):
for phase in self.phases:
planned_minutes = self.get_planned_minutes(phase, startdate, subscriber)
if planned_minutes:
probability = self.evalocl("wahrscheinlichkeit", phase)
weighted_minutes = probability / 100.0 * planned_minutes
internal = not phase.owningprojekt.typ.produktiv
if internal:
yield(vtcapp.translate("Internal"), weighted_minutes)
# if the project is not internal, then we distinguish between the different statuses of the phase
elif phase.status == 0:
yield(vtcapp.translate("Offered"), weighted_minutes)
elif phase.status == 3:
yield(vtcapp.translate("Refused"), weighted_minutes)
# yield sold in case of of status closed or accepted
else:
yield(vtcapp.translate("Sold"), weighted_minutes)
None
false
false
false
Python
Translation_Offered
Offeriert
Offer
Offre
Offerta
Angebot
Offered
Translation_OfferSold
Offeriert/Verkauft
Offer/Sold
Offre/Vendu
Offerta/Venduto
Angebot/Verkauft
Offer/Sold
Translation_OfferSoldWeighted
Offeriert/Verkauft gewichtet
Offer/Sold weighted
Offre/Vendu pondéré
Offerta/Venduto ponderato
Angebot/Verkauft gewichtet
Offer/Sold weighted
Translation_PhasesWeighted
Phasen gewichtet
Phases weighted
Phases pondérées
Fasi ponderate
Phasen gewichtet
Phases weighted
Translation_Probability
Wahrscheinlichkeit
Probability
Probabilité
Probabilità
Wahrscheinlichkeit
Probability
Translation_Sold
Verkauft
Sold
Vendu
Venduto
Verkauft
Sold
Angebot