# coding: windows-1252
#
#---Bezeichnung: Projekt kopieren
#   Klassen: Projekt
#   CondExpression:
#   ObjectScript: Y
#   ContainerScript: N
#   EventType: -
#   EventClass: -
#   EventMembers: -
#   ExtendedRights: Y
#
#---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).


def main(Vprojekt):

    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)

    if not Vprojekt.eval("oclistypeof(Projekt)"):
        vtcapp.msgbox("Das Script kann nur auf einem Projekt ausgeführt werden")
        return

    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(argobject)
