commit
4a4d724cf9
@ -0,0 +1 @@ |
|||||||
|
venv/ |
||||||
@ -0,0 +1 @@ |
|||||||
|
{"action": "cancel", "ra_number": "RCTR1406-000001", "reason": "Lessee Purchase"} |
||||||
@ -0,0 +1,3 @@ |
|||||||
|
{ |
||||||
|
"ra_number": "RCTR1406-000001" |
||||||
|
} |
||||||
@ -0,0 +1 @@ |
|||||||
|
{"action": "get", "lease_number": "123-4567876-001", "details": "yes"} |
||||||
@ -0,0 +1,108 @@ |
|||||||
|
{ |
||||||
|
"ra_number": "RCTR1406-000001", |
||||||
|
"lease_number": "123-4567876-001", |
||||||
|
"termination_date": "2014-05-12", |
||||||
|
"ra_date": "2014-05-22", |
||||||
|
"sent_date": "2014-05-26", |
||||||
|
"due_date": "2014-06-26", |
||||||
|
"type": "KEEP: Full trade-up", |
||||||
|
"sent_to": "lessee", |
||||||
|
"comments": "", |
||||||
|
"status": "RA Pending", |
||||||
|
"url": "http://www.returncenter.com/portal/r/538f888964bde", |
||||||
|
"account": { |
||||||
|
"identifier": "AI1234567", |
||||||
|
"company": "Acme Insurance", |
||||||
|
"address1": "123 Main Street", |
||||||
|
"address2": "Suite 233", |
||||||
|
"city": "Boulder", |
||||||
|
"state": "CO", |
||||||
|
"zip": "80301", |
||||||
|
"contact": "James Smith", |
||||||
|
"phone": "(301) 555-1212", |
||||||
|
"cell_phone": "(301) 555-1212", |
||||||
|
"fax": "(301) 555-1212", |
||||||
|
"email": "james.smith@example.com" |
||||||
|
}, |
||||||
|
"pickup_location": { |
||||||
|
"identifier": "AI1273459", |
||||||
|
"company": "Acme Insurance", |
||||||
|
"address1": "5555 Industrial", |
||||||
|
"city": "Boulder", |
||||||
|
"state": "CO", |
||||||
|
"zip": "80302", |
||||||
|
"contact": "Robert Allen", |
||||||
|
"phone": "(301) 555-1212", |
||||||
|
"cell_phone": "(301) 555-1212", |
||||||
|
"fax": "(301) 555-1212", |
||||||
|
"email": "robert.allen@example.com" |
||||||
|
}, |
||||||
|
"destination": { |
||||||
|
"identifier": "AR7734092", |
||||||
|
"company": "Apex Remarketing", |
||||||
|
"address1": "6789 Commerce St.", |
||||||
|
"city": "Denver", |
||||||
|
"state": "CO", |
||||||
|
"zip": "80201", |
||||||
|
"contact": "Samantha Potter", |
||||||
|
"phone": "(720) 555-1212", |
||||||
|
"cell_phone": "(720) 555-1212", |
||||||
|
"fax": "(720) 555-1212", |
||||||
|
"email": "samantha.potter@example.com" |
||||||
|
}, |
||||||
|
"lessor": { |
||||||
|
"identifier": "PL1234567", |
||||||
|
"company": "Pinnacle Leasing", |
||||||
|
"address1": "555 Elm Street", |
||||||
|
"address2": "Suite 101", |
||||||
|
"city": "Omaha", |
||||||
|
"state": "NE", |
||||||
|
"zip": "68127", |
||||||
|
"contact": "Jane Jones", |
||||||
|
"phone": "(402) 555-1212", |
||||||
|
"cell_phone": "(402) 555-1212", |
||||||
|
"fax": "(402) 555-1212", |
||||||
|
"email": "jane.jones@example.com" |
||||||
|
}, |
||||||
|
"lessee": { |
||||||
|
"identifier": "AI1234567", |
||||||
|
"company": "Acme Insurance", |
||||||
|
"address1": "123 Main Street", |
||||||
|
"address2": "Suite 233", |
||||||
|
"city": "Boulder", |
||||||
|
"state": "CO", |
||||||
|
"zip": "80301", |
||||||
|
"contact": "James Smith", |
||||||
|
"phone": "(301) 555-1212", |
||||||
|
"cell_phone": "(301) 555-1212", |
||||||
|
"fax": "(301) 555-1212", |
||||||
|
"email": "james.smith@example.com" |
||||||
|
}, |
||||||
|
"dealer": { |
||||||
|
"identifier": "SC523656", |
||||||
|
"company": "Summit Copiers", |
||||||
|
"address1": "8072 Oak Ave.", |
||||||
|
"city": "Boulder", |
||||||
|
"state": "CO", |
||||||
|
"zip": "80302", |
||||||
|
"contact": "Ben Brady", |
||||||
|
"phone": "(302) 555-1212", |
||||||
|
"cell_phone": "(302) 555-1212", |
||||||
|
"fax": "(302) 555-1212", |
||||||
|
"email": "ben.brady@example.com" |
||||||
|
}, |
||||||
|
"expected_assets": [ |
||||||
|
{ |
||||||
|
"make": "Canon", |
||||||
|
"model_number": "IR2351", |
||||||
|
"serial_number": "KB67QR37472", |
||||||
|
"insurance_value": "525" |
||||||
|
}, |
||||||
|
{ |
||||||
|
"make": "Canon", |
||||||
|
"model_number": "IR202I", |
||||||
|
"serial_number": "MQR23477BCD", |
||||||
|
"insurance_value": "487" |
||||||
|
} |
||||||
|
] |
||||||
|
} |
||||||
@ -0,0 +1,60 @@ |
|||||||
|
import requests as rq |
||||||
|
import re |
||||||
|
from logging import debug, error, basicConfig |
||||||
|
import json |
||||||
|
|
||||||
|
with open("config.json") as configFile: |
||||||
|
config = json.load(configFile) |
||||||
|
|
||||||
|
basicConfig(filename=config["logLocation"], encoding='utf-8', level=config["logging"]) |
||||||
|
|
||||||
|
RETURNCENTER_BASE_RL = config["OnePakUrl"] |
||||||
|
|
||||||
|
def retrieve_return_data(lease_number: str, apiKey: str, details: bool = False) -> dict: |
||||||
|
""" |
||||||
|
Reaches out to OnePak API and searches for the given lease number. |
||||||
|
Returns only summary data by default, use details = True to get full return object |
||||||
|
""" |
||||||
|
debug(f"[I] retrieve_return_data: {lease_number} | deatils: {details}") |
||||||
|
if re.match("\d{3}-\d{7}-\d{3}", lease_number) == None: |
||||||
|
error(f"[!E!] Invalid lease number: {lease_number}") |
||||||
|
return {"error": f"Invalid lease number: {lease_number}"} |
||||||
|
resp = rq.post(RETURNCENTER_BASE_RL, |
||||||
|
json={"action": "get", "lease_number": lease_number, "details": "yes" if details else "no"}, |
||||||
|
headers={"Content-Type": "application/json"}, |
||||||
|
auth=(apiKey, '')) |
||||||
|
if not resp.ok(): |
||||||
|
error(f"[!E!] retrieve_return_data: response was unsuccessful: {resp.text}") |
||||||
|
return {"error": f"{resp.text}"} |
||||||
|
debug(f"[I] retrieve_return_data: resp: {resp}\n{resp.json()}") |
||||||
|
return dict(resp.json()) |
||||||
|
|
||||||
|
|
||||||
|
def cancel_return(ra_number: str, apiKey: str, cancel_reason: str = "No longer needed") -> dict: |
||||||
|
""" |
||||||
|
Cancels a return authorization based on the ra_number |
||||||
|
""" |
||||||
|
debug(f"[I] cancel_return: {ra_number} | cancel reason: {cancel_reason}") |
||||||
|
if re.match("^RCTR.*", ra_number) == None: |
||||||
|
error(f"[!E] Invalid RA Number: {ra_number}") |
||||||
|
return {"error": f"Invalid RA number: {ra_number}"} |
||||||
|
resp = rq.post(RETURNCENTER_BASE_RL, |
||||||
|
json={"action": "cancel", "ra_number": ra_number, "reason": cancel_reason}, |
||||||
|
headers={"Content-Type": "application/json"}, |
||||||
|
auth=(apiKey, '')) |
||||||
|
if not resp.ok(): |
||||||
|
error(f"[!E!] cancel_return: response was unsuccessful: {resp.text}") |
||||||
|
return {"error": f"{resp.text}"} |
||||||
|
debug(f"[I] cancel_return: resp: {resp}\n{resp.json()}") |
||||||
|
return dict(resp.json()) |
||||||
|
|
||||||
|
def search_and_cancel(lease_number: str, apiKey: str, details: bool = False, cancel_reason: str = "No longer needed") -> dict: |
||||||
|
searchResult = retrieve_return_data(lease_number, apiKey, details, cancel_reason) |
||||||
|
if "error" in searchResult.keys(): |
||||||
|
error(f"[!E!] search_and_cancel: Failed to find lease number: {lease_number}\n{searchResult}") |
||||||
|
return searchResult |
||||||
|
cancelresult = cancel_return(searchResult["ra_number"], apiKey, cancel_return) |
||||||
|
if "error" in cancelresult.keys(): |
||||||
|
error(f"[!E!] search_and_cancel: Failed to cancel RA: {lease_number} | {searchResult['ra_number']}\n{cancelresult}") |
||||||
|
return searchResult |
||||||
|
return {"success": "RA has been canceled"} |
||||||
@ -0,0 +1,29 @@ |
|||||||
|
|
||||||
|
ra_number: A unique return authorization number assigned by the ReturnCenter. |
||||||
|
lease_number: The lease number or contract number provided by the lessor |
||||||
|
termination_date: The date when the lease will be terminated. |
||||||
|
ra_date: The date when the Return Authorization was issued. |
||||||
|
sent_date: The date when the Return Authorization was sent. |
||||||
|
due_date: The date by which the Return Authorization must be processed by the lessee or dealer. |
||||||
|
type: Type of return. |
||||||
|
Valid types are: |
||||||
|
KEEP: Full trade-up |
||||||
|
KEEP: Partial trade-up |
||||||
|
TRADE-UP: Full with return |
||||||
|
TRADE-UP: Partial with return |
||||||
|
EOL BUYOUT: Full with return |
||||||
|
EOL BUYOUT: Partial with return |
||||||
|
BUYOUT: Full with return |
||||||
|
BUYOUT: Partial with return |
||||||
|
sent_to: To whom the RA was sent -- either "dealer" or "lessee" |
||||||
|
comments: Comments about the return |
||||||
|
status: Status of the return |
||||||
|
url: The URL for accessing the return in the ReturnCenter. |
||||||
|
account: An organization object for the account holder. The account holder is the person who processes and pays for the return. |
||||||
|
pickup_location: An organization object for the location where the assets are located and will be picked up for shipment. |
||||||
|
destination: An organization object for the destination to which the assets will be shipped. |
||||||
|
lessor: An organization object for the lessor. |
||||||
|
lessee: An organization object for the lessee. |
||||||
|
dealer: An organization object for the dealer or vendor associated with the assets on this return. |
||||||
|
expected_assets: One or more asset objects for the assets that are expected to be shipped with this return. |
||||||
|
received_assets: One or more asset objects that were received at the destination for this return. |
||||||
@ -0,0 +1,4 @@ |
|||||||
|
{"logging": "DEBUG", |
||||||
|
"logLocation": "OnePakRequests.log", |
||||||
|
"OnePakUrl": "https://api.returncenter.com/1/returns", |
||||||
|
"APIKey": ""} |
||||||
Loading…
Reference in new issue