Skip to content

Renewal Quote

Renewal Quote is the main working screen of the Policy Renewals application. Underwriting staff open it from the Renewal Queue for a policy that is approaching expiration and use it to review the quote the rating library has produced: the premium for each class code, the experience modifier, and the renewal effective date. The user can adjust individual premium lines, give a reason for the adjustment, save the quote, and issue the renewal offer to the employer. The action loads the quote for the policyNumber route value and returns a state view when none can be produced. From here the user returns to the queue, opens the quote history, or moves to the policy summary in the Policy Services Portal.

Route

Controller Action Verb URL Parameters View Layout
RenewalController Quote GET /Renewal/Quote/{policyNumber} policyNumber Views/Renewal/Quote.cshtml _Layout
RenewalController Quote POST /Renewal/Quote/{policyNumber} policyNumber, RenewalQuoteViewModel Views/Renewal/Quote.cshtml (redisplayed when validation fails) _Layout

Access

Requirement Declared on Effect
[SaifAuthorize(Roles = "Renewals.Read,Renewals.Underwriting")] BaseController Only users holding one of the two roles can open any action of a controller that derives from BaseController
[SaifAuthorize(Roles = "Renewals.Underwriting")] RenewalController.IssueOffer Only underwriting staff can issue a renewal offer
CanUserUpdate() RenewalController.Quote Returns true only for users in Renewals.Underwriting; when false, IsReadOnly is set, the grid shows no edit commands, and Save quote and Issue offer are hidden

Entry conditions

  • The user selects a policy in the Renewal Queue and follows the Open quote link, which passes policyNumber in the route.
  • The user opens a bookmarked or emailed URL of the form /Renewal/Quote/{policyNumber}.
  • The default route Home/Index redirects to the Renewal Queue, so the quote screen is never the application start page.
  • The action requires a policy number from the route or from WebContext. When neither supplies one, it returns the InvalidContext state view.

Fields

Field Binds to Control Purpose Validation
Policy number RenewalQuoteViewModel.PolicyNumber Html.DisplayFor Identifies the policy being renewed None; display only
Employer RenewalQuoteViewModel.EmployerName Html.DisplayFor Insured employer of record None; display only
Renewal effective date RenewalQuoteViewModel.EffectiveDate Kendo DatePicker (Html.Kendo().DatePickerFor) Start of the renewal term [Required] and [Remote("ValidateEffectiveDate", "Renewal")]; client-side yes
Experience modifier RenewalQuoteViewModel.ExperienceModifier Kendo NumericTextBox (Html.Kendo().NumericTextBoxFor) Modifier applied to the manual premium [Range(0.50, 2.50)]; client-side yes
Quote lines RenewalQuoteViewModel.QuoteLines Kendo Grid (Html.Kendo().Grid<QuoteLineViewModel>()) Calculated and adjusted premium for each class code QuoteLineViewModelValidator requires a non-negative adjusted premium; client-side no
Adjustment reason RenewalQuoteViewModel.AdjustmentReason Html.TextAreaFor Explains why any line differs from the calculated premium [StringLength(500)]; required by RenewalQuoteViewModelValidator when a reduction exceeds 25 percent; client-side no
Total premium RenewalQuoteViewModel.TotalPremium Html.DisplayFor, formatted as currency Sum of the adjusted line premiums None; display only
Save quote None <button type="submit"> btnSaveQuote Posts the adjusted quote Hidden when IsReadOnly
Issue offer None <button type="submit"> btnIssueOffer, in a form that posts to IssueOffer Issues the renewal offer for the saved quote Hidden when IsReadOnly

Operations

Operation Trigger Request Description Delegates to
load-quote Page load GET Renewal/Quote Reads the renewal quote for the policy number and populates the header fields and the quote lines grid GetRenewalQuote in SAIF.Policy.Services†
save-quote btnSaveQuote click POST Renewal/Quote Re-rates the adjusted quote lines and saves the quote, then redisplays the screen with the new total RecalculateRenewalPremium
issue-offer btnIssueOffer click POST Renewal/IssueOffer Issues the renewal offer to the employer and redirects to the Renewal Queue Renewal offer issuance
open-quote-help lnkQuoteHelp click GET Renewal/QuoteHelp Returns the quote help partial —

Dialogs and partials

Name Opens as Returned by Purpose
_QuoteHelp kendoWindow, content loaded from the action URL GET Renewal/QuoteHelp Explains each premium line type and the limits on adjusting a line

AJAX and grid actions

Request Kind Called by Returns
POST Renewal/QuoteLines_Read grid read quoteLinesGrid data source DataSourceResult of QuoteLineViewModel
POST Renewal/QuoteLines_Update grid update quoteLinesGrid inline edit DataSourceResult with the updated line, or model state errors
GET Renewal/ValidateEffectiveDate remote validator EffectiveDate field JSON true, or an error message string

Client-side behavior

  • Script module: Scripts/app/renewal/quote.js
  • quoteLinesGrid is a Kendo Grid with inline editing; after each QuoteLines_Update response the quoteViewModel kendo.observable view model recomputes totalPremium.
  • The EffectiveDate DatePicker uses the policy expiration date as its minimum and relies on jQuery unobtrusive validation for the remote check.
  • lnkQuoteHelp opens _QuoteHelp in a kendoWindow.
  • Failed grid requests raise a toastr notification.

States

State view Condition
NoQuote GetRenewalQuote returns no quote because the policy is outside its renewal window
InvalidContext No policy number can be resolved from the route or WebContext

Business rules

Rule ID Rule Enforcement Source
BR-SCR-001 The renewal effective date must be the day after the current policy expiration date ValidateEffectiveDate remote validator and RenewalQuoteViewModelValidator src/SAIF.Policy.Renewals.Web/Controllers/RenewalController.cs:131
BR-SCR-002 A quote line cannot be reduced by more than 25 percent of its calculated premium without an adjustment reason RenewalQuoteViewModelValidator src/SAIF.Policy.Renewals.Web/Validators/RenewalQuoteViewModelValidator.cs:22
BR-SCR-003 Only underwriting staff can issue a renewal offer [SaifAuthorize] on IssueOffer src/SAIF.Policy.Renewals.Web/Controllers/RenewalController.cs:98
BR-APP-002 A renewal quote is available only for a policy inside its renewal window NoQuote state view returned by Quote src/SAIF.Policy.Renewals.Web/Controllers/RenewalController.cs:58
Target Trigger Parameters
Renewal Queue Back to queue link; redirect after Issue offer None
Quote History History link policyNumber route parameter
Policy Summary in the Policy Services Portal Policy summary link policyNumber carried in the web context; the portal URL is held in the PolicyPortalUrl app setting

Screen flow diagram

flowchart TD
    A[Renewal Quote] -->|Back to queue or Issue offer| B[Renewal Queue]
    A -->|History| C[Quote History]
    A -->|Policy summary| D[Policy Summary in the Policy Services Portal]
    B -->|Open quote| A

[!NOTE] Statements marked with * are inferred from code patterns. Statements marked with ** could not be verified from available source. Statements marked with † are sourced from package documentation retrieved with the Legends CLI.

Sources

  • src/SAIF.Policy.Renewals.Web/Controllers/BaseController.cs
  • src/SAIF.Policy.Renewals.Web/Controllers/RenewalController.cs
  • src/SAIF.Policy.Renewals.Web/Views/Renewal/Quote.cshtml
  • src/SAIF.Policy.Renewals.Web/Views/Renewal/_QuoteHelp.cshtml
  • src/SAIF.Policy.Renewals.Web/Models/RenewalQuoteViewModel.cs
  • src/SAIF.Policy.Renewals.Web/Models/QuoteLineViewModel.cs
  • src/SAIF.Policy.Renewals.Web/Validators/RenewalQuoteViewModelValidator.cs
  • src/SAIF.Policy.Renewals.Web/Scripts/app/renewal/quote.js