• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Birdie Analysis Report
 

Birdie Analysis Report

on

  • 956 views

My first major paper for my CIS591 project.

My first major paper for my CIS591 project.

Statistics

Views

Total Views
956
Views on SlideShare
956
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Apple iWork

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Birdie Analysis Report Birdie Analysis Report Document Transcript

    • CIS 591 Analysis Report: ‘Birdie’ Benjamin Kreeger (816) 806-7096 kreeger545@missouristate.edu
    • Table of Contents Part I: System Requirements Models ................................................3 Brief overview of system scope 3 Event table 3 Use case diagrams 4 Domain model class diagram 6 Use case descriptions 7 System sequence diagrams (SSDs) 17 Attribute definitions 25 Basic attributes 25 Detailed attributes 26 Part II: Alternative Design Concepts & Recommendation .............28 Defining alternatives 28 Four feasible alternatives 28 Recommended design alternative 29 Part III: Design & Implementation to Date .......................................30 Technology & working environment 30 Implemented to date 30 Screenshots / brief walkthrough 30 Database data 31 Python/Django source 33 HTML template source 38 Database SQL schema code 41 Initial menu hierarchy 44 System reports 44 Part IV: Project Monitoring / Reporting to Date ..............................47 2 CIS591: Analysis Report
    • Part I: System Requirements Models Part I: System Requirements Models Brief overview of system scope The existing LINKS system encompasses several areas including sales leads distribution, order processing and refunds, executive dashboards, and more. My system, for the sake of brevity and scope for this class, will only focus on lead distribution, lead processing, and customer management. Event table Event Trigger Source Use Case Response Destination Processing wants to Management New lead source Processing rep Define lead source Lead source create a lead source Processing Processing wants to Management enter a lead in New lead Processing rep Create new lead Lead Processing manually Marketers Processing wants to Management import a batch of Batch lead import Processing rep Import external leads Leads Processing leads Marketers Processing wants to Management New promotion Processing rep Define promotion Promotion create a promotion Processing Processing wants to New marketing Define marketing Management Processing rep Marketing campaign create a campaign campaign campaign Processing Processing wants to Batch assign lead Assign leads to lead Management classify leads to a Processing rep Categorized lead(s) paths path Marketers path Processing chooses Sales company Distribute leads to Leads assigned to sales company to Assign leads Processing rep management sales company sales company receive leads Marketers Sales company management wants Sales company Distribute leads to Leads assigned to Division management Assign leads to distribute leads to management division division Marketers divisions Division management Distribute leads to Leads assigned to Sales teams wants to distribute Assign leads Division management sales team sales team Marketers leads to teams Sales teamleaders want to assign leads Assign leads to Leads assigned to Assign leads Sales teamleaders Marketers to individual marketers marketers marketers Marketer follows up Upgrade/downgrade Lead with changed Marketers Lead properties Marketer on lead lead status status Sales teamleaders Time to archive Updated archived ‘End of day’ Archive inactive leads inactive leads leads list Any level of Management (any Customized lead Management (any management wants a Report request Generate lead report level) report level) lead report Any level of management wants a Management (any Generate marketer Customized marketer Management (any Report request report on certain level) report performance report level) marketer(s) CIS591: Analysis Report 3
    • Part I: System Requirements Models Event Trigger Source Use Case Response Destination Sales company management wants a Sales company Generate overall Master performance Sales company Report request report on overall management report report management performance Processing needs a Export leads Processing rep Export lead list Exported lead data Processing rep master list of leads Processing needs to Marketers add or change a Edit customer Processing rep Define customer Modified customer Management (any customer’s details level) Use case diagrams System Define lead source Create new lead Import external leads Define promotion Define marketing campaign Processing Assign leads to Rep lead path Distribute leads to sales company Export lead list Define customer 4 CIS591: Analysis Report
    • Part I: System Requirements Models System Modify lead status Marketer System Distribute leads to sales team Distribute leads to division Division Generate lead manager report Generate marketer report Sales manager Generate overall report Sales Assign leads to teamleader marketers CIS591: Analysis Report 5
    • Part I: System Requirements Models Domain model class diagram Domain Class Diagram Benjamin Kreeger Lead Source 1 companyName Product address productName 1 * city productSource * state productPrice Promotion zip productDescription promotionName country productPicture promotionSource phone 1..* 0..1 OrderDetails 0..1 orderID productID qty * * * Lead Order createDate Sales Company orderDate expireDate companyName orderCustomerID customerID address orderTotal sourceID city orderPaymentMethod promotionID 0..1 * state orderDueDate pipelineID zip orderPayDate salesCompanyID country 1 divisionID * phone * teamID isInternal marketerID managerID status 1 1 detail * * * 0..1 * Division Person Team divisionName firstName divisionID companyID lastName 0..1 teamLeaderID managerID address * city 1 1 1 1 state zip country phone 0..1 1 User Customer userid age maritalStatus 0..1 0..1 numChildren assetAmount 0..1 * 0..1 liabilityAmount Manager Team Leader Marketer Processing Rep managerType commissionRate commissionRate managerID teamID salesCompanyID 1 * * 6 CIS591: Analysis Report
    • Part I: System Requirements Models Use case descriptions Use Case Name: Assign leads to lead path Assign previously unassigned leads to a specific lead path Scenario: Processing representative wants to classify leads to a path. Triggering Event: After a batch import of leads, or new leads are imported by hand, there is Brief Description: often incomplete information about the leads that can easily be completed by a processing rep. This information includes the company, the buyer/ non-buyer pipeline, etc. A processing rep will pull up a list of unassigned leads and assign them each to lead paths (usually a batch at a time). Processing representative Actors: • Import external leads (batch import can lead to this use case) Related Use Cases: • Distribute leads to sales company (leads go to this use case) • Marketers Stakeholders: • All levels of management • Leads in the list must already exist in the system (and with incomplete Preconditions: information) • Lead(s) will have complete lead path information Postconditions: • Leads will be sent to assignment queue Flow of Events: Actor System 1) Processing rep visits assign leads 1.1) System renders lead path form to lead path form 2) Rep tags leads with company, 2.1) With each batch tagging, pipeline, etc. system will update leads in the database with the proper information 3) Rep will tag leads with all required 3.1) System will hide committed information and commit leads if they leads from the list are accurate 3.2) If all leads committed, user is prompted to return to menu 4) Rep can choose to return to menu • If rep chooses to return to menu, the system will render the main menu Exception page Conditions: CIS591: Analysis Report 7
    • Part I: System Requirements Models Use Case Name: Assign leads to marketers Assign team-assigned leads to individual marketers Scenario: Sales teamleaders want to assign leads to individual marketers Triggering Event: A sales teamleader will receive an email when they have new leads in their Brief Description: queue for assignment. They will log into the system, bring up their distribute leads page, and start assigning leads to their individual marketers. They can choose to manually pick leads, or automatically assign leads to marketers up to their limit. Sales teamleader Actors: • Assign leads to lead path Related Use Cases: • Distribute leads to sales team • Marketers Stakeholders: • Customers • Leads in the list must already exist in the system with complete details Preconditions: • Leads must already be assigned to a sales team • Leads will be assigned to marketers to follow up on them Postconditions: • Leads will no longer be available to assign to marketers Flow of Events: Actor System 1) Sales teamleader visits distribute 1.1) System checks team leader’s leads form credentials, renders “leads to marketers” form 2) Teamleader selects a batch of leads 3) Teamleader chooses marketer to 3.1) System updates leads in distribute them to, clicks commit database with chosen marketer 4) Manager distributes all leads to various marketers, leaves form • If a marketer already has maximum allocated leads, an error will be Exception displayed, and only the number of leads selected minus the ones over Conditions: marketer’s limit will be assigned 8 CIS591: Analysis Report
    • Part I: System Requirements Models Use Case Name: Create new lead Create new lead Scenario: Processing representative wants to enter a lead in manually. Triggering Event: A single sales lead comes into the office. The processing rep who handles Brief Description: the lead imports the relevant data into a form. This data typically includes a prospective customer’s name and contact information, as well as which marketing campaign it came in under. The lead is then placed into a queue for assignment, or to an incomplete queue for lead path assignment. Processing representative Actors: • Import external leads (a batch import of leads instead of a singular lead) Related Use Cases: • Assign leads to lead path (if leads have incomplete lead path info) • Distribute leads to sales company (goes into queue for this use case) • All levels of management Stakeholders: • Marketers • Lead source, promotion, and marketing campaigns must already exist Preconditions: before lead can be imported • Lead will be created and added to assignment queue / incomplete queue Postconditions: • If customer didn’t already exist in database, it will also be added Flow of Events: Actor System 1) Processing rep visits new lead form 1.1) System renders new lead form 2) Rep enters in relevant lead data 3) Rep submits new lead form 3.1) System validates input 3.2) Insert customer into database 3.3) Insert lead into database 3.4) Redirect to lead form 4) Rep sees lead form again • If rep doesn’t have some required information (customer, campaign), then Exception the form is redisplayed with notifications of problem fields Conditions: CIS591: Analysis Report 9
    • Part I: System Requirements Models Use Case Name: Distribute leads to division Distribute company-assigned leads to division Scenario: Sales company management wants to distribute leads to divisions. Triggering Event: As a sales company manager gets new leads in their distribution queue, Brief Description: they’ll get an email from the system stating new leads are available for them to distribute down to their divisions. They’ll log into the system, bring up their distribute leads page, and assign leads to their divisions. Sales company manager Actors: • Assign leads to lead path Related Use Cases: • Distribute leads to sales company • Distribute leads to sales team • Marketers Stakeholders: • Division management • Leads in the list must already exist in the system with complete details Preconditions: • Leads must already be assigned to a sales company • Leads will be assigned to division management for further assignment Postconditions: • Leads will no longer be available to assign to divisions Flow of Events: Actor System 1) Sales manager visits distribute 1.1) System checks manager’s leads form credentials, renders “leads to divisions” form 2) Manager selects a batch of leads 3) Manager chooses division to 3.1) System updates leads in distribute them to, clicks commit database with chosen division 4) Manager distributes all leads to various divisions, leaves form • If a division already has maximum allocated leads, an error will be Exception displayed, and only the number of leads selected minus the ones over Conditions: division limit will be assigned 10 CIS591: Analysis Report
    • Part I: System Requirements Models Use Case Name: Distribute leads to sales company Distribute unassigned leads to sales company Scenario: Processing representative chooses sales company to receive leads. Triggering Event: A sales company will have a number of new leads that they can accept per Brief Description: day. The processing rep will assign a subset of leads to a sales company so their management can push those leads out to divisions, teams, and so forth. The rep will bring up a form with all undistributed leads, and assign a max number of leads to a sales company. Processing representative Actors: Import external leads Related Use Cases: • Create new lead • Assign leads to lead path • Distribute leads to division • • Marketers Stakeholders: • Sales company management • Leads in the list must already exist in the system with complete details Preconditions: • Leads must not yet be assigned to any other sales company • Leads will be assigned to sales company for further assignment Postconditions: • Leads will no longer be available to assign to sales companies Flow of Events: Actor System 1) Processing rep visits distribute 1.1) System checks processing leads form rep’s credentials, renders “leads to sales companies” form 2) Rep selects a batch of leads 3) Rep chooses company to distribute 3.1) System updates leads in leads to, clicks commit database with chosen sales company 4) Rep distributes all leads to various sales companies, leaves form • If a division already has maximum allocated leads, an error will be Exception displayed, and only the number of leads selected minus the ones over Conditions: division limit will be assigned CIS591: Analysis Report 11
    • Part I: System Requirements Models Use Case Name: Distribute leads to sales team Distribute division-assigned leads to sales team Scenario: Division management wants to distribute leads to teams. Triggering Event: A division manager will get an email notification once there are new leads in Brief Description: their queue. They’ll log into the system, bring up their distribute leads page, and start assigning their leads to sales teamleaders. Division manager Actors: • Assign leads to lead path Related Use Cases: • Distribute leads to division • Assign leads to marketers • Marketers Stakeholders: • Sales teamleaders • Leads in the list must already exist in the system with complete details Preconditions: • Leads must already be assigned to a division • Leads will be assigned to sales teamleaders for further assignment Postconditions: • Leads will no longer be available to assign to sales teams Flow of Events: Actor System 1) Division manager visits distribute 1.1) System checks manager’s leads form credentials, renders “leads to sales team” form 2) Manager selects a batch of leads 3) Manager chooses team to 3.1) System updates leads in distribute them to, clicks commit database with chosen team 4) Manager distributes all leads to various sales teams, leaves form • If a sales team already has maximum allocated leads, an error will be Exception displayed, and only the number of leads selected minus the ones over Conditions: sales team’s limit will be assigned 12 CIS591: Analysis Report
    • Part I: System Requirements Models Use Case Name: Generate lead report Generate report of all leads in system Scenario: Any level of management wants a lead report. Triggering Event: A manager at any level may want a report on overall performance across Brief Description: leads. The manager will bring up the report section of the app, choose a lead report, specify the start and end dates, and the system will generate a report with information about leads followed during those times. Management (any level) Actors: • Generate marketer report Related Use Cases: • Generate marketer report • Marketers Stakeholders: • Any level of management • Leads must exist in the system and have some status attached to them Preconditions: • Lead report will be generated Postconditions: Flow of Events: Actor System 1) Manager logs into system, brings 1.1) System renders report form up report form 2) Manager chooses lead report, sets 2.1) System pulls up all leads for start and end date, clicks submit the specified timeframe, along with their details, and renders them in a report 2.2) System displays report 3) Manager views, prints, or saves the report Exception Conditions: CIS591: Analysis Report 13
    • Part I: System Requirements Models Use Case Name: Generate marketer report Generate specific marketer report Scenario: Any level of management wants a lead report. Triggering Event: A manager may want a report on a marketer’s performance that details Brief Description: sales made per day, average made per sale, among other information. The manager will bring up the report section of the app, choose a marketer report, choose the marketer, and the system will generate a report (extra customization for the report to be added at a later time). Management (any level) Actors: • Generate overall report Related Use Cases: • Generate lead report • Marketers Stakeholders: • Any level of management • Marketer must exist in the system Preconditions: • Marketer must have made at least one successful sales call • Marketer report will be generated Postconditions: Flow of Events: Actor System 1) Manager logs into system, brings 1.1) System renders report form up report form 2) Manager chooses marketer report, 2.1) System pulls up marketer’s chooses a marketer for the report, sales stats, renders them in a clicks submit report 2.2) System displays report 3) Manager views, prints, or saves the report • If marketer is new (hasn’t had a successful sales call), the system will alert Exception the user trying to render the report, and the user will have to choose Conditions: another marketer. 14 CIS591: Analysis Report
    • Part I: System Requirements Models Use Case Name: Upgrade or downgrade lead status Upgrade or downgrade lead status Scenario: Marketer follows up on sales lead. Triggering Event: A marketer will go down their list of leads assigned to them and make the Brief Description: sales calls. Depending on the status of the phone call (if the lead hung up, was busy, wasn’t home, etc), the marketer will change the status of that lead in the system. They’ll login to the system, visit their active leads, click on the lead they’re working on, and change the details of that lead. Marketer Actors: • Assign leads to marketer Related Use Cases: • Sales teamleaders Stakeholders: • Customers • Lead in the list must already exist in the system with complete details Preconditions: • Lead must already be assigned to a marketer • Lead will be modified with additional details on the prospective customer Postconditions: • Lead will either be active or inactive depending on status Flow of Events: Actor System 1) Marketer visits active leads page 1.1) System checks marketer’s credentials, renders their active leads in a list 2) Marketer selects current lead 2.1) System renders page with lead detail (editable) 3) Marketer follows up on lead and 3.1) System saves changes to lead updates lead information as in the database necessary, saves changes 4) Marketer returns to active leads 4.1) System renders marketer’s page active leads in a list Exception Conditions: Archive inactive leads At the end of each day, any lead that’s been marked inactive (that means the ‘customer’ has refused several attempts at a sale) will be archived into a history of leads, and hidden from view unless pulled up in a report. This should occur at 12:01 am, daily. Define customer A customer is a more generic term for an external person in the system, whether they’ve purchased goods from a lead source or not. They’re the person at the other end of the lead, CIS591: Analysis Report 15
    • Part I: System Requirements Models and who a marketer would contact. A customer will be defined when a lead is created, unless the customer already exists in the system. A customer can also be added by hand through the ‘define customer’ option in the system. In addition, a customer’s information can be edited by a processing representative manually if it happens to change. Define lead source A lead source is usually another company that’s selling a product and one that’s utilizing the company’s marketing services. In other words, they’re a source of product leads, or lead sources. When a processing representative wants to create a lead source in the system, they will log into the system and choose the ‘lead sources’ section. They’ll choose to either define a new lead source, or redefine an existing lead source. In either use case, they’ll supply the necessary information (company name, location, contact information, etc.), and save the changes. Define marketing campaign A marketing campaign is also set by the lead source of the product for the campaign; an example of a campaign would be an infomercial for a real estate investment program. In order to use leads for this marketing campaign, we’ll need to define it in our system. A processing representative will gather the information about the marketing campaign (typically supplied by the lead source), enter the system and choose to define a marketing campaign, and then enter in the necessary details. Similar steps would be followed for redefining an existing marketing campaign. Define promotion A promotion is set by a lead source (external company) for one of their products (for example, a promotion could be a real estate investment program). In order to use leads for this promotion, we’ll need to define it in our system. A processing representative will gather the information about the promotion, enter the system and choose to define a promotion, and then enter in the necessary details. Similar steps would be followed for redefining an existing promotion. Export lead list If a lead list ever needs to be exported (or a subset of leads to be exported) to an external sales company, it’s done in CSV format. This function will allow a processing representative take any choice of leads and export them, and the system will parse them into a CSV file to be saved. Generate overall report Sometimes a manager may want to pull up a report on how various sales divisions and teams are doing. The overall report will show performance details for each internal sales company, with breakdowns for each sales division, with breakdowns for each sales teams, and each marketer within those teams. Import external leads 16 CIS591: Analysis Report
    • Part I: System Requirements Models If a lead source supplies a list of sales leads for a certain promotion and marketing campaign in comma-separated value format, a processing representative will upload that file into the system under an ‘import leads’ section, and the system will parse the values from that file into leads. In some cases, this may lead to incomplete information. In that case, any leads missing information will be sent to a separate queue to be completed (assigning them to lead paths). System sequence diagrams (SSDs) Assign leads to lead path System Processing Rep Open lead path form Loop Tag leads with information and commit Refresh list CIS591: Analysis Report 17
    • Part I: System Requirements Models Assign leads to marketers System Sales teamleader Open lead distribution Loop Select batch of leads and marketer Commit changes Refresh list 18 CIS591: Analysis Report
    • Part I: System Requirements Models Create new lead System Processing rep Open new lead form Loop Enter in lead data Submit changes Return to lead form with confirmation CIS591: Analysis Report 19
    • Part I: System Requirements Models Distribute leads to division System Sales company mgr. Open lead distribution form Loop Select batch of leads and division Commit changes Refresh list 20 CIS591: Analysis Report
    • Part I: System Requirements Models Distribute leads to sales company System Processing rep Open lead distribution form Loop Select batch of leads and team Commit changes Refresh list CIS591: Analysis Report 21
    • Part I: System Requirements Models Distribute leads to sales team System Processing rep Open lead distribution form Loop Select batch of leads and sales company Commit changes Refresh list 22 CIS591: Analysis Report
    • Part I: System Requirements Models Generate lead report System Management Open report form Choose lead report Choose start & end date, submit Displays report CIS591: Analysis Report 23
    • Part I: System Requirements Models Generate marketer report System Management Open report form Choose marketer report Choose specific marketer, submit Displays report 24 CIS591: Analysis Report
    • Part I: System Requirements Models Upgrade or downgrade lead status System Marketer Open active leads page Choose current lead Update lead information and status, submit Redirect to active leads page Attribute definitions Basic attributes Name • An identifier, whether for a company, person, product, promotion, division, etc. Address • The number and street of a company or person. City • The location within a state for a company or person. State • The location within a country for a company or person. Zip • The postal code designating a location a company or person. Country • The largest-scoped location designation for a company or person. Phone • A telephone number to reach a company or person at. Price • The cost (to the customer) of a product. CIS591: Analysis Report 25
    • Part I: System Requirements Models Total • The total cost (to the customer) of an order. Description • The long-text summary detailing more about a product. Age • The age of a customer. Quantity • The amount of a product in an order. Detailed attributes Create date • The date a lead is created. Typically, this is the date the lead is entered into the system. Expire date • The date a lead expires. The default for this value is 30 days after its creation, although it can be changed. Order date • The date an order is created. Due date • The date that payment is due for an order. Pay date • The date that a payment is made on an order. Payment method • The type of payment a customer uses to pay for an order (cash, check, credit card, money order, etc.) Source • The external originating company for a promotion or a product. Picture • The path to an uploaded picture of a product. Is internal? • A true/false determination if the sales company is an internal one or not. Only internal sales companies will have leads in the system available for processing. Status • The current situation of a lead (expired, on hold, active, inactive). Detail • More information about a lead. This usually contains notes from a marketer regarding the customer’s investments, assets, liabilities, lifestyle, etc., obtained from the customer. Commission rate • The amount of commission a marketer/team leader is paid per sale. Manager Type • The type of manager, usually a position within a sales company or division. Marital status • A brief description of a customer’s marital status (married, single, divorced, widowed). Number of children • A brief description of the number of children a customer has (those under 18). 26 CIS591: Analysis Report
    • Part I: System Requirements Models Asset amount • A monetary amount detailing the amount of assets a customer might have. Liability amount • A monetary amount detailing the amount of liabilities a customer might have. CIS591: Analysis Report 27
    • Part II: Alternative Design Concepts and Recommendation Part II: Alternative Design Concepts & Recommendation Defining alternatives Alternatives for our system could be found by changing any number of variables about it. If we wanted to trade in-house development costs altogether in favor of paying a subscription to an external company, there are various CRM software packages available. These would make the system much larger in scope and have much greater automation out-of-the-box. This approach would also reduce the amount of internal implementation to be done, as it’s already an established service that we’d merely need to train on internally. If we wanted to reduce the scope of the system, we could trade in the chosen web application framework in favor of a few web forms written in whatever language we choose (PHP, Python, Perl, etc). This would also reduce automation, and web forms wouldn’t have the depth of the chosen framework. The approach could remain object-oriented, but procedural implementations would open up as well. Four feasible alternatives One alternative we could use in place of this system is going with Salesforce.com. There would be a subscription cost per-user per-year (Salesforce is a SaaS: software-as-a-service), and we would get a support contract with the company. It’s got broad coverage on a variety of platforms; after all, it’s a web-based platform with mobile clients as well (along with email integration). If we were to go with Salesforce, in-house development of the software would go away, and we’d be at the mercy of Salesforce as to what features would be implemented. Another similar alternative we could look at is Oracle Sales, another externally-developed CRM platform. It integrates with other Oracle applications, and it would run on in-house hardware. Oracle is known to be a firm force in the industry and would be around for a long time (in other words, reliability is almost definite). One alternative we could use in place of this system is to create a series of web forms written in another language (perhaps PHP) that interact with a database; this would utilize a very basic three-layer design pattern (the rendered HTML as presentation, the business-logic PHP scripts, and the back-end database, running MySQL, PostgreSQL, Oracle, etc.). Depending on the scope of the system, this could take us longer to implement, and would require us writing considerably more code; the end result, however, would likely be smaller in scope, and take around the same amount of time to build. The last alternative would be to alter company policy to allow only Windows PCs to access the existing system, and opt to not support mobile clients or Linux/Mac clients. At the current point in time, this would affect a small but growing portion of our staff (most have mobile clients with web browsers that could access the new system), but if we declare policy now that we will not support those clients, we could stick with our current C#.NET system and build on it, instead. 28 CIS591: Analysis Report
    • Part II: Alternative Design Concepts & Recommendation Recommended design alternative In reviewing several options for proceeding with our system, my recommendation would be to go with Salesforce.com. It seems to be a very powerful, easy, and flexible alternative to writing our own solution in house. If we chose to extend the functionality of Salesforce, we would either wait for Salesforce to release new features, or tap the existing Salesforce development community, which is already developing companion software that integrates with the service (each new extension would cost money, of course). CIS591: Analysis Report 29
    • Part III: Design & Implementation to Date Part III: Design & Implementation to Date You should have completed some prototyping, in this case probably to test the technology you are planning to use (prototyping for feasibility) as well as initial design ideas (prototyping for design details). You should also have completed the core functionality of your system. Technology & working environment I’m currently using a three-layer approach to developing my program. The Django framework utilizes object-oriented design in what it calls a MTV pattern, or model-template-view pattern. This is a minor redefinition of the MVC pattern, or the model-view-controller pattern. In Django, its views are the business logic, which submits data to templates, which are the presentation logic. Web browser URL controller Template layer View layer Model layer Database Marketer Open active leads page (/leads/marketer) Get active leads view Get active leads view Get active leads for marketer Get all active leads for marketer Marketer's active leads Marketer's active leads Template context for active leads Rendered active leads template Select active lead Get lead detail view Get lead detail view Get lead detail for lead #001 Get lead detail for lead #001 Lead #001 detail Lead #001 detail Template context for lead #001 Rendered lead detail template Update lead details, submit form Get update lead view Get update lead view Update lead #001 Update lead #001 Redirect to active leads template Template context for active leads Rendered active leads template As far as specific development technology and software, I’m doing all my work on my MacBook under OS X 10.5, using Python 2.6.1 and Django 1.1. My development database is a SQLite database, but the production database will be MySQL (for performance reasons). I’m writing all my code in TextMate (and some in Espresso), all my reports in Pages, all my presentations in Keynote, all my scheduling in Numbers, all my UML diagrams in OmniGraffle, and I’m using GitHub for my project’s code repository (http://github.com/kreeger/birdie). Implemented to date Screenshots / brief walkthrough To date, I’ve been implementing the marketer use case, upgrade/downgrade lead status, which is where a marketer pulls up a lead’s detail and updates it accordingly (and chooses to keep in active or move it to the inactive pile). I’ve got a marketer’s home page set up (really basic for now) that allows them to get to their lead queues (active leads, inactive leads, or expired leads). From there, the appropriate lead queue is displayed, and the marketer can easily switch between the queues. The marketer will then click on the lead and edit the status (upgrade/downgrade it) and add notes on the lead. Screenshots of those steps (in order) are shown below. 30 CIS591: Analysis Report
    • Part III: Design & Implementation to Date Database data Some database tables (in my SQLite development database) are shown below. LEADS_PERSON 1|Boyd|Kanenwisher|222 Susie Ln|Kearney|MO|64060|USA|816-628-6638 2|Len|Page|88 Northglen Rd|Provo|UT|38382|USA|837-356-2823 3|James|Phay|288 Southglen Dr|Salt Lake City|UT|89272|USA|827-363-5353 4|Cheryl|Johnson|326 Westglen Rd|Springfield|MO|65806|USA|924-384-9402 5|Zachary|Johnson|9293 East Terrace|Springfield|MO|65803|USA|984-848-4932 6|Richard|Shanks|23626 Sycamore Cir|Kearney|MS|64060|USA|816-628-3409 7|Chupa|Cabra|22 Goat Ln|Los Angeles|CA|90012|USA|939-303-0382 8|James|Jackson|262 Watchmaker Cir|Springfield|IL|03938|USA|892-839-4040 CIS591: Analysis Report 31
    • Part III: Design & Implementation to Date 9|Rick|Oriole|338 Bird Ln|Nashville|TN|39934|USA|828-384-9404 10|Mikey|Wilcox|22 Crestview Dr|St. Louis|MO|64832|USA|816-553-8943 11|Eric|Taylor|8736 Jackalope Ct|Louisville|KY|35367|USA|373-645-3735 12|Dan|Anders|837 Gerard Way|Gladstone|MO|64043|USA|816-353-5355 13|Mike|Neal|826 Fame Dr|Kearney|MO|64060|USA|816-894-6633 14|Ammon|Freestone|992 Rich Ct|Kearney|MO|64060|USA|816-783-9363 15|Benjamin|Kreeger|826 S Fort Ave|Springfield|MO|65806|USA|816-806-7096 16|Logan|Tepe|927 Fort Ave.|Springfield|MO|65806|USA|542-373-8453 17|Douglas|Riddle|7353 Jeerson St|Springfield|MO|65804|USA|815-238-3462 LEADS_USER 1|bkanenwisher 2|lpage 3|jphay 12|danders 13|mneal 14|afreestone 15|bkreeger 16|ltepe 17|driddle LEADS_LEADSOURCE 1|Bidfrog, LLC|629 E. 730th St|American Fork|UT|84003|USA|827-363-6383 2|Real Estate Millionaire|928 Book Rd|American Fork|UT|84003|USA|846-454-8494 3|eBay Wealth System, LLC|837 Receipt Dr|Salt Lake City|UT|84022|USA|836-455-7958 4|Risktakers, Inc.|363 Cli Blvd|Los Angeles|CA|90002|USA|837-464-5474 LEADS_PROMOTION 1|Bidfrog Online Ads|1 2|REM Online Ads|2 3|eBay Wealth Infomercial|3 4|Risktakers Mass Mailing|4 5|REM Mass Mailing|2 LEADS_SALESCOMPANY 1|National Marketing Resources, LLC|341 W Washington|Kearney|MO|64060|USA| 816-628-6060|1|1 2|Professional Marketing International|99 Canyon Dr|American Fork|UT|83482|USA| 338-833-7736|1|2 3|My eBiz|88 Canyon Dr|Provo|UT|83736|USA|736-535-3732|1|3 LEADS_DIVISION 1|Internet Sales, NMR|1|1 2|Internet Sales, PMI|2|2 3|Internet Sales, MeB|3|3 4|Real Estate Sales, NMR|1|1 5|Other Sales, MeB|3|3 LEADS_TEAM 2|1|14 3|1|13 4|1|12 LEADS_MANAGER 12|0.1 32 CIS591: Analysis Report
    • Part III: Design & Implementation to Date 13|0.05 14|0.1 LEADS_MARKETER 15|0.15|2 16|0.1|3 17|0.05|4 LEADS_LEAD 1|2009-03-30 16:35:39.161002|2009-04-13 21:50:30.261194|4|1|1|b|1|1|2|15|inactive|| 2|2009-03-30 16:39:07.886871|2009-04-13 21:46:08.141588|5|2|5|nb|1|1|2|15|active|| 3|2009-03-30 16:39:25.507449|2009-04-13 16:39:25.507394|6|4|4|nb|1|1|2|15|active|| 4|2009-03-30 16:39:41.502455|2009-04-13 16:39:41.502403|9|1|1|b|1|1|3|16|active|| 5|2009-03-30 16:39:56.664563|2009-04-13 16:39:56.664501|10|2|2|b|1|1|4|17|active|| 6|2009-03-30 16:40:12.931316|2009-04-13 16:40:12.931263|7|1|1|b|1|1|2|15|active|| 7|2009-03-30 16:40:59.848908|2009-04-13 21:51:58.245409|8|4|4|nb|1|1|2|15|expired|| Python/Django source My Python/Django source code for the project (used in the examples) is below. views.py from django.shortcuts import render_to_response, get_object_or_404 from django.http import HttpResponseRedirect from django.core.urlresolvers import reverse from birdie.leads.models import * def leads_list(request, userid, status): # Get user for that id marketer = get_object_or_404(Marketer, userid=userid) # Get leads for that marketer leads = Lead.objects.filter(marketer=marketer.id, status=status) count = leads.count() context = { 'user': marketer, 'leads': leads, 'status': status, 'count': count, } return render_to_response(quot;leads/leads.htmlquot;, context) def user_home(request, userid): user = get_object_or_404(Marketer, userid=userid) user.what = unicode(user.__class__.__name__) context = { 'user': user, } return render_to_response(quot;leads/home.htmlquot;, context) def lead_detail(request, userid, lead): lead = int(lead) user = get_object_or_404(Marketer, userid=userid) CIS591: Analysis Report 33
    • Part III: Design & Implementation to Date lead = get_object_or_404(Lead, id=lead) context = { 'lead': lead, 'user': user, } return render_to_response(quot;leads/lead_detail.htmlquot;, context) def lead_update(request, userid, lead): lead = int(lead) user = get_object_or_404(Marketer, userid=userid) lead = get_object_or_404(Lead, id=lead) oldstatus = lead.status lead.detail = request.POST['detail'] lead.status = request.POST['status'] lead.save() return HttpResponseRedirect(reverse('birdie.leads.views.leads_list', args=(user.userid,oldstatus,))) urls.py from django.conf.urls.defaults import * from birdie.settings import * from django.contrib import admin admin.autodiscover() # master urlpatterns urlpatterns = patterns('', (r'^admin/', include(admin.site.urls)), (r'^_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': (SITE_ROOT + '/ _media')}), ) # patterns from birdie... expect this one to get big urlpatterns += patterns('birdie.leads.views', (r'^main/$', 'main'), (r'^user/(?P<userid>w+)/(?P<status>w+)_leads$', 'leads_list'), (r'^user/(?P<userid>w+)/leads/(?P<lead>d+)/$', 'lead_detail'), (r'^user/(?P<userid>w+)/leads/(?P<lead>d+)/update/$', 'lead_update'), (r'^user/(?P<userid>w+)/$', 'user_home'), ) models.py from django.db import models from django.contrib.localflavor.us.models import USStateField, PhoneNumberField from birdie.leads.constants import * from birdie.settings import SITE_ROOT import datetime class Person(models.Model): first_name = models.CharField(max_length=50) last_name = models.CharField(max_length=50) address = models.CharField(max_length=100) 34 CIS591: Analysis Report
    • Part III: Design & Implementation to Date city = models.CharField(max_length=60) state = USStateField() zip_code = models.CharField(max_length=10) country = models.CharField(max_length=50, default='USA') phone = PhoneNumberField() def __unicode__(self): return u'%s %s' % (self.first_name, self.last_name) class Customer(Person): age = models.IntegerField(blank=True, null=True) marital_status = models.CharField(blank=True, max_length=20) num_children = models.IntegerField(blank=True, null=True) assets = models.DecimalField(max_digits=12, decimal_places=2, blank=True, null=True) liabilities = models.DecimalField(max_digits=12, decimal_places=2, blank=True, null=True) class User(Person): userid = models.CharField(blank=False, null=False, unique=True, max_length=16) class Manager(User): manager_type = models.CharField(max_length=50, choices=MANAGER_TYPES) class Teamleader(User): commission_rate = models.DecimalField(max_digits=5, decimal_places=2, default=COMMISSION_RATE) class LeadSource(models.Model): company_name = models.CharField(max_length=100) address = models.CharField(max_length=100) city = models.CharField(max_length=60) state = USStateField() zip_code = models.CharField(max_length=10) country = models.CharField(max_length=50) phone = PhoneNumberField() def __unicode__(self): return self.company_name class Promotion(models.Model): name = models.CharField(max_length=100) # Has to have a lead source! source = models.ForeignKey(LeadSource) def __unicode__(self): return self.name class SalesCompany(models.Model): company_name = models.CharField(max_length=100) address = models.CharField(max_length=100) city = models.CharField(max_length=60) state = USStateField() zip_code = models.CharField(max_length=10) country = models.CharField(max_length=50) CIS591: Analysis Report 35
    • Part III: Design & Implementation to Date phone = PhoneNumberField() is_internal = models.BooleanField(default=True) # Has to have a manager! manager = models.ForeignKey(Manager) def __unicode__(self): return self.company_name class Division(models.Model): name = models.CharField(max_length=100) # Has to have a sales company! company = models.ForeignKey(SalesCompany) # Has to have a manager! manager = models.ForeignKey(Manager) def __unicode__(self): return self.name class Team(models.Model): # Has to have a division! division = models.ForeignKey(Division) # Has to have a teamleader! teamleader = models.ForeignKey(Teamleader) def __unicode__(self): return u'Team %s' % (self.teamleader.last_name) class ProcessingRep(User): # Has to have a manager! manager = models.ForeignKey(Manager) # Doesn't need to belong to a sales company. sales_company = models.ForeignKey(SalesCompany, null=True) class Marketer(User): commission_rate = models.DecimalField(max_digits=5, decimal_places=2, default=COMMISSION_RATE) # Has to have a team! team = models.ForeignKey(Team) # The big one... class Lead(models.Model): # All foreign keys are optional (they can be filled in later), thus # the 'null=True' argument create_date = models.DateTimeField(auto_now_add=True) expire_date = models.DateTimeField(blank=True, null=True) customer = models.ForeignKey(Customer, null=True, blank=True) source = models.ForeignKey(LeadSource, null=True, blank=True) promotion = models.ForeignKey(Promotion, null=True, blank=True) pipeline = models.CharField(blank=True, max_length=2, choices=PIPELINES) sales_company = models.ForeignKey(SalesCompany, null=True, blank=True) division = models.ForeignKey(Division, null=True, blank=True) team = models.ForeignKey(Team, null=True, blank=True) marketer = models.ForeignKey(Marketer, null=True, blank=True) status = models.CharField(max_length=8, choices=LEAD_STATUSES, default='active') change_date = models.DateTimeField(blank=True, null=True) 36 CIS591: Analysis Report
    • Part III: Design & Implementation to Date detail = models.TextField(blank=True) def save(self, *args, **kwargs): self.expire_date = (datetime.datetime.now() + datetime.timedelta(days=LEAD_EXPIRE)) super(Lead, self).save(*args, **kwargs) def __unicode__(self): return u'[%d] %s > %s > %s > %s > %s' % (self.id, self.source, self.promotion, self.pipeline, self.customer, self.create_date) class Product(models.Model): name = models.CharField(max_length=100) # Must have lead source! source = models.ForeignKey(LeadSource) price = models.DecimalField(max_digits=12, decimal_places=2) # Product needs a description. description = models.TextField() picture = models.ImageField(upload_to=(SITE_ROOT + quot;/_media/product_img/quot;), height_field=None, width_field=None, blank=True) def __unicode__(self): return self.name class Order(models.Model): date = models.DateTimeField(auto_now_add=True) # Must have associated order! customer = models.ForeignKey(Customer) # Associated with multiple products through OrderDetails products = models.ManyToManyField(Product, through='OrderDetail') total = models.DecimalField(max_digits=12, decimal_places=2, blank=True, null=True) payment_method = models.CharField(max_length=10, choices=PAYMENT_METHODS) due_date = models.DateTimeField(blank=True) pay_date = models.DateTimeField(blank=True, null=True) def __unicode__(self): return u'%s, %s' % (self.customer, self.date) def save(self, *args, **kwargs): self.due_date = (datetime.datetime.now() + datetime.timedelta(days=ORDER_DUE)) super(Order, self).save(*args, **kwargs) class OrderDetail(models.Model): # Must have an order and a product! order = models.ForeignKey(Order) product = models.ForeignKey(Product) quantity = models.DecimalField(max_digits=12, decimal_places=2) def __unicode__(self): return u'%s / %s (%F)' % (self.order, self.product, self.quantity) CIS591: Analysis Report 37
    • Part III: Design & Implementation to Date HTML template source My HTML source (the template source code) is below. index.html <!DOCTYPE html PUBLIC quot;-//W3C//DTD XHTML 1.1//ENquot; quot;http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtdquot;> <html xmlns=quot;http://www.w3.org/1999/xhtmlquot;> <head> <meta http-equiv=quot;Content-typequot; content=quot;text/xhtml; charset=utf-8quot; /> <title>Birdie :: {% block title %}{% endblock %}</title> <link rel=quot;stylesheetquot; href=quot;/_media/css/screen.cssquot; type=quot;text/cssquot; /> </head> <body> {% include 'includes/header.html' %} <div id=quot;contentquot;> <div id=quot;breadcrumbquot;> <p class=quot;rightquot;>{% block breadcrumb_right %}{% endblock %}</p> <p>{% block breadcrumb %}{% endblock %}</p> </div> {% block main %} {% endblock %} <div id=quot;subnavquot;> <p class=quot;rightquot;>{% block subnav_right %}{% endblock %}</p> <p>{% block subnav %}{% endblock %} </div> </div> {% include 'includes/footer.html' %} </body> </html> header.html <div id=quot;headquot;> <div id=quot;wrapquot;> <p>Welcome, <a href=quot;/user/{{ user.userid }}quot;>{{ user.first_name }}</a>. <a href=quot;/ user/{{ user.userid }}/logoutquot;>Logout?</a></p> <h1><a href=quot;/mainquot;><img src=quot;/_media/images/logo.pngquot; /></a></h1> </div> </div> footer.html <div id=quot;footerquot;> <h4>Copyright 2009 Kreeger Studios.</h4> </div> home.html {% extends quot;index.htmlquot; %} {% block title %} {{ user.first_name }} {{ user.last_name }} 38 CIS591: Analysis Report
    • Part III: Design & Implementation to Date {% endblock %} {% block breadcrumb_right %} breadcrumb_right {% endblock %} {% block breadcrumb %} <a href=quot;/mainquot;>Home</a> > {{ user.first_name }} {{ user.last_name }} ({{ user.what }}) {% endblock %} {% block main %} <div class=quot;homequot;> <ul> {% ifequal user.what 'Marketer' %} <li><a href=quot;active_leadsquot;>My Active Leads</a></li> <li><a href=quot;inactive_leadsquot;>My Inactive Leads</a></li> <li><a href=quot;expired_leadsquot;>My Expired Leads</a></li> {% endifequal %} {% ifequal user.what 'Manager' %} <li>Manager's links coming soon.</li> {% endifequal %} {% ifequal user.what 'ProcessingRep' %} <li>Processing rep's links coming soon.</li> {% endifequal %} {% ifequal user.what 'Teamleader' %} <li><a href=quot;active_leadsquot;>My Active Leads</a></li> {% endifequal %} </ul> </div> {% endblock %} leads.html {% extends quot;index.htmlquot; %} {% block title %} My {{ status }} leads {% endblock %} {% block breadcrumb_right %} You have {{ count }} {{ status }} leads. {% endblock %} {% block breadcrumb %} <a href=quot;/mainquot;>Home</a> > <a href=quot;/user/{{ user.userid }}quot;>{{ user.first_name }} {{ user.last_name }}</a> > My {{ status }} leads {% endblock %} {% block main %} <div class=quot;leadsquot;> <ul> {% for lead in leads %} <li><a href=quot;leads/{{ lead.id }}quot;>{{ lead.create_date|date:'n/j/Y, g:sA' }} > {{ lead.source }} > {{ lead.promotion }} > {% ifequal lead.pipeline 'b' %}Buyer{% else %}Non-buyer{% CIS591: Analysis Report 39
    • Part III: Design & Implementation to Date endifequal %} > {{ lead.customer }}</a></li> {% endfor %} </ul> </div> {% endblock %} {% block subnav_right %} {% ifnotequal status 'active' %}<a href=quot;active_leadsquot;>Active</a> {% else %}Active {% endifnotequal %} / {% ifnotequal status 'inactive' %}<a href=quot;inactive_leadsquot;>Inactive</a> {% else %}Inactive {% endifnotequal %} / {% ifnotequal status 'expired' %}<a href=quot;expired_leadsquot;>Expired</a> {% else %}Expired {% endifnotequal %} {% endblock %} lead_detail.html {% extends quot;index.htmlquot; %} {% block title %} Lead #{{ lead.id }} {% endblock %} {% block breadcrumb_right %} {{ lead.customer }} / {% ifequal lead.pipeline 'b' %}Buyer{% else %}Non-buyer{% endifequal %} / {{ lead.promotion }} / {{ lead.source }} {% endblock %} {% block breadcrumb %} <a href=quot;/mainquot;>Home</a> > <a href=quot;/user/{{ user.userid }}quot;>{{ user.first_name }} {{ user.last_name }}</a> > <a href=quot;/user/{{ user.userid }}/{{ lead.status }}_leadsquot;>My {{ lead.status }} leads</a> > Lead #{{ lead.id }} {% endblock %} {% block main %} <div class=quot;leads_detailquot;> <form action=quot;update/quot; method=quot;postquot;> <div id=quot;panel_rightquot;> <h3>Other details</h3> <textarea name=quot;detailquot; rows=quot;7quot; cols=quot;52quot;>{{ lead.detail }}</textarea> </div> <div id=quot;panel_leftquot;> <h2>{{ lead.customer }}</h2> <table> <tr><td class=quot;headquot;>Source:</td><td>{{ lead.source }}</td></tr> <tr><td class=quot;headquot;>Promotion:</td><td>{{ lead.promotion }}</ td></tr> <tr><td class=quot;headquot;>Pipeline: </td><td>{% ifequal lead.pipeline 'b' 40 CIS591: Analysis Report
    • Part III: Design & Implementation to Date %}Buyer{% else %}Non-buyer{% endifequal %}</td></tr> <tr><td class=quot;headquot;>Status: </td> <td><select id=quot;statusquot; name=quot;statusquot;> <option value=quot;activequot;{% ifequal lead.status 'active' %} selected{% endifequal %}> Active</option> <option value=quot;inactivequot;{% ifequal lead.status 'inactive' %} selected{% endifequal %}> Inactive</option> <option value=quot;expiredquot;{% ifequal lead.status 'expired' %} selected{% endifequal %}> Expired</option> </select></td></tr> </table> <p><input type=quot;submitquot; name=quot;submitquot; value=quot;Updatequot; id=quot;submitquot; /></p> </div> </form> </div> {% endblock %} {% block subnav_right %} {% endblock %} Database SQL schema code The SQL code for creating my databases is below. Lines for index creation have been omitted for brevity. BEGIN; CREATE TABLE quot;leads_personquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;first_namequot; varchar(50) NOT NULL, quot;last_namequot; varchar(50) NOT NULL, quot;addressquot; varchar(100) NOT NULL, quot;cityquot; varchar(60) NOT NULL, quot;statequot; varchar(2) NOT NULL, quot;zip_codequot; varchar(10) NOT NULL, quot;countryquot; varchar(50) NOT NULL, quot;phonequot; varchar(20) NOT NULL ) ; CREATE TABLE quot;leads_customerquot; ( quot;person_ptr_idquot; integer NOT NULL PRIMARY KEY REFERENCES quot;leads_personquot; (quot;idquot;), quot;agequot; integer, quot;marital_statusquot; varchar(20) NOT NULL, quot;num_childrenquot; integer, quot;assetsquot; decimal, quot;liabilitiesquot; decimal ) ; CREATE TABLE quot;leads_userquot; ( quot;person_ptr_idquot; integer NOT NULL PRIMARY KEY REFERENCES quot;leads_personquot; (quot;idquot;), quot;useridquot; varchar(16) NOT NULL UNIQUE ) CIS591: Analysis Report 41
    • Part III: Design & Implementation to Date ; CREATE TABLE quot;leads_managerquot; ( quot;user_ptr_idquot; integer NOT NULL PRIMARY KEY REFERENCES quot;leads_userquot; (quot;person_ptr_idquot;), quot;manager_typequot; varchar(50) NOT NULL ) ; CREATE TABLE quot;leads_teamleaderquot; ( quot;user_ptr_idquot; integer NOT NULL PRIMARY KEY REFERENCES quot;leads_userquot; (quot;person_ptr_idquot;), quot;commission_ratequot; decimal NOT NULL ) ; CREATE TABLE quot;leads_leadsourcequot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;company_namequot; varchar(100) NOT NULL, quot;addressquot; varchar(100) NOT NULL, quot;cityquot; varchar(60) NOT NULL, quot;statequot; varchar(2) NOT NULL, quot;zip_codequot; varchar(10) NOT NULL, quot;countryquot; varchar(50) NOT NULL, quot;phonequot; varchar(20) NOT NULL ) ; CREATE TABLE quot;leads_promotionquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;namequot; varchar(100) NOT NULL, quot;source_idquot; integer NOT NULL REFERENCES quot;leads_leadsourcequot; (quot;idquot;) ) ; CREATE TABLE quot;leads_salescompanyquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;company_namequot; varchar(100) NOT NULL, quot;addressquot; varchar(100) NOT NULL, quot;cityquot; varchar(60) NOT NULL, quot;statequot; varchar(2) NOT NULL, quot;zip_codequot; varchar(10) NOT NULL, quot;countryquot; varchar(50) NOT NULL, quot;phonequot; varchar(20) NOT NULL, quot;is_internalquot; bool NOT NULL, quot;manager_idquot; integer NOT NULL REFERENCES quot;leads_managerquot; (quot;user_ptr_idquot;) ) ; CREATE TABLE quot;leads_divisionquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;namequot; varchar(100) NOT NULL, quot;company_idquot; integer NOT NULL REFERENCES quot;leads_salescompanyquot; (quot;idquot;), quot;manager_idquot; integer NOT NULL REFERENCES quot;leads_managerquot; (quot;user_ptr_idquot;) ) ; CREATE TABLE quot;leads_teamquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;division_idquot; integer NOT NULL REFERENCES quot;leads_divisionquot; (quot;idquot;), quot;teamleader_idquot; integer NOT NULL REFERENCES quot;leads_teamleaderquot; (quot;user_ptr_idquot;) ) ; CREATE TABLE quot;leads_processingrepquot; ( quot;user_ptr_idquot; integer NOT NULL PRIMARY KEY REFERENCES quot;leads_userquot; (quot;person_ptr_idquot;), 42 CIS591: Analysis Report
    • Part III: Design & Implementation to Date quot;manager_idquot; integer NOT NULL REFERENCES quot;leads_managerquot; (quot;user_ptr_idquot;), quot;sales_company_idquot; integer REFERENCES quot;leads_salescompanyquot; (quot;idquot;) ) ; CREATE TABLE quot;leads_marketerquot; ( quot;user_ptr_idquot; integer NOT NULL PRIMARY KEY REFERENCES quot;leads_userquot; (quot;person_ptr_idquot;), quot;commission_ratequot; decimal NOT NULL, quot;team_idquot; integer NOT NULL REFERENCES quot;leads_teamquot; (quot;idquot;) ) ; CREATE TABLE quot;leads_leadquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;create_datequot; datetime NOT NULL, quot;expire_datequot; datetime, quot;customer_idquot; integer REFERENCES quot;leads_customerquot; (quot;person_ptr_idquot;), quot;source_idquot; integer REFERENCES quot;leads_leadsourcequot; (quot;idquot;), quot;promotion_idquot; integer REFERENCES quot;leads_promotionquot; (quot;idquot;), quot;pipelinequot; varchar(2) NOT NULL, quot;sales_company_idquot; integer REFERENCES quot;leads_salescompanyquot; (quot;idquot;), quot;division_idquot; integer REFERENCES quot;leads_divisionquot; (quot;idquot;), quot;team_idquot; integer REFERENCES quot;leads_teamquot; (quot;idquot;), quot;marketer_idquot; integer REFERENCES quot;leads_marketerquot; (quot;user_ptr_idquot;), quot;statusquot; varchar(8) NOT NULL, quot;change_datequot; datetime, quot;detailquot; text NOT NULL ) ; CREATE TABLE quot;leads_productquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;namequot; varchar(100) NOT NULL, quot;source_idquot; integer NOT NULL REFERENCES quot;leads_leadsourcequot; (quot;idquot;), quot;pricequot; decimal NOT NULL, quot;descriptionquot; text NOT NULL, quot;picturequot; varchar(100) NOT NULL ) ; CREATE TABLE quot;leads_orderquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;datequot; datetime NOT NULL, quot;customer_idquot; integer NOT NULL REFERENCES quot;leads_customerquot; (quot;person_ptr_idquot;), quot;totalquot; decimal, quot;payment_methodquot; varchar(10) NOT NULL, quot;due_datequot; datetime NOT NULL, quot;pay_datequot; datetime ) ; CREATE TABLE quot;leads_orderdetailquot; ( quot;idquot; integer NOT NULL PRIMARY KEY, quot;order_idquot; integer NOT NULL REFERENCES quot;leads_orderquot; (quot;idquot;), quot;product_idquot; integer NOT NULL REFERENCES quot;leads_productquot; (quot;idquot;), quot;quantityquot; decimal NOT NULL ) ; COMMIT; CIS591: Analysis Report 43
    • Part III: Design & Implementation to Date Initial menu hierarchy Below is the initial menu hierarchy for the system; not all users will have these options. It may be expanded on in future iterations. External Company Management • Add new lead source ‣ View existing lead sources ‣ Add new promotion ‣ View existing promotions ‣ Internal Company Management • Add new sales company ‣ View existing sales companies ‣ Add new division ‣ View existing divisions ‣ Add new team ‣ View existing teams ‣ Add new marketer ‣ View existing marketers ‣ Leads Management • Add new lead ‣ Import leads ‣ Export leads ‣ Distribute leads ‣ View my leads ‣ Customer Management • Add new customer ‣ View existing customers ‣ Order Management • Add new order ‣ View existing orders ‣ Reports • Generate lead report ‣ Generate marketer report ‣ Generate overall report ‣ System reports The following are mockups of what reports would look like in Birdie. 44 CIS591: Analysis Report
    • Part III: Design & Implementation to Date This first report is the lead report (from the generate lead report use case). It’s a report that shows overall lead statistics for a given time frame (I’ve chosen 9/1 to 9/30, the whole month of September). It shows information about how many leads were upgraded to accounts, how many were downgraded to inactive leads, and how many went expired. A graph could also be shown on the right-hand side visually detailing lead numbers for each day. CIS591: Analysis Report 45
    • Part III: Design & Implementation to Date This second report is a mockup of the lead detail report. A marketer will get this report whenever they bring up a certain lead in their list. This is the only report I’ve been implementing so far, and the results, shown in the previous section, can be seen below (it’s a work in progress). 46 CIS591: Analysis Report
    • Part IV: Project Monitoring / Reporting to Date Part IV: Project Monitoring / Reporting to Date Week # Actual Hours Hours Activities Worked 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Allotted Business modeling Understanding the business environment 2 2 1 1 Research problems with current system 1 1 1 Identify stakeholders 1 1 1 Determine integration with other systems Understand new system’s place with existing system 2 2 2 architecture Create the system vision 2 2 1 1 Identify system objectives 2 2 1 1 Determine system capabilities 2 2 1 1 Identify benefits Create business models 1 1 1 Create organizational chart 2 2 1 1 Create sales lead workflow model 2 2 1 1 Create computing infrastructure diagram 2 2 1 1 Create marketer lead processing workflow model Requirements Gather detailed information 3 3 1 2 Gather existing documentation on work processes 4 4 2 2 Review existing LINKS system 2 2 1 1 Get information about desired reports 3 3 2 1 Observe users of current LINKS system Define functional requirements 7 8 2 3 3 Write detailed use case descriptions 2 3 3 Create use case diagram(s) 2 6 2 2 2 Create problem domain class diagram 7 6 3 3 Create interaction diagrams Define nonfunctional requirements 1 1 1 Define security requirements 1 1 1 Define reliability requirements 2 1 1 Define technological requirements 2 1 1 Define usability requirements Prioritize requirements 2 2 1 1 Determine core requirements 2 2 1 1 Plan other requirements per iteration 1 1 1 Set aside some requirements for future releases Develop user interface dialogs 8 6 2 2 2 Create storyboards for each use case 1 1 1 Determine color scheme Create mockups for overall site design (desktop 3 3 1 2 browsers) 3 0 Create mockups for mobile site design Evaluate requirements with users 4 4 2 2 Interview users regarding requirements 2 2 2 Revise requirements based on interviews 1 1 1 Remove unnecessary requirements Design CIS591: Analysis Report 47
    • Part IV: Project Monitoring / Reporting to Date Week # Actual Hours Hours Activities Worked 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Allotted Design the support services architecture and deployment environment 2 2 1 1 Plan for server operating systems 2 2 2 Design internal site access vs. external site access 1 0 Determine periodic system upgrade plan Design the software architecture 5 5 4 1 Establish model-template-controller components 3 0 Design package diagrams Design use case realizations 4 0 Create design class diagram 8 1 1 Create expanded sequence/interaction diagrams 40 9 3 2 4 Implement core use cases 20 2 1 1 Implement non-core use cases Design the database 2 2 1 1 Finalize domain class diagram 2 2.5 1 2 Use domain class diagram to define schema 2 2 2 Specify relationships between tables 1 1 1 Determine if integration with other DBs is necessary Design the system and user interfaces 2 0 Markup storyboards as necessary 20 4 1 2 1 Define Django templates 10 2 1 1 Design reports and forms 2 2 1 1 Choose system fonts Determine links and integrations to other systems if 1 0 necessary Design the system security and controls 2 2 1 1 Determine security groups and users 2 0 Determine access levels for each group 2 0 Determine system administrators 4 0 Design login area 2 0 Set an encryption level Implementation Build software components 40 3 2 1 Write view logic 10 9 1 3 1 2 1 1 Write models 20 3 2 1 Write presentation templates 10 6 1 1 1 1 1 1 Write URL configurations 5 4 1 1 1 1 Write settings file Integrate software components 5 0 Upload changes from test server to production server Testing Define and conduct unit testing 4 0 Define unit tests to be done 4 0 Carry out unit tests on core system functions 2 0 Carry out unit tests on extra features 4 0 Carry out unit tests on system security Define and conduct integration testing Define integration tests to be done (core functions must 4 0 always work) 48 CIS591: Analysis Report
    • Part IV: Project Monitoring / Reporting to Date Week # Actual Hours Hours Activities Worked 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Allotted Carry out integration testing on each part of system as 4 0 it’s built Define and conduct usability testing 2 0 Compare storyboards with actual system interfaces 2 0 Determine ease-of-use with users Define and conduct user acceptance testing 12 0 6 0 Have users test core functions for acceptance 6 0 Have users test extra features for acceptance Deployment Acquire hardware and system software 2 0 Download server operating system 1 0 Download MySQL Server 1 0 Download Django framework 4 0 Obtain server hardware Package and install components 2 0 Install server OS on hardware 1 0 Install MySQL Server on server 1 0 Install Django framework on top of Python 2 0 Install all upgrades as necessary 1 0 Setup Apache with mod_python Train users 10 0 Develop training documentation for system 1 0 Distribute training documentation 5 0 Implement documentation within system 5 0 Hands-on training sessions with users Convert and initialize data 2 0 Import needed geographical data 2 0 Import initial batch of leads 2 0 Add users and security groups to the system Project Management Evaluate the project’s scope and risk 4 4 2 2 Determine project scope with use case list 2 2 2 Create problem domain class list 2 2 2 Determine project risk 2 2 2 Identify any possible threats to progress of project Confirm the project’s feasibility 2 2 2 Calculate net present value 2 2 2 Calculate rate of return on project 2 2 2 List costs per year of system 2 2 2 Develop payback analysis 1 1 1 Complete feasibility study section of planning report Develop the project and iteration schedules 6 6 4 2 List out all tasks as required by project 1 1 1 Discuss direction of project schedule with Dr. Satzinger 2 2 1 1 Determine tasks to be done per iteration Monitor and control the project’s iterations 2 1.1 0 0 0 0 0 0 0 0 0 0 0 Log time worked on all tasks 2 0.9 0 0 0 0 0 0 0 0 0 Keep a journal of everything done per day 2 1 1 Adjust project schedule / iterations as necessary CIS591: Analysis Report 49
    • Part IV: Project Monitoring / Reporting to Date Week # Actual Hours Hours Activities Worked 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Allotted 1 0.1 Develop periodic deliverable reports for Dr. Satzinger 0 Configuration and Change Management Develop change control procedures 2 1.1 0 0 0 0 0 0 0 0 0 0 0 Keep daily backups of all code and documentation 2 1 1 Develop plan for moving code to production server Manage models and software components 2 2 1 1 Update models as project evolves 2 0.4 0 0 0 0 Keep documentation on changes to code (versioning) Environment Select, configure, and understand the development tools 2 2 2 Establish programming software (obtain and install) Establish software needed for model creation, 2 2 1 1 diagramming 30 32 4 4 4 3 5 2 2 3 3 1 1 Learn Python / Django as needed Tailor the UP development process 4 4 2 1 1 Lay out and setup project deliverables 5 1 1 1 Meet with Dr. Satzinger as often as needed Determine which models to develop and include in 1 1 1 deliverables Provide technical support services 3 0 Answer questions of any test users Grand Total of Hours 493 221.1 50 CIS591: Analysis Report