# 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)
