diff options
Diffstat (limited to 'apps/checkin')
-rw-r--r-- | apps/checkin/README.rst | 103 | ||||
-rw-r--r-- | apps/checkin/__init__.py | 0 | ||||
-rw-r--r-- | apps/checkin/checkin.mindnode/QuickLook/Preview.jpg | bin | 0 -> 57589 bytes | |||
-rw-r--r-- | apps/checkin/checkin.mindnode/contents.xml | 1507 | ||||
-rw-r--r-- | apps/checkin/checkin.mindnode/style.mindnodestyle/contents.xml | bin | 0 -> 1483 bytes | |||
-rw-r--r-- | apps/checkin/checkin.mindnode/style.mindnodestyle/metadata.plist | bin | 0 -> 152 bytes | |||
-rw-r--r-- | apps/checkin/checkin.mindnode/viewState.plist | bin | 0 -> 185 bytes | |||
-rw-r--r-- | apps/checkin/models.py | 94 | ||||
-rw-r--r-- | apps/checkin/tests.py | 16 | ||||
-rw-r--r-- | apps/checkin/views.py | 1 |
10 files changed, 1721 insertions, 0 deletions
diff --git a/apps/checkin/README.rst b/apps/checkin/README.rst new file mode 100644 index 0000000..871037b --- /dev/null +++ b/apps/checkin/README.rst @@ -0,0 +1,103 @@ +Introduction +============ +Servo Checkin is a tool for checking in Apple hardware for service. It's designed for consumers, business customers and service providers. Should work on both desktop and mobile devices. The service will be a free public service for consumers to manage their Apple hardware and a paid service for Service Providers (SP) who can: +- Link to the service from their homepage +- Use the service at their stores as a self-service system + +Business customers should be able to check in their service cases with a certain SP as well as receive updates and give feedback on a case. + +Each "instance" is always tied to a specific SP. The customer always starts withs https://checkin.servoapp.com/$sp + + +Features +======== +Customers should be able to: +- Create an account and manage their Apple hardware +- Check in a device for service without creating an account +- Check the status of their current service cases (if they've created an account) + + +Managing hardware +================= +- Customers should be able to check the warranty of their device. +- Upload purchase receipts and other relevant documents. Mark a device as stolen (?). +- Check part prices (with proper service provider backend) +- Check the specs of the machine (what type of RAM, supported OS, etc) +- See current repair extension programs for the device + + +Creating a Service Case +======================= +- Choose language +- Enter serial number +- Enter problem description +- Enter username and password +- Enter whether data backup is necessary +- Enter maximum price for repair (if OOW) +- Troubleshooting + + +During service +============== +- Customers should be able to check the status of the repair +- See the latest reported notes by the technician +- See the totall cost of the repair +- Authorize or decline a cost estimate + + +After service +============= +- Customers should be able to give feedback on the case +- Rate the case (1-5 on speed, professionalism... check CSAT) +- Overall time to repair completion +- Professionalism of the service location employees +- Quality of the repair and condition of the repaired product +- Timeliness of updates provided, especially if the repair is delayed +- Follow-up? (somehow checking that the problem is really gone?) + + +Troubleshooting +=============== +- Help the customer describe the problem +- Help the service provider get the information they need +- Admin-configurable (question: choices) +- Creates a "story" + + +Backends +======== +Servo Checkin should be a separate product from Servo. This would allow: +- providing a public service for customers to manage their Apple hardware +- sell the system separately to service providers who don't need/want Servo + +Checkin should have 3 possible backend choices: +- Email (just dump all the entered text into an email) +- HTTP post (JSON, authenticated) +- Servo + + +The Servo backend +================= +- Associate the customer with a Servo customer with their email address (?) +- Create the Service Order +- Add the customer's notes (by the API user) +- Update the service order with input from the customer duing the repair +- The customer can print the work confirmation +- The Service Provider gets a custom URL (http://checkin.servoapp.com/provider) + + +The Implementation +================== +- Django app +- PostgreSQL +- south +- Use as many generic class-based views as possible +- Bootstrap 3 +- warranty checkup through py-gsxws +- Desktop, phone, tablet + + +Checkin Admin +============= +- Create AASP accounts (backend, urls, etc) +- Show some customer stats? (no. of logins...) diff --git a/apps/checkin/__init__.py b/apps/checkin/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/apps/checkin/__init__.py diff --git a/apps/checkin/checkin.mindnode/QuickLook/Preview.jpg b/apps/checkin/checkin.mindnode/QuickLook/Preview.jpg Binary files differnew file mode 100644 index 0000000..3a33372 --- /dev/null +++ b/apps/checkin/checkin.mindnode/QuickLook/Preview.jpg diff --git a/apps/checkin/checkin.mindnode/contents.xml b/apps/checkin/checkin.mindnode/contents.xml new file mode 100644 index 0000000..3171723 --- /dev/null +++ b/apps/checkin/checkin.mindnode/contents.xml @@ -0,0 +1,1507 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>author</key> + <string></string> + <key>comments</key> + <string></string> + <key>isUsingConstrainedLayout</key> + <false/> + <key>keywords</key> + <string></string> + <key>mindMap</key> + <dict> + <key>associations</key> + <array> + <dict> + <key>endArrow</key> + <integer>1</integer> + <key>endNodeID</key> + <string>B9D3B1E4-B44D-4A49-87CC-852937542677</string> + <key>startArrow</key> + <integer>0</integer> + <key>startNodeID</key> + <string>2CFCCC66-C66B-44BB-85B1-88EE7CDCC9C0</string> + <key>strokeColor</key> + <string>{0.000, 0.500, 1.000, 1.000}</string> + <key>strokeStyle</key> + <integer>1</integer> + <key>strokeWidth</key> + <real>1</real> + <key>wayPointOffset</key> + <string>{-96.6797, 157.84}</string> + </dict> + </array> + <key>color</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>mainNodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <true/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{-296.22585227272691, -190.51065340909088}</string> + <key>nodeID</key> + <string>C199C0FB-BE46-4F21-919A-D1760AC07432</string> + <key>strokeColor</key> + <string>{0.500, 0.500, 0.500, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>2</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{-31.132102272726911, -426.63174715909088}</string> + <key>nodeID</key> + <string>DB60DB17-ABB4-41F1-A5E8-2AE2E9EDB286</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>6</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{130.92968750000034, -637.74325284090924}</string> + <key>nodeID</key> + <string>55AA61F0-0A63-44FB-900D-1587F471E3B9</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -765.74325284090924}</string> + <key>nodeID</key> + <string>0AEE735E-431C-427E-9C71-1A79BD2E5FFC</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>first name</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 first name}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -733.74325284090924}</string> + <key>nodeID</key> + <string>963D451B-1670-44D6-A8C5-E2D476424939</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>last name</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 last name}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -701.74325284090924}</string> + <key>nodeID</key> + <string>C9938290-7D28-4AF2-A56E-5CB3DFB2B05D</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>company</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 company}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -669.74325284090924}</string> + <key>nodeID</key> + <string>B6BE8DC1-3C39-44B3-AF13-015809F88E27</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>email</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 email}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -637.74325284090924}</string> + <key>nodeID</key> + <string>F4CB2543-5ACD-4839-B909-BFA27AC5CF26</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>phone</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 phone}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -605.74325284090924}</string> + <key>nodeID</key> + <string>E2D4CAA1-4EC0-4902-AF2D-CBBBE81F28F5</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>address</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 address}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -573.74325284090924}</string> + <key>nodeID</key> + <string>096A67F4-1240-4545-A069-848CD7FE2A35</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>zip code</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 zip code}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -541.74325284090924}</string> + <key>nodeID</key> + <string>BB7C71F6-C57F-4F7E-9F41-1E09C33077D7</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>city</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 city}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{242.92968750000034, -509.74325284090924}</string> + <key>nodeID</key> + <string>00832BCE-D6D2-4C1B-A9B9-4E7B26D0CC4F</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>password</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 password}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>fields</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 fields}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{99.867897727273089, -378.63174715909088}</string> + <key>nodeID</key> + <string>B9A64567-58AE-4728-80AB-CB4135511C7B</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{219.86789772727309, -442.63174715909088}</string> + <key>nodeID</key> + <string>A0411427-08C3-4112-B0E6-FC7DE25E7310</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>model</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 model}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{219.86789772727309, -410.63174715909088}</string> + <key>nodeID</key> + <string>59971B68-93AA-41EB-A6D1-B131675137CA</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>configuration</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 configuration}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{219.86789772727309, -378.63174715909088}</string> + <key>nodeID</key> + <string>44E4FF78-B308-41F7-ABF7-510366694717</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>pop</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 pop}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{219.86789772727309, -346.63174715909088}</string> + <key>nodeID</key> + <string>1FF5714A-255B-4063-A7E2-51AF2111499D</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>username</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 username}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{219.86789772727309, -314.63174715909088}</string> + <key>nodeID</key> + <string>E6C6A9F0-B6A7-4B5B-AFE9-1C6D4F8063E6</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>password</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 password}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>devices</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 devices}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{99.867897727273089, -218.63174715909088}</string> + <key>nodeID</key> + <string>E6AC23C3-9AC2-4E39-A588-B38BB9770809</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{249.86789772727309, -282.63174715909088}</string> + <key>nodeID</key> + <string>BE72CAFD-3DF8-49B0-BB3E-BA9BAAB2957A</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>problem</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 problem}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{249.86789772727309, -250.63174715909088}</string> + <key>nodeID</key> + <string>058C266C-5DD5-433C-9D9E-6379801193AA</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{361.86789772727309, -250.63174715909088}</string> + <key>nodeID</key> + <string>BD5A5DC2-3BC1-4491-819E-BE54D514C4A5</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>3</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>attachments</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 attachments}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>notes</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 notes}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{249.86789772727309, -218.63174715909088}</string> + <key>nodeID</key> + <string>5468F5DB-6F82-4A74-997C-47E4D48A97B8</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>status</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 status}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{249.86789772727309, -186.63174715909088}</string> + <key>nodeID</key> + <string>3218C3C2-7862-4731-8B56-433A16E93FFB</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>rating</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 rating}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{249.86789772727309, -154.63174715909088}</string> + <key>nodeID</key> + <string>2CFCCC66-C66B-44BB-85B1-88EE7CDCC9C0</string> + <key>strokeColor</key> + <string>{0.467, 0.000, 0.851, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>service provider</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 service provider}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>service case</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 service case}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>customer</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 customer}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{56.508522727273089, 161.04794034090912}</string> + <key>nodeID</key> + <string>B9D3B1E4-B44D-4A49-87CC-852937542677</string> + <key>strokeColor</key> + <string>{0.000, 0.608, 0.847, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>6</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{228.50852272727309, 145.04794034090912}</string> + <key>nodeID</key> + <string>7726D723-5B52-4CD6-BCA0-8648E437D1A3</string> + <key>strokeColor</key> + <string>{0.000, 0.608, 0.847, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>backend type</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 backend type}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <false/> + <key>location</key> + <string>{228.50852272727309, 177.04794034090912}</string> + <key>nodeID</key> + <string>3FC8C8A7-54DE-45F6-A66A-6E34AB6954FF</string> + <key>strokeColor</key> + <string>{0.000, 0.608, 0.847, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>servo url</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 servo url}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>service provider</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 service provider}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-466.22585227272691, -99.510653409090878}</string> + <key>nodeID</key> + <string>4F122D04-DAE9-422F-9D22-807F6F8AD928</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>6</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-710.22585227272691, -179.51065340909088}</string> + <key>nodeID</key> + <string>C1C503FA-E1E1-4EAB-8CB4-3C60710CED4A</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>Does the device power on?</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 Does the device power on?}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-825.22585227272691, -147.51065340909088}</string> + <key>nodeID</key> + <string>0C3E1E6A-57AE-4B07-BF21-CE2CC6509E4B</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>Was the issue caused by accidental damage?</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 Was the issue caused by accidental damage?}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-809.22585227272691, -115.51065340909088}</string> + <key>nodeID</key> + <string>C15860CD-ED20-436D-ABC0-CE5EA4177623</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>Do you have a recent backup of your data?</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 Do you have a recent backup of your data?}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-764.22585227272691, -51.510653409090878}</string> + <key>nodeID</key> + <string>E3D0D683-B76B-4BBE-BC4A-1E4D7EEA5C94</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>5</real> + <key>subnodes</key> + <array> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-904.22585227272691, -83.510653409090878}</string> + <key>nodeID</key> + <string>DF33303C-54EC-449E-996A-8E2222F263E0</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>Constantly</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 Constantly}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-972.22585227272691, -51.510653409090878}</string> + <key>nodeID</key> + <string>8C45AA5C-F770-4F73-996A-2B7F394F6F08</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>Several times per day</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 Several times per day}</string> + </dict> + </dict> + <dict> + <key>contentAlignment</key> + <integer>1</integer> + <key>fillColor</key> + <string>{1.000, 1.000, 1.000, 1.000}</string> + <key>isDecreasingBranchThickness</key> + <true/> + <key>isDrawingFill</key> + <false/> + <key>isLeftAligned</key> + <true/> + <key>location</key> + <string>{-982.22585227272691, -19.510653409090878}</string> + <key>nodeID</key> + <string>B961D71E-AF99-4BDB-8ED0-EB6D0C840A0E</string> + <key>strokeColor</key> + <string>{0.000, 0.851, 0.671, 1.000}</string> + <key>strokeStyle</key> + <integer>0</integer> + <key>strokeWidth</key> + <real>4</real> + <key>subnodes</key> + <array/> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>Several times per week</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 Several times per week}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>How often does the problem occur?</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 How often does the problem occur?}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>troubleshooting</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 troubleshooting}</string> + </dict> + </dict> + </array> + <key>title</key> + <dict> + <key>constrainedWidth</key> + <integer>300</integer> + <key>htmlText</key> + <string><p style='color: rgba(0, 0, 0, 1.000000); font: 14px "Helvetica Neue"; -cocoa-font-postscriptname: "HelveticaNeue"; '>Checkin</p></string> + <key>shrinkToFitContent</key> + <integer>1</integer> + <key>text</key> + <string>{\rtf1\ansi\ansicpg1252\cocoartf1265 +{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;} +{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} +\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural + +\f0\fs28 \cf2 Checkin}</string> + </dict> + </dict> + </array> + </dict> + <key>printInfo</key> + <data> + BAtzdHJlYW10eXBlZIHoA4QBQISEhAtOU1ByaW50SW5mbwGEhAhOU09iamVjdACFkoSE + hBNOU011dGFibGVEaWN0aW9uYXJ5AISEDE5TRGljdGlvbmFyeQCUhAFpCJKEhIQITlNT + dHJpbmcBlIQBKxZOU0hvcml6b250YWxseUNlbnRlcmVkhpKEhIQITlNOdW1iZXIAhIQH + TlNWYWx1ZQCUhAEqhIQBY50BhpKEmZkNTlNSaWdodE1hcmdpboaShJuchIQBZp5IhpKE + mZkMTlNMZWZ0TWFyZ2luhpKEm5ygnkiGkoSZmRVOU0hvcml6b25hbFBhZ2luYXRpb26G + koSbnISXlwKGkoSZmRROU1ZlcnRpY2FsUGFnaW5hdGlvboaShJucpZcAhpKEmZkUTlNW + ZXJ0aWNhbGx5Q2VudGVyZWSGkpqShJmZC05TVG9wTWFyZ2luhpKEm5ygnlqGkoSZmQ5O + U0JvdHRvbU1hcmdpboaShJucoJ5ahoaG + </data> + <key>title</key> + <string>checkin</string> + <key>version</key> + <integer>4</integer> +</dict> +</plist> diff --git a/apps/checkin/checkin.mindnode/style.mindnodestyle/contents.xml b/apps/checkin/checkin.mindnode/style.mindnodestyle/contents.xml Binary files differnew file mode 100644 index 0000000..7904eba --- /dev/null +++ b/apps/checkin/checkin.mindnode/style.mindnodestyle/contents.xml diff --git a/apps/checkin/checkin.mindnode/style.mindnodestyle/metadata.plist b/apps/checkin/checkin.mindnode/style.mindnodestyle/metadata.plist Binary files differnew file mode 100644 index 0000000..5cb6e90 --- /dev/null +++ b/apps/checkin/checkin.mindnode/style.mindnodestyle/metadata.plist diff --git a/apps/checkin/checkin.mindnode/viewState.plist b/apps/checkin/checkin.mindnode/viewState.plist Binary files differnew file mode 100644 index 0000000..b5098a5 --- /dev/null +++ b/apps/checkin/checkin.mindnode/viewState.plist diff --git a/apps/checkin/models.py b/apps/checkin/models.py new file mode 100644 index 0000000..efea6ff --- /dev/null +++ b/apps/checkin/models.py @@ -0,0 +1,94 @@ +import uuid +from django.db import models +from django.conf import settings +from django.utils.translation import ugettext as _ + +from apps.core.models import TaggedItem, ServiceProvider + + +class Device(models.Model): + sn = models.CharField( + blank=True, + default='', + max_length=32, + verbose_name=_("Serial Number") + ) + description = models.CharField( + max_length=128, + default=_("New Device"), + verbose_name=_("description") + ) + WARRANTY_CHOICES = ( + ('ALW', _("Apple Limited Warranty")), + ('APP', _("AppleCare Protection Plan")), + ('CSC', _("Customer Satisfaction (CS) Code")), + ('CBC', _("Custom Bid Contracts")), + ('WTY', _("3'rd Party Warranty")), + ('OOW', _("Out Of Warranty (No Coverage)")), + ('NA', _("Unknown")), + ) + + warranty_status = models.CharField( + max_length=3, + default="NA", + choices=WARRANTY_CHOICES, + verbose_name=_("Warranty Status") + ) + username = models.CharField( + blank=True, + default='', + max_length=32, + verbose_name=_("username") + ) + password = models.CharField( + blank=True, + default='', + max_length=32, + verbose_name=_("password") + ) + + +class Customer(models.Model): + sp = models.ForeignKey(ServiceProvider) + user = models.ForeignKey(settings.AUTH_USER_MODEL) + street_address = models.CharField( + null=True, + blank=True, + max_length=128, + verbose_name=_('address') + ) + zip_code = models.CharField( + null=True, + blank=True, + max_length=32, + verbose_name=_('ZIP Code') + ) + city = models.CharField( + null=True, + blank=True, + max_length=32, + verbose_name=_('city') + ) + devices = models.ManyToManyField(Device, null=True) + + +class ServiceOrder(models.Model): + sp = models.ForeignKey(ServiceProvider) + uuid = models.CharField( + max_length=36, + unique=True, + default=lambda: str(uuid.uuid4()) + ) + created_by = models.ForeignKey(settings.AUTH_USER_MODEL) + notes = models.TextField(default='') + customer = models.ForeignKey(Customer) + devices = models.ManyToManyField(Device, null=True) + tags = models.ManyToManyField(TaggedItem) + + def add_accessory(self, accessory): + tag = TaggedItem() + tag.kind = 'accessory' + tag.save() + + def submit(self): + pass diff --git a/apps/checkin/tests.py b/apps/checkin/tests.py new file mode 100644 index 0000000..501deb7 --- /dev/null +++ b/apps/checkin/tests.py @@ -0,0 +1,16 @@ +""" +This file demonstrates writing tests using the unittest module. These will pass +when you run "manage.py test". + +Replace this with more appropriate tests for your application. +""" + +from django.test import TestCase + + +class SimpleTest(TestCase): + def test_basic_addition(self): + """ + Tests that 1 + 1 always equals 2. + """ + self.assertEqual(1 + 1, 2) diff --git a/apps/checkin/views.py b/apps/checkin/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/apps/checkin/views.py @@ -0,0 +1 @@ +# Create your views here. |