poserver
Version:
Server for JD Bot
662 lines (562 loc) • 21.5 kB
JavaScript
/**
* Created by tomdaley on 9/18/16.
*/
/**
* R E S P O N D E N T ' S O R I G I N A L A N S W E R
*/
var ParsedName = require('./../classes/clsParsedName');
/**
* @namespace
* @property {object} results
* @property {object} results.response
* @property {number} results.response.index
* @property {string} results.response.entity
*/
var ParsedAddress = require('./../classes/clsParsedAddress');
var Person = require('./../classes/clsPerson');
var prompts = require("./../const/prompts");
var Util = require("./../JdBotUtil");
var statemaps = require("./../const/statemaps");
var builder = require('botbuilder');
var ConfirmDialog = require("./ConfirmDialog");
var ChoiceDialog = require("./ChoiceDialog");
const library = new builder.Library('originalAnswer');
library.dialog('/',
[
function (session, args)
{
console.log(session.sessionState.callstack);
args = args || {};
var cause = "all";
var op = "";
//The "entities" property will be provided if we came here via a LUIS recognizer.
if (args.hasOwnProperty("entities"))
{
for (var e in args.entities)
{
var entity = args.entities[e];
switch (entity.type)
{
case "cause":
cause = entity.entity.toLocaleLowerCase().replace(/[^a-z0-9]/g, "");
if (cause.slice(-1, 1).toLocaleLowerCase() == "d")
cause = cause.slice(0, cause.length - 1);
break;
case "op":
op = entity.entity;
break;
}
}
session.userData.cause = cause;
if (op != "") session.userData.op = op;
}
session.beginDialog("qualifyJurisdiction:/");
},
function (session, args, next)
{
session.userData.selectedService = "originalAnswer/";
session.userData.stateMap = statemaps.originalanswer;
session.userData.state = "originalAnswer/";
session.send(prompts.sayOKOriginalAnswer);
next();
},
function (session)
{
session.beginDialog(Util.getNextDialog(session, {}));
}
]);
library.dialog("/getCaseInformation",
[
function (session)
{
console.log(session.sessionState.callstack);
session.userData.state = "originalAnswer/getCaseInformation";
session.beginDialog("getCauseNumber:/");
},
//See if we already have this case in our cases list
function (session, results, next)
{
Util.getCase(results.causeNumber, results.county, results.state, results.country)
.then(function (result)
{
console.log("got case information");
console.log(result);
if (result.length === 1)
{
session.beginDialog("/verifyCause", result[0]);
}
else
{
session.send("You're the first person to talk to me about this case.");
next();
}
})
.catch(function (reason)
{
session.send("I'll need to ask you a little more about this case.");
next();
});
},
function (session)
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
]
);
library.dialog("/verifyCause",
[
function (session, args)
{
var prompt = Util.getRandomElement(prompts.caseInformation);
var coa = Util.getMatterTypeDescription(args.matterType.id);
session.dialogData.case = args;
if (!coa.hasOwnProperty("description"))
{
session.endDialog();
}
else
{
prompt = session.gettext(prompt, {ctype: coa.description, petitioner: args.petitioner.fullName});
//builder.Prompts.confirm(session, prompt);
ConfirmDialog.confirm(session, {prompt: prompt});
}
},
function (session, results)
{
//TODO: Check for navigation
if (results.response)
{
for (cidx in session.dialogData.case)
{
session.userData.case[cidx] = session.dialogData.case[cidx];
}
console.log("/verifyCause");
console.log(session.userData.case);
}
else
{
session.send("Let me ask you a little more about this case.");
}
session.endDialog();
}
]);
library.dialog("/getMatterType",
[
function (session)
{
session.userData.state = "originalAnswer/getMatterType";
//Move on if we already have the matter type
if (session.userData.case.hasOwnProperty("matterType"))
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
//Otherwise, get the matter type.
var caseTypes;
if (prompts.causes.hasOwnProperty(session.userData.cause))
{
caseTypes = prompts.causes[session.userData.cause];
}
else
{
caseTypes = prompts.causes.all;
}
session.dialogData.caseTypes = caseTypes;
//builder.Prompts.choice(session, prompts.askCaseType, Object.keys(caseTypes),
// session.userData.config.PromptChoiceOptions);
ChoiceDialog.choice(session, prompts.askCaseType, Object.keys(caseTypes));
}
},
function (session, results, next)
{
//TODO: Check for Navigation
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
session.userData.case.matterTypeDescription = results.response.entity;
session.userData.case.matterType = session.dialogData.caseTypes[results.response.entity];
}
next();
},
function (session)
{
session.replaceDialog(Util.getNextDialog(session, session.userData.lastResults));
}
]);
library.dialog("/getSpouseName",
[
function (session, results, next)
{
session.userData.state = "originalAnswer/getSpouseName";
//If we already have a petitioner, move on.
if (session.userData.case.hasOwnProperty("petitioner"))
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
//Otherwise, prompt for a spouse name
if (session.userData.case.matterType.spouse)
builder.Prompts.text(session, prompts.askSpouseName);
else
next();
}
},
function (session, results, next)
{
if (session.userData.case.matterType.spouse)
{
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
session.userData.case.petitioner = {};
session.userData.case.petitioner.name = new ParsedName(results.response);
}
}
else
{
session.userData.lastResults = {};
}
next();
},
function (session)
{
session.replaceDialog(Util.getNextDialog(session, session.userData.lastResults));
}
]);
library.dialog("/getChildren",
[
//Prompt for child's name (or skip out if this is not a case involving children
function (session)
{
session.userData.state = "originalAnswer/getChildren";
//If we already have all the children, move along.
if (session.userData.case.hasOwnProperty("children"))
{
Util.getNextDialog(session, {});
}
else
{
//Otherwise, prompt for children
//If children are not relevant to this case type, move on . . .
if (!session.userData.case.matterType.children)
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
if (!session.userData.case.hasOwnProperty("childIndex"))
{
session.userData.case.childIndex = -1;
session.userData.case.children = [];
}
session.userData.case.childIndex++;
session.userData.case.children[session.userData.case.childIndex] = {};
console.log("@@@@@@@@@@ childIndex %d (%s)", session.userData.case.childIndex, prompts.ordinals[0]);
var prompt = session.gettext(prompts.askChildName, {"ordinal": prompts.ordinals[session.userData.case.childIndex]});
builder.Prompts.text(session, prompt);
}
}
},
//Process child's name (or stop word)
function (session, results, next)
{
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
var child = session.userData.case.children[session.userData.case.childIndex];
child.fullName = results.response;
child.name = (new ParsedName()).parseName(results.response);
var inferredGender = child.name.inferredGender;
if (inferredGender !== -1) child.gender = inferredGender;
next();
}
else
{
session.replaceDialog(Util.getNextDialog(session, session.userData.lastResults));
}
},
//Prompt for Gender - skip if we were able to infer gender above
function (session, results, next)
{
var child = session.userData.case.children[session.userData.case.childIndex];
if (child.hasOwnProperty("gender"))
{
next();
}
else
{
var prompt = session.gettext(prompts.askChildGender, {"cname": child.name.firstName});
//builder.Prompts.choice(session, prompt, prompts.gender, session.userData.config.PromptChoiceOptions);
ChoiceDialog.choice(session, prompt, prompts.gender);
}
},
//Process child's gender - skip if we already inferred the gender
function (session, results, next)
{
//TODO: Check for Navigation
var child = session.userData.case.children[session.userData.case.childIndex];
if (!child.hasOwnProperty("gender"))
{
child.gender = results.response.index;
}
next();
},
//Prompt for child's date of birth
function (session)
{
var child = session.userData.case.children[session.userData.case.childIndex];
var pronoun = prompts.possessivePronoun[child.gender];
var prompt = session.gettext(prompts.askChildBirthDate, {"cname": pronoun});
builder.Prompts.time(session, prompt);
},
//Process child's date of birth
function (session, results, next)
{
var child = session.userData.case.children[session.userData.case.childIndex];
child.birthDate = (builder.EntityRecognizer.resolveTime([results.response])).toJSON();
next();
},
//TODO: Add verification step - Will require breaking all of the above into individual dialogs
//Ask if there are other children
function (session)
{
var childlist = [];
var children = session.userData.case.children;
for (var i = 0; i < children.length - 1; i++)
{
childlist.push(children[i].name.firstName);
}
var childnames = childlist.join(", ");
if (children.length > 1) childnames += " " + prompts.and + " " + children[children.length - 1].name.firstName;
if (children.length === 1) childnames = children[0].name.firstName;
var prompt = session.gettext(prompts.askWhetherMoreChildrenToAdd, {"cnames": childnames});
//builder.Prompts.confirm(session, prompt, session.userData.config.PromptChoiceOptions);
ConfirmDialog.confirm(session, {prompt: prompt});
},
//Process response to whether there are more children to add
function (session, results, next)
{
//TODO: Check for navigation
if (results.response)
session.replaceDialog("originalAnswer:/getChildren");
else
next();
},
//If no more children to add, move on to the next prompt
function (session)
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
]);
/**
* Ask for Social Security Number. If we already have it, we can skip this prompt.
*/
library.dialog("/getSsn",
[
function (session)
{
session.userData.state = "originalAnswer/getSsn";
if (!session.userData.userProfile.hasOwnProperty("ids")) session.userData.userProfile.ids = {};
if (session.userData.userProfile.ids.hasOwnProperty("SSN"))
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
builder.Prompts.text(session, prompts.askSocialSecurityNumber);
}
},
function (session, results, next)
{
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
session.userData.userProfile.ids["SSN"] = {"id": results.response};
}
next();
},
function (session)
{
session.replaceDialog(Util.getNextDialog(session, session.userData.lastResults));
}
]);
library.dialog("/getDriversLicense",
[
function (session)
{
session.userData.state = "originalAnswer/getDriversLicense";
if (!session.userData.userProfile.hasOwnProperty("ids")) session.userData.userProfile.ids = {};
if (session.userData.userProfile.ids.hasOwnProperty("DL"))
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
builder.Prompts.text(session, prompts.askDriversLicense);
}
},
//Process response to driver's license number question
function (session, results, next)
{
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
session.userData.userProfile.ids["DL"] = {"id": results.response};
}
next();
},
//Ask for driver's license state
function (session)
{
builder.Prompts.text(session, prompts.askDriversLicenseState);
},
//Process response
function (session, results, next)
{
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
session.userData.userProfile.ids["DL"].state = results.response.toUpperCase();
}
next();
},
//Move on to next field.
function (session)
{
session.replaceDialog(Util.getNextDialog(session, session.userData.lastResults));
}
]);
library.dialog("/getFullAddress",
[
function (session)
{
session.userData.state = "originalAnswer/getFullAddress";
if (session.userData.hasOwnProperty("userProfile") &&
session.userData.userProfile.hasOwnProperty("address") &&
session.userData.userProfile.address.hasCompleteAddress)
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
var args = {
"prompt" : prompts.askYourFullAddress,
"invalidPrompt": prompts.askYourFullAddressReprompt
};
session.beginDialog("getAddress:/", args);
}
},
function (session, results)
{
if (results.status == "OK")
{
if (!session.userData.hasOwnProperty("userProfile")) session.userData.userProfile = new Person();
session.userData.userProfile.address = new ParsedAddress(results.response);
session.replaceDialog(Util.getNextDialog(session, results));
}
else
{
session.send(prompts.sayAddressValidationError);
session.endConversation(prompts.sayGoodbye);
}
}
]);
library.dialog("/getTelephone",
[
function (session)
{
session.userData.state = "originalAnswer/getTelephone";
if (session.userData.userProfile.hasOwnProperty("telephone"))
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
builder.Prompts.text(session, prompts.askPhoneNumber);
}
},
function (session, results, next)
{
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
session.userData.userProfile.telephone = results.response.replace(/[^0-9]/, "");
}
next();
},
function (session)
{
session.replaceDialog(Util.getNextDialog(session, session.userData.lastResults));
}
]);
library.dialog("/getFax",
[
function (session)
{
session.userData.state = "originalAnswer/getFax";
if (session.userData.userProfile.hasOwnProperty("fax"))
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
else
{
//builder.Prompts.confirm(session, prompts.askWhetherHasFaxNumber, session.userData.config.PromptChoiceOptions);
ConfirmDialog.confirm(session, {prompt: prompts.askWhetherHasFaxNumber});
}
},
function (session, results)
{
//TODO: Check for navigation
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
if (results.response)
{
builder.Prompts.text(session, prompts.askFaxNumber);
}
else
{
session.replaceDialog(Util.getNextDialog(session, {}));
}
}
},
function (session, results, next)
{
session.userData.lastResults = results;
if (Util.getStopWord(results.response) === null)
{
session.userData.userProfile.fax = results.response.replace(/[^0-9]/g, "");
}
next();
},
function (session)
{
session.replaceDialog(Util.getNextDialog(session, session.userData.lastResults));
}
]);
library.dialog("/saveOriginalAnswer",
[
function (session)
{
session.userData.state = "originalAnswer/saveOriginalAnswer";
Util.saveOriginalAnswer(session)
.then(function (result)
{
if (session.userData.hasOwnProperty("case"))
{
session.userData.case.queuedItemId = result.insertedId.toString();
}
})
.catch(function (reason)
{
console.error("originalAnswer:/saveOriginalAnswer: Error queueing answer");
console.error(reason);
});
session.send(prompts.thankYou);
session.userData.paymentAmount = session.userData.case.matterType.price;
session.replaceDialog(Util.getNextDialog(session, {}));
}
]);
module.exports = library;