UNPKG

poserver

Version:
662 lines (562 loc) 21.5 kB
/** * 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;