|
| 1 | +#!/usr/bin/python |
| 2 | +import requests |
| 3 | +import json |
| 4 | +import math |
| 5 | +import sys |
| 6 | + |
| 7 | +##################### |
| 8 | +# Bamboo API Config # |
| 9 | +##################### |
| 10 | + |
| 11 | +Site = "<YOUR_BAMBOO_INSTANCE>" |
| 12 | +Key = "<YOUR_BAMBOO_API_KEY>" |
| 13 | +Auth = (Key, 'x') |
| 14 | +Headers = {"Accept": "application/json"} |
| 15 | +BaseUrl = "https://api.bamboohr.com/api/gateway.php/%s/v1/" % (Site) |
| 16 | +EmployeeDirectory = "employees/directory" |
| 17 | + |
| 18 | + |
| 19 | +########################## |
| 20 | +# OfficeSpace API Config # |
| 21 | +########################## |
| 22 | +Hostname = "<YOUR_OFFICESPACE_SUBDOMAIN>.officespacesoftware.com" |
| 23 | +Token = "<YOUR_OFFICESPACE_API_KEY>" |
| 24 | +BatchUrl = "/api/1/employee_batch_imports" |
| 25 | +ImportUrl = "/api/1/employee_directory" |
| 26 | +Protocol = "https://" |
| 27 | +Headers = {'Authorization': "Token token=%s" % Token} |
| 28 | +JsonHeaders = {'Authorization': "Token token=%s" % Token, 'Content-Type': 'application/json; charset=utf-8'} |
| 29 | +Source = "BambooHR" |
| 30 | +EmployeeBatchUrl = Protocol + Hostname + BatchUrl |
| 31 | +EmployeeBatchStagingUrl = Protocol + Hostname + ImportUrl + "/" + Source |
| 32 | +EmployeeImportUrl = Protocol + Hostname + ImportUrl |
| 33 | +BatchSize = 1000 |
| 34 | +########################## |
| 35 | + |
| 36 | +Response = requests.get(BaseUrl + EmployeeDirectory, auth=Auth, headers=Headers) |
| 37 | + |
| 38 | +if Response.status_code == 200: |
| 39 | + Data = json.loads(Response.text) |
| 40 | + print("Got %d employees from Bamboo" % (len(Data['employees']))) |
| 41 | + |
| 42 | + # OfficeSpace to BambooHR mapping |
| 43 | + EmployeeId = "id" |
| 44 | + FirstName = "firstName" |
| 45 | + LastName = "lastName" |
| 46 | + Title = "jobTitle" |
| 47 | + WorkPhone = "workPhone" |
| 48 | + Extension = "workPhoneExtension" |
| 49 | + Photo = "photoUrl" |
| 50 | + Department = "department" |
| 51 | + Bio = "" |
| 52 | + Email = "workEmail" |
| 53 | + StartDate = "" |
| 54 | + EndDate = "" |
| 55 | + ShowInVd = "" |
| 56 | + Udf0 = "location" |
| 57 | + Udf1 = "division" |
| 58 | + Udf2 = "mobilePhone" |
| 59 | + Udf3 = "preferredName" |
| 60 | + Udf4 = "" |
| 61 | + Udf5 = "" |
| 62 | + Udf6 = "" |
| 63 | + Udf7 = "" |
| 64 | + Udf8 = "" |
| 65 | + Udf9 = "" |
| 66 | + Udf10 = "" |
| 67 | + Udf11 = "" |
| 68 | + Udf12 = "" |
| 69 | + Udf13 = "" |
| 70 | + Udf14 = "" |
| 71 | + Udf15 = "" |
| 72 | + Udf16 = "" |
| 73 | + Udf17 = "" |
| 74 | + Udf18 = "" |
| 75 | + Udf19 = "" |
| 76 | + Udf20 = "" |
| 77 | + Udf21 = "" |
| 78 | + Udf22 = "" |
| 79 | + Udf23 = "" |
| 80 | + Udf24 = "" |
| 81 | + |
| 82 | + BambooEmployees = Data['employees'] |
| 83 | + |
| 84 | + Batches = math.floor(len(BambooEmployees)/BatchSize) + 1 |
| 85 | + Start = 0 |
| 86 | + End = BatchSize - 1 |
| 87 | + Batch = 1 |
| 88 | + |
| 89 | + print("Staging records in OfficeSpace...") |
| 90 | + try: |
| 91 | + Response = requests.delete(EmployeeBatchStagingUrl, headers=JsonHeaders) |
| 92 | + except Exception, e: |
| 93 | + print("Delete Staging Records Error: %s" % str(e)) |
| 94 | + else: |
| 95 | + Array = [] |
| 96 | + |
| 97 | + while True: |
| 98 | + for BambooEmployee in BambooEmployees[Start:End]: |
| 99 | + Person = {} |
| 100 | + Person["EmployeeId"] = BambooEmployee[EmployeeId] if BambooEmployee.has_key(EmployeeId) else '' |
| 101 | + Person["Source"] = Source |
| 102 | + Person["FirstName"] = BambooEmployee[FirstName] if BambooEmployee.has_key(FirstName) else '' |
| 103 | + Person["LastName"] = BambooEmployee[LastName] if BambooEmployee.has_key(LastName) else '' |
| 104 | + Person["Title"] = BambooEmployee[Title] if BambooEmployee.has_key(Title) else '' |
| 105 | + Person["WorkPhone"] = BambooEmployee[WorkPhone] if BambooEmployee.has_key(WorkPhone) else '' |
| 106 | + Person["Extension"] = BambooEmployee[Extension] if BambooEmployee.has_key(Extension) else '' |
| 107 | + Person["Photo"] = BambooEmployee[Photo] if BambooEmployee.has_key(Photo) else '' |
| 108 | + Person["Department"] = BambooEmployee[Department] if BambooEmployee.has_key(Department) else '' |
| 109 | + Person["Bio"] = BambooEmployee[Bio] if BambooEmployee.has_key(Bio) else '' |
| 110 | + Person["Email"] = BambooEmployee[Email] if BambooEmployee.has_key(Email) else '' |
| 111 | + Person["StartDate"] = BambooEmployee[StartDate] if BambooEmployee.has_key(StartDate) else '' |
| 112 | + Person["EndDate"] = BambooEmployee[EndDate] if BambooEmployee.has_key(EndDate) else '' |
| 113 | + Person["ShowInVd"] = BambooEmployee[ShowInVd] if BambooEmployee.has_key(ShowInVd) else '' |
| 114 | + Person["Udf0"] = BambooEmployee[Udf0] if BambooEmployee.has_key(Udf0) else '' |
| 115 | + Person["Udf1"] = BambooEmployee[Udf1] if BambooEmployee.has_key(Udf1) else '' |
| 116 | + Person["Udf2"] = BambooEmployee[Udf2] if BambooEmployee.has_key(Udf2) else '' |
| 117 | + Person["Udf3"] = BambooEmployee[Udf3] if BambooEmployee.has_key(Udf3) else '' |
| 118 | + Person["Udf4"] = BambooEmployee[Udf4] if BambooEmployee.has_key(Udf4) else '' |
| 119 | + Person["Udf5"] = BambooEmployee[Udf5] if BambooEmployee.has_key(Udf5) else '' |
| 120 | + Person["Udf6"] = BambooEmployee[Udf6] if BambooEmployee.has_key(Udf6) else '' |
| 121 | + Person["Udf7"] = BambooEmployee[Udf7] if BambooEmployee.has_key(Udf7) else '' |
| 122 | + Person["Udf8"] = BambooEmployee[Udf8] if BambooEmployee.has_key(Udf8) else '' |
| 123 | + Person["Udf9"] = BambooEmployee[Udf9] if BambooEmployee.has_key(Udf9) else '' |
| 124 | + Person["Udf10"] = BambooEmployee[Udf10] if BambooEmployee.has_key(Udf10) else '' |
| 125 | + Person["Udf11"] = BambooEmployee[Udf11] if BambooEmployee.has_key(Udf11) else '' |
| 126 | + Person["Udf12"] = BambooEmployee[Udf12] if BambooEmployee.has_key(Udf12) else '' |
| 127 | + Person["Udf13"] = BambooEmployee[Udf13] if BambooEmployee.has_key(Udf13) else '' |
| 128 | + Person["Udf14"] = BambooEmployee[Udf14] if BambooEmployee.has_key(Udf14) else '' |
| 129 | + Person["Udf15"] = BambooEmployee[Udf15] if BambooEmployee.has_key(Udf15) else '' |
| 130 | + Person["Udf16"] = BambooEmployee[Udf16] if BambooEmployee.has_key(Udf16) else '' |
| 131 | + Person["Udf17"] = BambooEmployee[Udf17] if BambooEmployee.has_key(Udf17) else '' |
| 132 | + Person["Udf18"] = BambooEmployee[Udf18] if BambooEmployee.has_key(Udf18) else '' |
| 133 | + Person["Udf19"] = BambooEmployee[Udf19] if BambooEmployee.has_key(Udf19) else '' |
| 134 | + Person["Udf20"] = BambooEmployee[Udf20] if BambooEmployee.has_key(Udf20) else '' |
| 135 | + Person["Udf21"] = BambooEmployee[Udf21] if BambooEmployee.has_key(Udf21) else '' |
| 136 | + Person["Udf22"] = BambooEmployee[Udf22] if BambooEmployee.has_key(Udf22) else '' |
| 137 | + Person["Udf23"] = BambooEmployee[Udf23] if BambooEmployee.has_key(Udf23) else '' |
| 138 | + Person["Udf24"] = BambooEmployee[Udf24] if BambooEmployee.has_key(Udf24) else '' |
| 139 | + Array.append(Person) |
| 140 | + JSONArray = json.dumps(Array) |
| 141 | + JSONArrayUTF8 = JSONArray.encode() |
| 142 | + #print(JSONArrayUTF8) |
| 143 | + #print("") |
| 144 | + try: |
| 145 | + Response = requests.post(EmployeeBatchUrl, data=JSONArrayUTF8, headers=JsonHeaders) |
| 146 | + except Exception, e: |
| 147 | + print("Batch No. %d Update Records Error: %s" % (Batch, str(e))) |
| 148 | + sys.exit(1) |
| 149 | + else: |
| 150 | + Start+=BatchSize |
| 151 | + End+=BatchSize |
| 152 | + Batch=Batch+1 |
| 153 | + if (Batch >= Batches): |
| 154 | + break |
| 155 | + print("Triggering migration") |
| 156 | + ImportUrlPostBody = '{ "Source" : "' + Source + '" }' |
| 157 | + print(ImportUrlPostBody) |
| 158 | + try: |
| 159 | + Response = requests.post(EmployeeImportUrl, data=ImportUrlPostBody, headers=Headers) |
| 160 | + except Exception, e: |
| 161 | + print("Trigger Migration Error: %s" % str(e)) |
| 162 | + else: |
| 163 | + print("Completed") |
| 164 | +else: |
| 165 | + print("Error %s for request %s" % (str(Response.status_code), BaseUrl + EmployeeDirectory)) |
0 commit comments