Advertisement
Guest User

Internals of the NHS pay calculator 04/11/2015

a guest
Nov 4th, 2015
4,497
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var grade = {
  2.         "Foundation doctor year 1": {
  3.             0: 22636,
  4.             1: 24049,
  5.             2: 25461
  6.         },
  7.         "Foundation doctor year 2": {
  8.             0: 28076,
  9.             1: 29912,
  10.             2: 31748
  11.         },
  12.         "Specialty registrar core training": {
  13.             0: 30002,
  14.             1: 31838,
  15.             2: 34402,
  16.             3: 35952,
  17.             4: 37822,
  18.             5: 39693
  19.         },
  20.         "Specialty registrar full": {
  21.             0: 30002,
  22.             1: 31838,
  23.             2: 34402,
  24.             3: 35952,
  25.             4: 37822,
  26.             5: 39693,
  27.             6: 41564,
  28.             7: 43434,
  29.             8: 45304,
  30.             9: 47175
  31.         },
  32.         "GP registrar": {
  33.             0: 30002,
  34.             1: 31838,
  35.             2: 34402,
  36.             3: 35952,
  37.             4: 37822,
  38.             5: 39693,
  39.             6: 41564,
  40.             7: 43434,
  41.             8: 45304,
  42.             9: 47175
  43.         }
  44.     },
  45.     training = {
  46.         F1: 25500,
  47.         F2: 31600,
  48.         "Registrar 1": 37400,
  49.         "Registrar 2": 42500,
  50.         "Registrar 3": 48400,
  51.         "Registrar 4": 55e3
  52.     },
  53.     banding = {
  54.         "No banding": 0,
  55.         "Foundation doctor year one, five percent supplement": 5,
  56.         "In practice GP supplement": 45,
  57.         "Band 1A": 50,
  58.         "Band 1B": 40,
  59.         "Band 1C": 20,
  60.         "Band 2A": 80,
  61.         "Band 2B": 50,
  62.         "Band 3 (80% is the maximum level to which pay protection will be applied)": 100
  63.     },
  64.     programme_payout = {
  65.         "N/A": 0,
  66.         "Emergency medicine (ST4 and above)": {
  67.             supplement: 1500
  68.         },
  69.         "General Practice (in practice placements)": {
  70.             supplement: 8200
  71.         },
  72.         "Psychiatry (ST1 and above) ": {
  73.             supplement: 1500
  74.         }
  75.     },
  76.     flexible_payment = {
  77.         "Not applicable": 0,
  78.         "Clinical academics": -1,
  79.         "Training in public health": -1,
  80.         "For retraining/switching specialty": -1
  81.     },
  82.     rotas = {
  83.         1: {
  84.             ave_hrs: 40,
  85.             sat_pre: 0,
  86.             sun_pre: 0,
  87.             night_pre: 0,
  88.             avail_pre: 0
  89.         },
  90.         2: {
  91.             ave_hrs: 40,
  92.             sat_pre: 0,
  93.             sun_pre: 0,
  94.             night_pre: 0,
  95.             avail_pre: 0
  96.         },
  97.         3: {
  98.             ave_hrs: 45,
  99.             sat_pre: 0,
  100.             sun_pre: 0,
  101.             night_pre: 0,
  102.             avail_pre: 0
  103.         },
  104.         4: {
  105.             ave_hrs: 47.5,
  106.             sat_pre: .75,
  107.             sun_pre: 3.25,
  108.             night_pre: 0,
  109.             avail_pre: 0
  110.         },
  111.         5: {
  112.             ave_hrs: 45.1666666666667,
  113.             sat_pre: .5,
  114.             sun_pre: 2.16666666666667,
  115.             night_pre: 0,
  116.             avail_pre: 0
  117.         },
  118.         6: {
  119.             ave_hrs: 45.125,
  120.             sat_pre: .375,
  121.             sun_pre: 1.625,
  122.             night_pre: 0,
  123.             avail_pre: 0
  124.         },
  125.         7: {
  126.             ave_hrs: 45.3333333333333,
  127.             sat_pre: .666666666666667,
  128.             sun_pre: 2.33333333333333,
  129.             night_pre: 10.5,
  130.             avail_pre: 0
  131.         },
  132.         8: {
  133.             ave_hrs: 45.25,
  134.             sat_pre: .5,
  135.             sun_pre: 1.75,
  136.             night_pre: 7.875,
  137.             avail_pre: 0
  138.         },
  139.         9: {
  140.             ave_hrs: 45.2,
  141.             sat_pre: .4,
  142.             sun_pre: 1.4,
  143.             night_pre: 6.3,
  144.             avail_pre: 0
  145.         },
  146.         10: {
  147.             ave_hrs: 47.3333333333333,
  148.             sat_pre: 0,
  149.             sun_pre: 1.5,
  150.             night_pre: 3.5,
  151.             avail_pre: 4
  152.         },
  153.         11: {
  154.             ave_hrs: 46.75,
  155.             sat_pre: 0,
  156.             sun_pre: 1.125,
  157.             night_pre: 2.625,
  158.             avail_pre: 4
  159.         },
  160.         12: {
  161.             ave_hrs: 43.1,
  162.             sat_pre: .1,
  163.             sun_pre: .7,
  164.             night_pre: .7,
  165.             avail_pre: 2
  166.         }
  167.     };
  168. jQuery(document).ready(function(a) {
  169.     function e(a) {
  170.         return grade[a]
  171.     }
  172.  
  173.     function t() {
  174.         S = 0, N = 0, r(Math.round(l()), a(".existing_basicpay"), a("#graph-existing-basic-pay")), r(Math.round(c()), a(".existing_bandingpayment"), a("#graph-existing-banding-payment")), a(".existing_total").html(B(Math.round(h())))
  175.     }
  176.  
  177.     function n() {
  178.         T = 0, I = 0, i(Math.round(u()), a(".new_basicpay"), a("#graph-new-basic-pay")), i(Math.round(v()), a(".new_rosteredhours"), a("#graph-new-rostered-hours")), i(Math.round(d()), a(".new_saturdaypremium"), a("#graph-new-saturday-prem")), i(Math.round(g()), a(".new_sundaypremium"), a("#graph-new-sunday-prem")), i(Math.round(_()), a(".new_nightpremium"), a("#graph-new-night-prem")), i(Math.round(m()), a(".new_availability"), a("#graph-new-availablity")), i(Math.round(f()), a(".new_programmepremium"), a("#graph-new-programme-prem"));
  179.         var e = q();
  180.         0 == e ? i(Math.round(q()), a(".new_flexiblepremium"), a("#graph-new-pay-prem")) : a(".new_flexiblepremium").html("To be determined"), i(Math.round(b()), a(".new_payprotection"), a("#graph-new-pay-protection")), a(".new_total").html(B(Math.round(y())))
  181.     }
  182.  
  183.     function r(a, e, t) {
  184.         var n = o(),
  185.             r = parseFloat(N) / n * 100,
  186.             i = a / n * 100;
  187.         e.html(B(a)), t.css("height", "" + i + "%"), t.css("bottom", r + "%"), N = parseInt(N) + parseInt(a), i > 0 && (S = parseFloat(S) + parseFloat(i))
  188.     }
  189.  
  190.     function i(a, e, t) {
  191.         var n = o(),
  192.             r = parseFloat(I) / n * 100,
  193.             i = a / n * 100;
  194.         e.html(B(a)), t.css("height", i + "%"), t.css("bottom", r + "%"), I = parseInt(I) + parseInt(a), i > 0 && (T = parseFloat(T) + parseFloat(i))
  195.     }
  196.  
  197.     function o() {
  198.         var e = h(),
  199.             t = y(),
  200.             n = 0;
  201.         n = e > t ? e : t > e ? t : t;
  202.         var r = 1e4 * Math.ceil(n / 1e4),
  203.             i = r / 2;
  204.         return a("#chart-max-axis-label").html(B(r)), a("#chart-half-axis-label").html(B(i)), r
  205.     }
  206.  
  207.     function s() {
  208.         a(".change_basicpay").html(B(Math.round(x()))), a(".change_total").html(B(Math.round(w())))
  209.     }
  210.  
  211.     function p() {
  212.         var e = Math.round(10 * M()) / 10,
  213.             t = Math.round(10 * C()) / 10;
  214.         a(".changeper_basicpay").html(e + "%"), a(".changeper_total").html(t + "%")
  215.     }
  216.  
  217.     function l() {
  218.         var e = parseFloat(a("#qbasicpay").val()),
  219.             t = 1;
  220.         t || (t = 0);
  221.         var n = e / 100 * t,
  222.             r = n + e;
  223.         return isNaN(r) ? 0 : n + e
  224.     }
  225.  
  226.     function u() {
  227.         var e = a("#qtraining").val();
  228.         return "na" == e ? "N/A" : training[e]
  229.     }
  230.  
  231.     function c() {
  232.         if (a("#qbanding").val() && "0" != a("#qbanding").val()) {
  233.             var e = banding[a("#qbanding").val()],
  234.                 t = 80;
  235.             return e > t && (e = t), l() / 100 * e
  236.         }
  237.     }
  238.  
  239.     function h() {
  240.         return l() + c()
  241.     }
  242.  
  243.     function v() {
  244.         return a("#qrota").val() && "0" != a("#qrota").val() ? u() * (rotas[a("#qrota").val()].ave_hrs / 40 - 1) : void 0
  245.     }
  246.  
  247.     function d() {
  248.         return a("#qrota").val() && "0" != a("#qrota").val() ? u() / 40 * rotas[a("#qrota").val()].sat_pre / 3 : void 0
  249.     }
  250.  
  251.     function g() {
  252.         return a("#qrota").val() && "0" != a("#qrota").val() ? u() / 40 * rotas[a("#qrota").val()].sun_pre / 3 : void 0
  253.     }
  254.  
  255.     function _() {
  256.         return a("#qrota").val() && "0" != a("#qrota").val() ? u() / 40 * rotas[a("#qrota").val()].night_pre / 2 : void 0
  257.     }
  258.  
  259.     function m() {
  260.         return a("#qrota").val() && "0" != a("#qrota").val() ? u() / 100 * rotas[a("#qrota").val()].avail_pre : void 0
  261.     }
  262.  
  263.     function f() {
  264.         return a("#qprogramme").val() && "" != a("#qprogramme").val() ? programme_payout[a("#qprogramme").val()].supplement : 0
  265.     }
  266.  
  267.     function q() {
  268.         if ("F1" == a("#qtraining").val() || "F2" == a("#qtraining").val()) return 0;
  269.         if (a("#qflexible").val() && "" != a("#qflexible").val()) {
  270.             var e = flexible_payment[a("#qflexible").val()];
  271.             return u() / 100 * e
  272.         }
  273.         return 0
  274.     }
  275.  
  276.     function b() {
  277.         var a = u() + v() + d() + g() + _() + m() + f() + q();
  278.         return a < h() ? h() - a : 0
  279.     }
  280.  
  281.     function y() {
  282.         return u() + v() + d() + g() + _() + m() + f() + b()
  283.     }
  284.  
  285.     function x() {
  286.         return u() - l()
  287.     }
  288.  
  289.     function w() {
  290.         return y() - h()
  291.     }
  292.  
  293.     function M() {
  294.         return 100 * (u() / l() - 1)
  295.     }
  296.  
  297.     function C() {
  298.         return 100 * (y() / h() - 1)
  299.     }
  300.  
  301.     function F() {
  302.         if (Math.round(y()) == Math.round(h())) {
  303.             var e = T - S,
  304.                 t = a("#graph-existing-banding-payment").height(),
  305.                 n = t + e;
  306.             a("#graph-existing-banding-payment").height(n + "%")
  307.         }
  308.     }
  309.  
  310.     function j() {
  311.         a(".hideCell").removeClass("hideCell"), a("td:empty").addClass("hideCell")
  312.     }
  313.  
  314.     function B(a) {
  315.         var e = !1;
  316.         parseFloat(a) < 0 && (a = Math.abs(a), e = !0);
  317.         var t = a.toString().split(".");
  318.         t[0] = t[0].replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  319.         var n = "&pound;" + t.join(".");
  320.         return e && (n = "-" + n), n
  321.     }
  322.     var N = 0,
  323.         S = 0,
  324.         I = 0,
  325.         T = 0;
  326.     a("#qgrade").on("change", function(t) {
  327.         var n = e(a(this).val());
  328.         a("#qbasicpay").html('<option value="">Select</option>'), a("#qbasicpay").next(".question__options").empty(), a.each(n, function(e, t) {
  329.             a("#qbasicpay").append("<option>" + t + "</option>"), a("#qbasicpay").next(".question__options").append('<a class="question__option js-page-next" data-question="#qbasicpay" data-value="' + t + '">' + B(t) + "</a>")
  330.         })
  331.     }), a("select").on("change", function(a) {
  332.         t(), n(), s(), p(), F(), j()
  333.     }), a(".question").each(function() {
  334.         var e = a(this).append('<div class="question__options"></div>'),
  335.             t = e.find("select"),
  336.             n = t.find("option"),
  337.             r = e.find(".question__options");
  338.         n.each(function() {
  339.             var e = a(this);
  340.             r.append('<a class="question__option js-page-next" data-question="#' + t.attr("id") + '" data-value="' + e.val() + '">' + e.text() + "</a>")
  341.         })
  342.     }), a(".questions").on("click", ".question__option", function() {
  343.         a(this).siblings(".question__option--active").removeClass("question__option--active"), a(this).addClass("question__option--active");
  344.         var e = a(a(this).data("question"));
  345.         e.val(a(this).data("value")).trigger("change")
  346.     })
  347. }), jQuery(document).ready(function(a) {
  348.     function e() {
  349.         a("html, body").animate({
  350.             scrollTop: "0px"
  351.         })
  352.     }
  353.  
  354.     function t(e) {
  355.         var t = a("#toolbar-nav").find(".active");
  356.         "next" === e ? t.next().length && (t.removeClass("active"), t.next().addClass("active")) : t.prev().length && (t.removeClass("active"), t.prev().addClass("active"))
  357.     }
  358.  
  359.     function n(e) {
  360.         e.hasClass("question") ? (a("#questions").show(), a("#results").hide(), a("#toolbar-nav").show()) : e.hasClass("intro") ? (a("#calculator").hide(), a("#results").hide(), a("#intro").show()) : (a("#questions").hide(), a("#results").show(), a("#toolbar-nav").hide())
  361.     }
  362.  
  363.     function r(e) {
  364.         var t = e.data("title");
  365.         t && a("#toolbar-title").text(t)
  366.     }
  367.     a("#questiontraining-msg").hide(), a(document).on("click", ".js-page-next", function(i) {
  368.         var o = a(this),
  369.             s = o.closest(".js-page"),
  370.             p = a(s.data("next")),
  371.             l = p.data("prev");
  372.         if ("#qtraining" === o.data("question")) {
  373.             if ("na" === a("#qtraining").val()) return a("#questiontraining-msg").show(), e(), !1;
  374.             a("#questiontraining-msg").hide()
  375.         }
  376.         a(".js-page.active").removeClass("active"), p.addClass("active"), a(".js-page-prev").data("next", l), t("next"), n(p), r(p), e(), i.preventDefault()
  377.     }), a(document).on("click", ".js-page-prev", function(i) {
  378.         var o = a(this),
  379.             s = a(o.data("next")),
  380.             p = s.data("prev");
  381.         a(".js-page.active").removeClass("active"), s.addClass("active"), a(".js-page-prev").data("next", p), t("prev"), n(s), r(s), e(), i.preventDefault()
  382.     }), a(document).on("change", "#qrota", function(e) {
  383.         var t = a(this).val();
  384.         a(".rota").hide(), a("#rota-" + t).show()
  385.     }), a(".js-start").on("click", function() {
  386.         a(".js-page-prev").data("next", "#intro"), a("#intro").hide(), a("#calculator").show(), a("#question-grade").addClass("active")
  387.     })
  388. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement