6.6.0.1
Timsession.allinstances->first.licproduct=2
TimSession.allInstances->first.checkFeature('fcPhasen')
ProjectTemplateExample
0.0000
None
0.0000
false
Administrator, 19.01.2017 08:19:32
TEMPLATE 1
DE
0.0000
false
true
false
0.0000
false
0.0000
false
false
Accepted
00 AKQ
2016-01-04T00:00:00
Akquise
false
false
false
0
false
false
true
2
false
false
false
false
Offer
01 ANA
2017-02-13T00:00:00
2022-01-20T00:00:00
Analyse
false
false
false
0
false
false
true
4
false
false
true
false
Offer
02 KONZ
2017-02-13T00:00:00
2022-01-20T00:00:00
Konzeption
false
false
false
0
false
false
true
6
false
false
true
false
Offer
03 UMS
2017-02-13T00:00:00
2022-01-20T00:00:00
Umsetzung
false
false
false
0
false
false
true
8
false
false
true
false
Offer
04 NACH
2017-02-13T00:00:00
2022-01-20T00:00:00
Nachbearbeitung
false
false
false
0
false
false
true
10
false
false
true
ProjectTypeTemplate
The project type is used to create project templates. To create a new project template, create a new project and choose the project type TEMPLATE. To prevent the project template from appearing in the service entry transaction, you should set it to inactive.
To apply the project template after creating a new project, choose "Select project template" from the pull-down menu.
true
Template
true
5
false
ScriptSelectProjectTemplate
This script copies project information and phases from a project template. To create a new project template, create a new project and select the project type TEMPLATE. To prevent the project template from appearing in the service entry transaction, you should set it to inactive.
To apply the project template after creating a new project, choose "Select project template" from the pull-down menu.
Select project template
Projekt
false
(not hastag('projectTemplateApplied')) and Timsession.allInstances->first.login.oclastype(Projektbearbeiter)->collect(u|(u->hasRight('manager') and (self.projektleiter=u)) or u->hasRight('supervisor'))->first
# coding: windows-1252
#
#---Bezeichnung: Select project template
# Klassen: Projekt
# CondExpression: (not hastag('projectTemplateApplied')) and Timsession.allInstances->first.login.oclastype(Projektbearbeiter)->collect(u|(u->hasRight('manager') and (self.projektleiter=u)) or u->hasRight('supervisor'))->first
# ObjectScript: Y
# ContainerScript: N
# EventType: None
# EventClass:
# EventMembers:
# ExtendedRights: N
#
#---Kopiert Projektinformationen (Phasen, etc.) aus einem Vorlageprojekt
#---Basiert auf https://www.vertec.com/de/kb/projektkopieren
#
#---2019-04-30, OGO: Erstellt.
#---2020-02-01, UHE: Aufbereitet für Config Set Projektvorlagen
def copySubPhasen(phase, parentPhase, project):
subPhasen = phase.subphasen
if len(subPhasen) > 0:
for subPhase in subPhasen:
newPhase = copyPhase(subPhase, parentPhase, project)
copySubPhasen(subPhase, newPhase, project)
def copyPhase(sourcePhase, parentPhase, project):
# if there exists already an active phase with same code, do not copy, but return existing phase to copy subphases
existingPhase = None
if parentPhase:
existingPhase = parentPhase.eval("subphasen->select(aktiv)->select(code='{}')->first".format(sourcePhase.code))
elif project:
existingPhase = project.eval("phasen->select(aktiv)->select(code='{}')->first".format(sourcePhase.code))
if existingPhase:
return existingPhase
else:
newPhase = vtcapp.createobject("Projektphase")
# set parentphase or project
if parentPhase:
newPhase.parentphase = parentPhase
else:
newPhase.projekt = project
# set attributes
newPhase.code = sourcePhase.code
newPhase.xAktiv = sourcePhase.Aktiv
newPhase.verantwortlicher = sourcePhase.verantwortlicher
newPhase.verrechenbar = sourcePhase.verrechenbar
newPhase.status = sourcePhase.status
newPhase.Beschreibung = sourcePhase.Beschreibung
newPhase.bemerkung = sourcePhase.bemerkung
newPhase.pauschal = sourcePhase.pauschal
newPhase.pauschalspesen = sourcePhase.pauschalspesen
newPhase.pauschalauslagen = sourcePhase.pauschalauslagen
newPhase.orderidx = sourcePhase.orderidx
# budget
newPhase.xplanMinutenInt = sourcePhase.xplanMinutenInt
newPhase.xplanWertExt = sourcePhase.xplanWertExt
newPhase.xplanWertInt = sourcePhase.xplanWertInt
newPhase.xplanKostenLeistung = sourcePhase.xplanKostenLeistung
newPhase.xplanSpesenWert = sourcePhase.xplanSpesenWert
newPhase.xplanKostenSpesen = sourcePhase.xplanKostenSpesen
newPhase.xplanAuslagenWert = sourcePhase.xplanAuslagenWert
newPhase.xplanKostenAuslagen = sourcePhase.xplanKostenAuslagen
# set prerequisites
newPhase.ansatzext = sourcePhase.ansatzext
newPhase.ansatzkosten = sourcePhase.ansatzkosten
newPhase.ansatzbearbeiter = sourcePhase.ansatzbearbeiter
newPhase.tagespauschaleext = sourcePhase.tagespauschaleext
newPhase.bearbeiterzuordnung = sourcePhase.bearbeiterzuordnung
newPhase.taetigkeitenzuordnung = sourcePhase.taetigkeitenzuordnung
newPhase.spesentypenzuordnung = sourcePhase.spesentypenzuordnung
newPhase.auslagetypenzuordnung = sourcePhase.auslagetypenzuordnung
# accounting
newPhase.ertragskontoleistungen = sourcePhase.ertragskontoleistungen
newPhase.ertragskontospesen = sourcePhase.ertragskontospesen
newPhase.ertragskontoauslagen = sourcePhase.ertragskontoauslagen
newPhase.kostenstelleleistungen = sourcePhase.kostenstelleleistungen
newPhase.kostenstellespesen = sourcePhase.kostenstellespesen
newPhase.kostenstelleauslagen = sourcePhase.kostenstelleauslagen
# links
copyPhaseUserLink(sourcePhase, newPhase)
copyPhaseServiceTypes(sourcePhase, newPhase)
copyPhaseExpenseTypes(sourcePhase, newPhase)
copyPhasePurchaseTypes(sourcePhase, newPhase)
# additional fields
copyAdditionalFields(sourcePhase, newPhase)
return newPhase
def copyPhaseExpenseTypes(sourcePhase, newPhase):
phaseExpenseTypeList = sourcePhase.eval("self.spesentypphaselink")
for sourcePhaseExpenseType in phaseExpenseTypeList:
newPhaseExpenseType = vtcapp.createobject("SpesenTypPhaseLink")
newPhaseExpenseType.minPlanWertSpesen = sourcePhaseExpenseType.minPlanWertSpesen
newPhaseExpenseType.maxPlanWertSpesen = sourcePhaseExpenseType.maxPlanWertSpesen
newPhaseExpenseType.planKostenSpesen = sourcePhaseExpenseType.planKostenSpesen
newPhaseExpenseType.planWertSpesen = sourcePhaseExpenseType.planWertSpesen
newPhaseExpenseType.wertproeinheitext = sourcePhaseExpenseType.wertproeinheitext
newPhaseExpenseType.wertproeinheitint = sourcePhaseExpenseType.wertproeinheitint
newPhaseExpenseType.wertproeinheitkosten = sourcePhaseExpenseType.wertproeinheitkosten
newPhaseExpenseType.bezeichnung = sourcePhaseExpenseType.bezeichnung
newPhaseExpenseType.offertText = sourcePhaseExpenseType.offertText
newPhaseExpenseType.phasen = newPhase
newPhaseExpenseType.spesentypen = sourcePhaseExpenseType.spesentypen
newPhaseExpenseType.bearbeiter = sourcePhaseExpenseType.bearbeiter
# additional fields
copyAdditionalFields(sourcePhaseExpenseType, newPhaseExpenseType)
def copyPhasePurchaseTypes(sourcePhase, newPhase):
PhasePurchaseTypeList = sourcePhase.eval("self.auslagetypphaselink")
for sourcePhasePurchaseType in PhasePurchaseTypeList:
newPhasePurchaseType = vtcapp.createobject("AuslageTypPhaseLink")
newPhasePurchaseType.minPlanWertAuslagen = sourcePhasePurchaseType.minPlanWertAuslagen
newPhasePurchaseType.PlanWertAuslagen = sourcePhasePurchaseType.PlanWertAuslagen
newPhasePurchaseType.maxPlanWertAuslagen = sourcePhasePurchaseType.maxPlanWertAuslagen
newPhasePurchaseType.PlanKostenAuslagen = sourcePhasePurchaseType.PlanKostenAuslagen
newPhasePurchaseType.maxPlanKostenAuslagen = sourcePhasePurchaseType.maxPlanKostenAuslagen
newPhasePurchaseType.minPlanKostenAuslagen = sourcePhasePurchaseType.minPlanKostenAuslagen
newPhasePurchaseType.wertproeinheitext = sourcePhasePurchaseType.wertproeinheitext
newPhasePurchaseType.wertproeinheitint = sourcePhasePurchaseType.wertproeinheitint
newPhasePurchaseType.wertproeinheitkosten = sourcePhasePurchaseType.wertproeinheitkosten
newPhasePurchaseType.bezeichnung = sourcePhasePurchaseType.bezeichnung
newPhasePurchaseType.offertText = sourcePhasePurchaseType.offertText
newPhasePurchaseType.phasen = newPhase
newPhasePurchaseType.auslagetypen = sourcePhasePurchaseType.auslagetypen
newPhasePurchaseType.bearbeiter = sourcePhasePurchaseType.bearbeiter
# additional fields
copyAdditionalFields(sourcePhasePurchaseType, newPhasePurchaseType)
def copyPhaseUserLink(sourcePhase, newPhase):
PhaseUserList = sourcePhase.eval("bearbeiterphasen")
for sourcePhaseUser in PhaseUserList:
newPhaseUser = vtcapp.createobject("BearbeiterPhaseLink")
newPhaseUser.Ansatzkosten = sourcePhaseUser.Ansatzkosten
newPhaseUser.AnsatzBearbeiter = sourcePhaseUser.AnsatzBearbeiter
newPhaseUser.TagesPauschaleExt = sourcePhaseUser.TagesPauschaleExt
newPhaseUser.AnsatzExt = sourcePhaseUser.AnsatzExt
newPhaseUser.Bearbeiter = sourcePhaseUser.Bearbeiter
newPhaseUser.xplanWertExt = sourcePhaseUser.xplanWertExt
newPhaseUser.xplanwertint = sourcePhaseUser.xplanwertint
newPhaseUser.xplanminutenint = sourcePhaseUser.xplanminutenint
newPhaseUser.xplanauslagenwert = sourcePhaseUser.xplanauslagenwert
newPhaseUser.xplankostenauslagen = sourcePhaseUser.xplankostenauslagen
newPhaseUser.xplankostenleistung = sourcePhaseUser.xplankostenleistung
newPhaseUser.xplankostenspesen = sourcePhaseUser.xplankostenspesen
newPhaseUser.xplanspesenwert = sourcePhaseUser.xplanspesenwert
newPhaseUser.bearbeiterstufe = sourcePhaseUser.bearbeiterstufe
newPhaseUser.Phase = newPhase
# additional fields
copyAdditionalFields(sourcePhaseUser, newPhaseUser)
def copyPhaseServiceTypes(sourcePhase, newPhase):
PhaseServiceTypeList = sourcePhase.eval("taetigkeitphaselink")
for sourcePhaseServiceType in PhaseServiceTypeList:
newPhaseServiceType = vtcapp.createobject("TaetigkeitPhaseLink")
newPhaseServiceType.planWertLeist = sourcePhaseServiceType.planWertLeist
newPhaseServiceType.minPlanWertLeist = sourcePhaseServiceType.minPlanWertLeist
newPhaseServiceType.stueckwert = sourcePhaseServiceType.stueckwert
newPhaseServiceType.tagesPauschaleExt = sourcePhaseServiceType.tagesPauschaleExt
newPhaseServiceType.bezeichnung = sourcePhaseServiceType.bezeichnung
newPhaseServiceType.ansatzExt = sourcePhaseServiceType.ansatzExt
newPhaseServiceType.planMinutenInt = sourcePhaseServiceType.planMinutenInt
newPhaseServiceType.maxPlanWertLeist = sourcePhaseServiceType.maxPlanWertLeist
newPhaseServiceType.ansatzKosten = sourcePhaseServiceType.ansatzKosten
newPhaseServiceType.ansatzBearbeiter = sourcePhaseServiceType.ansatzBearbeiter
newPhaseServiceType.offertText = sourcePhaseServiceType.offertText
newPhaseServiceType.phasen = newPhase
newPhaseServiceType.taetigkeiten = sourcePhaseServiceType.taetigkeiten
newPhaseServiceType.bearbeiter = sourcePhaseServiceType.bearbeiter
# additional fields
copyAdditionalFields(sourcePhaseServiceType, newPhaseServiceType)
def copyAdditionalFields (source, target):
additionalFieldList = source.eval("zusatzfelder.metaZusatzfeld")
for additionalField in additionalFieldList:
additionalFieldname = additionalField.eval("fieldname")
sourceValue = getattr(source, additionalFieldname)
setattr(target, additionalFieldname, sourceValue)
def copyUserLink(source, target):
# when a project is created, the current user is automatically assigned and has to be deleted manually
for user in list(target.evalocl("bearbeiterlink")):
user.delete()
userList = source.evalocl("bearbeiterlink")
for sourceUser in userList:
newUser = vtcapp.createobject("BearbeiterLink")
newUser.Ansatzkosten = sourceUser.Ansatzkosten
newUser.AnsatzBearbeiter = sourceUser.AnsatzBearbeiter
newUser.TagesPauschaleExt = sourceUser.TagesPauschaleExt
newUser.AnsatzExt = sourceUser.AnsatzExt
newUser.Bearbeiter = sourceUser.Bearbeiter
newUser.Bearbeiterstufe = sourceUser.Bearbeiterstufe
target.bearbeiterlinks.append(newUser)
def copyCustomLinks(source, target):
# customlink
oldLinks = vtcapp.getwithsql("Customlink", "customlinks={}".format(source.objid), "")
for oldLink in oldLinks:
newLink = vtcapp.createobject("Customlink")
newLink.linktyp = oldLink.linktyp
newLink.customlinks = target
newLink.fromcustomlinks = oldLink.fromcustomlinks
# fromcustomlink
oldLinks = vtcapp.getwithsql("Customlink", "fromcustomlinks={}".format(source.objid), "")
for oldLink in oldLinks:
newLink = vtcapp.createobject("Customlink")
newLink.linktyp = oldLink.linktyp
newLink.customlinks = oldLink.customlinks
newLink.fromcustomlinks = target
def copyProjectSettings(source, target):
# set attributes
target.kunde = source.kunde
target.bemerkung = source.bemerkung
target.betreffend = source.betreffend
target.beschrieb = source.beschrieb
target.tarifstufe = source.tarifstufe
target.waehrung = source.waehrung
target.rechnungsIntervall = source.rechnungsIntervall
target.xrechnungsadresse = source.xrechnungsadresse
target.sprache = source.sprache
target.kontaktPerson = source.kontaktPerson
target.xmwsttyp = source.xmwsttyp
target.hb = source.hb
target.hbstv = source.hbstv
target.sekr = source.sekr
target.keys = source.keys
target.tags = source.tags
target.verflechtungen = source.verflechtungen
target.gegenverflechtungen = source.gegenverflechtungen
# add counterparties
adrlist = target.gegenparteien
adrlist += source.gegenparteien
# budget
target.xplanMinutenInt = source.xplanMinutenInt
target.xplanWertExt = source.xplanWertExt
target.xplanWertInt = source.xplanWertInt
target.xplanKostenLeistung = source.xplanKostenLeistung
target.xplanSpesenWert = source.xplanSpesenWert
target.xplanKostenSpesen = source.xplanKostenSpesen
target.xplanAuslagenWert = source.xplanAuslagenWert
target.xplanKostenAuslagen = source.xplanKostenAuslagen
# invoice settings
target.rechRabatt = source.rechRabatt
target.rechPauschal = source.rechPauschal
target.rechRabattProzent = source.rechRabattProzent
target.rechPauschalSpesenProzent = source.rechPauschalSpesenProzent
target.rechPauschalBetrag = source.rechPauschalBetrag
target.rechPauschalSpesen = source.rechPauschalSpesen
target.rechPauschalSpesenBetrag = source.rechPauschalSpesenBetrag
target.rechProforma = source.rechProforma
target.rechUseSpesen = source.rechUseSpesen
target.rechRabattBetrag = source.rechRabattBetrag
# prerequisites
target.xansatzext = source.xansatzext
target.xansatzkosten = source.xansatzkosten
target.xansatzbearbeiter = source.xansatzbearbeiter
target.xtagesPauschaleExt = source.xtagesPauschaleExt
target.xauslagenWeiterleiten = source.xauslagenWeiterleiten
target.xdebikondition = source.xdebikondition
# payment conditions
target.xDebiKondition = source.xDebiKondition
# accounting
target.xDatenbankFibu = source.xDatenbankFibu
target.xLoginFibu = source.xLoginFibu
target.xPasswordFibu = source.xPasswordFibu
target.xPersonenkonto =source.xPersonenkonto
target.xErtragskontoLeistungen = source.xErtragskontoLeistungen
target.xErtragskontoSpesen = source.xErtragskontoSpesen
target.xErtragskontoAuslagen = source.xErtragskontoAuslagen
target.xDebitorkonto = source.xDebitorkonto
target.xVorschusskonto = source.xVorschusskonto
target.xKostenstelleLeistungen = source.xKostenstelleLeistungen
target.xKostenstelleSpesen = source.xKostenstelleSpesen
target.xKostenstelleAuslagen = source.xKostenstelleAuslagen
target.xZahlungstyp = source.xZahlungstyp
# additional fields
copyAdditionalFields (source, target)
# assigned users
copyUserLink(source, target)
# custom links
copyCustomLinks(source, target)
def main(project):
# dialog to select template
dlgDefinition="""
<Dialog Title="{Translate 'Select project template'}" Width="400">
<ComboBox Name="Vorlage" Label="{Translate 'Template'}" ListExpression="Projekttyp.allInstances->select(eintragid='ProjectTypeTemplate')->first.projekte" />
<Dialog.Buttons>
<Button Text="OK" IsAccept="True" Command="{Binding OkCommand}" />
<Button Text="Cancel" IsCancel="True" Command="{Binding CancelCommand}" />
</Dialog.Buttons>
</Dialog>
"""
initValues={}
ok, values = vtcapp.showcustomdialog(dlgDefinition, initValues)
if ok:
vProjectID = values["Vorlage"]
if not vProjectID:
return
sourceProject = vtcapp.getobjectbyid(vProjectID)
# we need systemcontext to guarantee read access on template projects for project managers
vtcapp.beginsystemcontext()
# copy project settings
copyProjectSettings(sourceProject, project)
# copy phases
if sourceProject.eval("allephasen.list->size>0"):
phasesFirstLevel = sourceProject.phasen
for sourcePhase in phasesFirstLevel:
newPhase = copyPhase(sourcePhase, sourcePhase.parentphase, project)
copySubPhasen(sourcePhase, newPhase, project)
# copy Keywords
keywords = sourceProject.eval("ordner->select(parentordner.stichwort)")
for keywordFolder in keywords:
project.ordner.append(keywordFolder)
# set tag on project to avoid second call of script for project template
project.addtag('projectTemplateApplied')
vtcapp.endsystemcontext()
# conclude with a message
vtcapp.msgbox(vtcapp.translate("The project template was successfully applied."))
main(argobject)
None
true
true
false
Python