Copy current project
Product line
Standard
|Expert
Operating mode
CLOUD ABO
|ON-PREMISES
Modules
Services & CRM
Budget & Phases
Purchases
Resource Planning
Business Intelligence
The additional feature Project Templates allows you to create projects based on stored project templates. If you want to work with project templates, we recommend that you load this additional feature.
The script in this article creates a new project in Vertec based on the current project:
version | description | Scripting |
---|---|---|
6.1.0.10 | Also copies user links, keys and tags. The project code is queried via the input box. | Projectcopy61.py |
6.7 | xResourcePlanPhases are no longer copied (the member was removed with Vertec 6.7). Script for Vertec versions prior to 6.7.0.12 and to run in the Script Editor for all versions. |
projectcopy67.py |
6.7.0.12 | Used selectedobjects . | Copyproject.py |
On the project to be copied. Please use the script that matches your current Vertec version.
The (latest) script text is displayed here to enable the full text search.
# coding: windows-1252 # #---Bezeichnung: Projekt kopieren # Klassen: Projekt # Selectedobjectsscript: Yes # Condexpression: self->size = 1 # EventType: Kein # EventClass: # EventMembers: # ExtendedRights: # #---Erstellt ein neues Projekt und kopiert die Einstellungen vom Quellen-Projekt #---2017-12-17, UOS: Aus Vorlage erstellt #---09.08.2018, sth: Kopiert nun auch BearbeiterLinks, CustomLinks, Keys und Tags. # Der Projektcode wird über die Inputbox abgefragt. #---29.11.2018, tka: Subphasenhandling: Projekt wird nur gesetzt, wenn Parentphase. #---30.01.2019, sth: Bugfix beim Kopieren von Zusatzfeldern. #---04.09.2020, sth: Bugfix beim Kopieren von CustomLinks. #---27.01.2022, sth: Script aus Config Set Projektvorlagen extrahiert. Budgetwerte auf Bearbeiterphaselinks werden ebenfalls kopiert. #---19.09.2023, sth: Member xResourcePlanPhases aus Projektvorgaben entfernt (wurde mit Vertec 6.7 gelöscht). # 10.10.2024, sth: Angepasst an selectedobjects und Vertec 6.7.0.12 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(projectlist): for Vprojekt in projectlist: projektcode = vtcapp.inputbox('Vertec','Geben Sie den Code des neuen Projekts an','') if projektcode: # Erzeuge das neue Projekt projekt = vtcapp.createobject("Projekt") projekt.code = projektcode # Projekteinstellungen übernehmen copyProjectSettings(Vprojekt, projekt) # Phasen kopieren, falls vorhanden if Vprojekt.eval("allephasen.list->size>0"): PhasenStufe1 = Vprojekt.phasen for vorlagePhase in PhasenStufe1: newPhase = copyPhase(vorlagePhase, vorlagePhase.parentphase, projekt) copySubPhasen(vorlagePhase, newPhase, projekt) # Stichwörter übernehmen Stichwoerter = Vprojekt.eval("ordner->select(parentordner.stichwort)") for StOrdner in Stichwoerter: projekt.ordner.append(StOrdner) vtcapp.showdetailform (projekt) main(selectedobjects)