ソースを参照

Merge branch 'dev' of rav.triplestart.com:jmudaka/stagfe2 into dev

= 3 年 前
コミット
5e4a801f2c
41 ファイル変更1583 行追加247 行削除
  1. 3 0
      app/Models/ClientPrimaryCoverage.php
  2. 1 2
      app/Models/Pro.php
  3. 14 0
      copy-js.sh
  4. 0 0
      js-dev/click-to-copy.js
  5. 0 0
      js-dev/dq.js
  6. 28 0
      js-dev/icd-autocomplete.js
  7. 0 0
      js-dev/mc-init.js
  8. 0 0
      js-dev/mc.js
  9. 0 0
      js-dev/option-list.js
  10. 0 0
      js-dev/pro-suggest.js
  11. 0 0
      js-dev/shortcut.js
  12. 0 0
      js-dev/show-on-click.js
  13. 0 0
      js-dev/stag-collapsible-card.js
  14. 0 0
      js-dev/stag-popup.js
  15. 0 0
      js-dev/stag-suggest.js
  16. 0 0
      js-dev/stag-table-filter.js
  17. 0 0
      js-dev/tsvToArray.js
  18. 1141 0
      js-dev/yemi.js
  19. 15 4
      minify.sh
  20. 14 0
      public/js/.gitignore
  21. 28 0
      public/js/icd-autocomplete copy.js
  22. 0 0
      public/js/yemi.js
  23. 2 2
      resources/views/app/generic-bills/add-bill-form/_default-script.blade.php
  24. 25 16
      resources/views/app/new-patient.blade.php
  25. 83 29
      resources/views/app/patient/coverage-status.blade.php
  26. 5 8
      resources/views/app/patient/note/dashboard_script.blade.php
  27. 2 0
      resources/views/app/patient/notes.blade.php
  28. 11 10
      resources/views/app/patient/primary-coverage-form.blade.php
  29. 20 9
      resources/views/app/patient/primary-coverage-manual-determination-commercial-modal.blade.php
  30. 13 7
      resources/views/app/patient/primary-coverage-manual-determination-medicaid-modal.blade.php
  31. 10 8
      resources/views/app/patient/primary-coverage-manual-determination-medicare-modal.blade.php
  32. 9 5
      resources/views/app/patient/primary-coverage-manual-determination-view-commercial.blade.php
  33. 9 5
      resources/views/app/patient/primary-coverage-manual-determination-view-medicaid.blade.php
  34. 9 5
      resources/views/app/patient/primary-coverage-manual-determination-view-medicare.blade.php
  35. 120 98
      resources/views/app/patient/primary-coverage-view.blade.php
  36. 9 26
      resources/views/app/patient/primary-coverage.blade.php
  37. 1 1
      resources/views/app/patient/segment-templates/chief_complaint/edit.blade.php
  38. 2 2
      resources/views/app/patient/segment-templates/disclaimers/edit.blade.php
  39. 1 1
      resources/views/app/patient/settings.blade.php
  40. 5 6
      resources/views/layouts/patient.blade.php
  41. 3 3
      routes/web.php

+ 3 - 0
app/Models/ClientPrimaryCoverage.php

@@ -67,4 +67,7 @@ class ClientPrimaryCoverage extends Model
     public function payer(){
         return $this->hasOne(Payer::class, 'id', 'commercial_payer_id');
     }
+    public function mcdPayer(){
+        return $this->hasOne(Payer::class, 'id', 'mcd_payer_id');
+    }
 }

+ 1 - 2
app/Models/Pro.php

@@ -57,8 +57,7 @@ class Pro extends Model
 
     public function isDefaultNA()
     {
-        // TODO are we using this?
-        return true; // $this->is_considered_for_dna;
+       return $this->is_considered_for_dna;
     }
 
     public function lastPayment() {

+ 14 - 0
copy-js.sh

@@ -0,0 +1,14 @@
+\cp js-dev/yemi.js public/js/yemi.js
+\cp js-dev/tsvToArray.js public/js/tsvToArray.js
+\cp js-dev/stag-table-filter.js  public/js/stag-table-filter.js
+\cp js-dev/stag-suggest.js  public/js/stag-suggest.js
+\cp js-dev/stag-popup.js  public/js/stag-popup.js
+\cp js-dev/stag-collapsible-card.js  public/js/stag-collapsible-card.js
+\cp js-dev/show-on-click.js  public/js/show-on-click.js
+\cp js-dev/shortcut.js  public/js/shortcut.js
+\cp js-dev/pro-suggest.js  public/js/pro-suggest.js
+\cp js-dev/option-list.js  public/js/option-list.js
+\cp js-dev/mc-init.js  public/js/mc-init.js
+\cp js-dev/mc.js  public/js/mc.js
+\cp js-dev/dq.js  public/js/dq.js
+\cp js-dev/click-to-copy.js  public/js/click-to-copy.js

+ 0 - 0
public/js/click-to-copy.js → js-dev/click-to-copy.js


+ 0 - 0
public/js/dq.js → js-dev/dq.js


+ 28 - 0
js-dev/icd-autocomplete.js

@@ -0,0 +1,28 @@
+(function() {
+
+    function init() {
+        let self = this;
+        $('[icd-autocomplete-code]:not([ac-initialized])').each(function() {
+            let elem = this, dynID = 'icd-' + Math.ceil(Math.random() * 1000000),
+                codeElem = $(this), descElem = $(this).closest('form').find('[icd-autocomplete-description]');
+            $(elem).attr('id', dynID);
+            new window.Def.Autocompleter.Search(dynID,
+                'https://clinicaltables.nlm.nih.gov/api/icd10cm/v3/search?sf=code,name&ef=name', {
+                    tableFormat: true,
+                    valueCols: [0],
+                    colHeaders: ['Code', 'Name'],
+                }
+            );
+            window.Def.Autocompleter.Event.observeListSelections(dynID, function() {
+                let autocomp = elem.autocomp, acData = autocomp.getSelectedItemData();
+                codeElem.val(acData[0].code).trigger('change');
+                descElem.val(acData[0].data['name']).trigger('change');
+                return false;
+            });
+            $(elem).attr('ac-initialized', 1);
+        });
+    }
+
+    addMCInitializer('icd-autocomplete', init);
+
+}).call(window);

+ 0 - 0
public/js/mc-init.js → js-dev/mc-init.js


+ 0 - 0
public/js/mc.js → js-dev/mc.js


+ 0 - 0
public/js/option-list.js → js-dev/option-list.js


+ 0 - 0
public/js/pro-suggest.js → js-dev/pro-suggest.js


+ 0 - 0
public/js/shortcut.js → js-dev/shortcut.js


+ 0 - 0
public/js/show-on-click.js → js-dev/show-on-click.js


+ 0 - 0
public/js/stag-collapsible-card.js → js-dev/stag-collapsible-card.js


+ 0 - 0
public/js/stag-popup.js → js-dev/stag-popup.js


+ 0 - 0
public/js/stag-suggest.js → js-dev/stag-suggest.js


+ 0 - 0
public/js/stag-table-filter.js → js-dev/stag-table-filter.js


+ 0 - 0
public/js/tsvToArray.js → js-dev/tsvToArray.js


+ 1141 - 0
js-dev/yemi.js

@@ -0,0 +1,1141 @@
+if (typeof focusOn == 'undefined') {
+    var focusOn = 'globalSearch';
+}
+
+var ajaxGoing = false;
+
+var showMask = function (_text = '') {
+    $('body').css('opacity', 0.6);
+    $('#mask').show();
+    if(!!_text) {
+        $('<div class="mask-text-addition" />').text('Initializing note. Please wait...').appendTo('body');
+    }
+}
+
+var hideMask = function () {
+    $('body').css('opacity', 1);
+    $('#mask').hide();
+    $('.mask-text-addition').remove();
+}
+
+var showMoeFormMask = function (_additionalClass = false) {
+    if(_additionalClass) {
+        $('#moe-form-mask').addClass(_additionalClass);
+    }
+    $('#moe-form-mask').show();
+}
+
+var hideMoeFormMask = function () {
+    if($('body').is('.blocking-mode')) return false;
+    $('#moe-form-mask').hide().removeClass();
+    $('#create-shortcut-form').hide();
+}
+
+$(document).ready(function () {
+    hideMask();
+});
+
+$(document).ready(function () {
+    $("input[type=number]").keydown(function (e) {
+        // Allow: backspace, delete, tab, escape, enter and .
+        if ($.inArray(e.keyCode, [46, 8, 9, 27, 13, 110, 190]) !== -1 ||
+            // Allow: Ctrl+A, Command+A
+            (e.keyCode == 65 && (e.ctrlKey === true || e.metaKey === true)) ||
+            // Allow: home, end, left, right, down, up
+            (e.keyCode >= 35 && e.keyCode <= 40)) {
+            // let it happen, don't do anything
+            return;
+        }
+        // Ensure that it is a number and stop the keypress
+        if ((e.shiftKey || (e.keyCode < 48 || e.keyCode > 57)) && (e.keyCode < 96 || e.keyCode > 105)) {
+            e.preventDefault();
+        }
+    });
+});
+
+$(function () {
+    $('input[type=checkbox][forceCb]').on('click', function () {
+        var name = $(this).attr('forceCb');
+        var code = $(this).attr('code');
+        var form = $(this).closest('form');
+        var hiddenField = $(form).find('input[code=\'' + code + '\']');
+        var value = $(this).prop('checked') ? 'on' : 'off';
+        console.log('name', name, 'code', code, 'value', value);
+        $(hiddenField).val(value);
+    });
+});
+
+var doAjax = function (url, data, pre, post, onSuccess, onFailure, suppressErrorMessage, onHttpFailure, shouldHideMask, immediatelyHideMaskOnReply) {
+    console.log(data);
+    if (ajaxGoing) {
+        console.log('ajax stopped!');
+        //return; TODO: fix and re-enable return
+    }
+    ajaxGoing = true;
+    if (!shouldHideMask) {
+        showMask();
+    }
+    jQuery.ajax(url, {
+        dataType: 'json',
+        data: data,
+        type: 'POST',
+        beforeSend: function () {
+            if (pre) {
+                pre();
+            }
+        }
+    })
+        .done(function (response, b) {
+            console.log(response);
+            var success = response.success;
+            if (success) {
+                if (onSuccess) {
+                    onSuccess(response.data);
+                }
+            } else {
+                if (onFailure) {
+                    onFailure(response.message);
+                }
+                if (!suppressErrorMessage) {
+                    //toast the error message
+                    //alert(response.message);
+                    toastr.error(response.message); // , toastr.success("message") ... .warning(), .error()
+                }
+                hideMask();
+            }
+            if (immediatelyHideMaskOnReply) {
+                hideMask();
+            }
+            ajaxGoing = false;
+        })
+        .fail(function (jqXHR, textStatus) {
+            hideMask();
+            toastr.error('Unable to process');
+            if (onHttpFailure) {
+                onHttpFailure(textStatus);
+            }
+            ajaxGoing = false;
+        })
+        .always(function () {
+            if (post) {
+                post();
+            }
+            ajaxGoing = false;
+        });
+};
+
+var doAjaxFormData = function (url, data, pre, post, onSuccess, onFailure, suppressErrorMessage, onHttpFailure, shouldHideMask, immediatelyHideMaskOnReply) {
+    console.log(data);
+    if (ajaxGoing) {
+        console.log('ajax stopped!');
+        //return; TODO: fix and re-enable return
+    }
+    ajaxGoing = true;
+    if (!shouldHideMask) {
+        showMask();
+    }
+    jQuery.ajax(url, {
+        dataType: 'json',
+        data: data,
+        processData: false,
+        contentType: false,
+        type: 'POST',
+        beforeSend: function () {
+            if (pre) {
+                pre();
+            }
+        }
+    })
+        .done(function (response, b) {
+            console.log(response);
+            var success = response.success;
+            if (success) {
+                if (onSuccess) {
+                    onSuccess(response.data);
+                }
+            } else {
+                if (onFailure) {
+                    onFailure(response.message);
+                }
+                if (!suppressErrorMessage) {
+                    //toast the error message
+                    //alert(response.message);
+                    toastr.error(response.message); // , toastr.success("message") ... .warning(), .error()
+                }
+                hideMask();
+            }
+            if (immediatelyHideMaskOnReply) {
+                hideMask();
+            }
+            ajaxGoing = false;
+        })
+        .fail(function (jqXHR, textStatus) {
+            hideMask();
+            toastr.error('Unable to process');
+            if (onHttpFailure) {
+                onHttpFailure(textStatus);
+            }
+            ajaxGoing = false;
+        })
+        .always(function () {
+            if (post) {
+                post();
+            }
+            ajaxGoing = false;
+        });
+};
+
+var justLog = false; //THIS IS FOR TEST MODE, FORMS WILL NOT TRIGGER REFRESH/REDIR
+
+var pageReload = function (_target) {
+    setTimeout(function () {
+        hideMoeFormMask();
+        fastReload(_target);
+    }, 500);
+};
+
+if (typeof String.prototype.startsWith != 'function') {
+    // see below for better implementation!
+    String.prototype.startsWith = function (str) {
+        return this.indexOf(str) === 0;
+    };
+}
+
+$(function () {
+    $('[addressLine1]').each(function () {
+        var moe = $(this).closest('[moe]');
+        var a = {};
+        a.addressLine1 = $(this);
+        a.addressLine2 = $(moe).find('[addressLine2]');
+        a.addressCity = $(moe).find('[addressCity]');
+        a.addressState = $(moe).find('[addressState]');
+        a.addressPostcode = $(moe).find('[addressPostcode]');
+        var getAddress = function () {
+            var address = {};
+            for (var prop in a) {
+                var val = $(a[prop]).val();
+                address[prop] = val;
+            }
+            return address;
+        }
+        var getFormattedAddress = function (address) {
+            var x = '<p>';
+            x += address.addressLine1 + (address.addressLine2 ? ', ' + address.addressLine2 : '') + '<br/>' + address.addressCity + ', ' + address.addressState + ' ' + address.addressPostcode;
+            x += '</p>';
+            return x;
+        }
+        var suggestAddress = function () {
+            var address = getAddress();
+            //var doAjax = function (url, data, pre, post, onSuccess, onFailure, suppressErrorMessage, onHttpFailure, shouldHideMask)
+            var onSuccess = function (data) {
+                console.log('SUCCESS!!!', data);
+            }
+            var onFailure = function (message) {
+                if (message.startsWith('Invalid:: INVALID ADDRESS - SUGGESTED:')) {
+                    var suggestionText = message.substring(message.indexOf('{'));
+                    var suggestion = JSON.parse(suggestionText);
+                    console.log('SUGGESTION!!!', suggestion);
+                    $('#myModal').attr('title', 'Address suggestion');
+                    $('#myModal').html('<h3>Currently set address:</h3>' + getFormattedAddress(address) + '<h3>Suggestion:</h3>' + getFormattedAddress(suggestion));
+                    $('#myModal').dialog({
+                        height: 400,
+                        width: 500,
+                        modal: true,
+                        buttons: [{
+                            text: 'Use suggestion',
+                            click: function () {
+                                for (var prop in a) {
+                                    $(a[prop]).val(suggestion[prop]);
+                                }
+                                $(this).dialog('close');
+                            }
+                        },
+                            {
+                                text: 'Keep original',
+                                click: function () {
+                                    $(this).dialog('close');
+                                }
+                            }
+                        ]
+                    });
+                } else if (message.startsWith('Invalid:: INVALID ADDRESS')) {
+                    console.log('NO SUGGESTION!!!');
+                    $('#myModal').attr('title', 'No address found');
+                    $('#myModal').html('<h3>Currently set address:</h3>' + getFormattedAddress(address) + '<h3>No suggestion!</h3>');
+                    $('#myModal').dialog({
+                        height: 400,
+                        width: 500,
+                        modal: true,
+                        buttons: [{
+                            text: 'Erase address fields',
+                            click: function () {
+                                for (var prop in a) {
+                                    $(a[prop]).val('');
+                                }
+                                $(this).dialog('close');
+                            }
+                        },
+                            {
+                                text: 'Keep original',
+                                click: function () {
+                                    $(this).dialog('close');
+                                }
+                            }
+                        ]
+                    });
+                }
+            }
+            doAjax('/api/service/verifyAddress', address, null, null, onSuccess, onFailure, true, null, false, true);
+        }
+        var isAddressComplete = function () {
+            var address = getAddress();
+            return address.addressLine1 && ((address.addressCity && address.addressState) || address.addressPostcode) ? true : false;
+        }
+        for (var prop in a) {
+            var part = a[prop];
+            $(part).on('change', function () {
+                console.log(getAddress());
+                var isComplete = isAddressComplete();
+                if (isComplete) {
+                    suggestAddress();
+                }
+            });
+            $(part).attr('autocomplete', 'off');
+        }
+    });
+});
+
+var initMoes = function() {
+    $('[moe]').each(function () {
+
+        if($(this).is('[initialized]')) { // skip to next moe
+            return true;
+        }
+
+        var moe = $(this);
+        moe.isProcessing = false;
+        var info = moe.find('[info]')[0]; // OPTIONAL
+        var start = moe.find('[start]')[0]; // OPTIONAL
+        var form = moe.find('[url]')[0]; // REQUIRED
+        var url = $(form).attr('url'); // REQUIRED
+        var redir = $(form).attr('redir'); // OPTIONAL
+        var target = $(form).attr('target'); // OPTIONAL
+        var noreload = $(form).is('[noreload]'); // OPTIONAL
+        var hook = $(form).attr('hook'); // OPTIONAL
+        var submit = moe.find('[submit]'); // REQUIRED
+        var cancel = moe.find('[cancel]')[0]; // OPTIONAL
+
+        // ajax load - OPTIONAL
+        var moeParent = $(form).closest('[moe-parent][url]');
+
+        if ($(this).attr('formOff') != null) {
+            $(form).find(':input').attr('disabled', true);
+            var formOn = $(this).find('[formOn]');
+            $(formOn).attr('disabled', false);
+            $(submit).hide();
+            $(formOn).click(function () {
+                $(form).find(':input').attr('disabled', false);
+                $(submit).show();
+                $(formOn).hide();
+                return false;
+            });
+        }
+
+        var realForm = form;
+
+        //init set display inline so toggle remembers inline state
+        var formToggle = false;
+        var infoToggle = false;
+
+        if (start) {
+            $(start).off('click.moe');
+            $(start).on('click.moe', function () {
+
+                // if any div based moes are visible, hide first
+                $('[moe]>div[url]:visible').hide();
+
+                $('.dropdown-menu[aria-labelledby="practice-management"]')
+                    .removeClass('show')
+                    .prev('.dropdown-toggle').attr('aria-expanded', 'false');
+                if ($(realForm).attr('show') == null) {
+                    if (!formToggle && $(realForm).attr('liner') != null) {
+                        $(realForm).css('display', 'inline');
+                        formToggle = true;
+                    } else {
+                        var isRealFormVisible = $(realForm).is(':visible');
+                        if(isRealFormVisible){
+                            hideMoeFormMask();
+                            $(realForm).toggle(100);
+                        }else{
+                            // keep data in moes, don't force reset
+                            // if($(realForm).is('form')) $(realForm)[0].reset();
+                            if(!$(realForm).closest('[moe]').is('[no-mask]')) {
+                                showMoeFormMask();
+                            }
+                            setTimeout(function() {
+                                $('[moe]>[url]:not([show]):visible').hide();
+                                $(realForm).toggle(100);
+                                initPrimaryForm($(realForm));
+                                setTimeout(function() {
+                                    let submitButton = $(realForm).find('[submit]');
+                                    if(submitButton.length) submitButton[0].scrollIntoView({behavior : "smooth", block: "nearest"});
+
+                                    // if any callback, trigger it
+                                    if($(realForm).is('[onshow]')) {
+                                        window[$(realForm).attr('onshow')].call($(realForm)[0]);
+                                    }
+
+                                }, 150);
+                            }, 100);
+                        }
+                    }
+                }
+                if (!infoToggle && info && $(info).attr('show') == null) {
+                    if ($(info).attr('liner') != null) {
+                        $(info).css('display', 'inline');
+                        infoToggle = true;
+                    } else {
+                        $(info).toggle(100);
+                    }
+                }
+                if ($(start).attr('show') == null) {
+                    $(start).toggle(100);
+                }
+                var focusOnStart = $(realForm).find('[focusOnStart]');
+                if (focusOnStart) {
+                    $(focusOnStart).focus();
+                }
+                return false;
+            });
+            $(start).attr('href', '#');
+        }
+        if (cancel) {
+            $(cancel).off('click.moe');
+            $(cancel).on('click.moe', function (e) {
+                e.preventDefault();
+                e.stopImmediatePropagation();
+                if ($(realForm).attr('show') == null) {
+                    $(realForm).hide(100);
+                }
+                if (info && $(info).attr('show') == null) {
+                    $(info).show(100);
+                }
+                if (start && $(start).attr('show') == null) {
+                    $(start).show(100);
+                }
+                hideMoeFormMask();
+            });
+        }
+        $(submit).off('click.moe');
+        $(submit).on('click.moe', function (e) {
+            e.preventDefault();
+            e.stopImmediatePropagation();
+            if (moe.isProcessing) {
+                return false;
+            }
+            if ($(submit).attr('confirm')) {
+                var question = $(submit).attr('confirm');
+                var cont = confirm(question);
+                if (cont) {} else {
+                    console.log("ABORTED!");
+                    return;
+                }
+            }
+
+            if($(form).is('form')) {
+
+                // trigger validation
+                if (!$(form)[0].checkValidity()) {
+                    $(form)[0].reportValidity();
+                    return;
+                }
+
+                // check and trigger onbeforesubmit
+                if($(form).is('[onbeforesubmit]')) {
+                    window[$(form).attr('onbeforesubmit')].call($(realForm)[0]);
+                }
+
+                // submit
+                moe.isProcessing = true;
+                var data = {};
+                var formData = $(form).serializeArray();
+                formData.forEach(function (field) {
+                    if (data[field.name]) {
+                        if (data[field.name] instanceof Array) {
+                            data[field.name].push(field.value);
+                        } else {
+                            var arr = [];
+                            arr.push(data[field.name]);
+                            arr.push(field.value);
+                            data[field.name] = arr;
+                        }
+                    } else {
+                        data[field.name] = field.value;
+                    }
+                });
+                console.log(data);
+                //var doAjax = function (url, data, pre, post, onSuccess, onFailure, suppressErrorMessage, onHttpFailure, shouldHideMask, immediatelyHideMaskOnReply)
+
+                // override with FormData if the form has any files
+                let useFormData = false;
+                if($(form).find('input[type="file"]').length) {
+                    let formData = new FormData();
+                    for(let x in data) {
+                        if(data.hasOwnProperty(x)) {
+                            formData.set(x, data[x]);
+                        }
+                    }
+                    $(form).find('input[type="file"]').each(function() {
+                        let fieldName = this.name;
+                        if(this.files && this.files.length) {
+                            formData.append(fieldName, this.files[0]);
+                        }
+                    });
+                    data = formData;
+                    useFormData = true;
+                }
+
+                if(!useFormData) {
+                    doAjax(url, data, null, function () {
+                        moe.isProcessing = false;
+                    }, function (data) {
+                        if(noreload) {
+                            $(cancel).trigger('click.moe');
+                            hideMoeFormMask();
+                            hideMask();
+                            toastr.success('Done');
+                            return;
+                        }
+                        if (justLog) { // this is to test!
+                            console.log('RETURNED', data);
+                        } else if (hook) {
+                            $(cancel).trigger('click.moe');
+                            hideMoeFormMask();
+                            hideMask();
+                            runMCHook(hook);
+                        } else if(isDynamicStagPopupPresent()) {
+                            let targetUrl = false;
+                            if (redir) {
+                                if (redir.indexOf('[data]') > -1) {
+                                    targetUrl = redir.replace('[data]', data);
+                                }
+                            }
+                            refreshDynamicStagPopup(targetUrl, target);
+                        } else if (redir) {
+                            if (redir == "back") {
+                                window.top.history.back();
+                            } else {
+                                if (redir.indexOf('[data]') > -1) {
+                                    redir = redir.replace('[data]', data);
+                                }
+                                fastLoad(redir, true, false);
+                            }
+                        } else if (moeParent.length) {
+                            showMask();
+                            $.get(moeParent.attr('url'), function (_data) {
+                                moeParent.html(_data);
+                                hideMask();
+                                hideMoeFormMask();
+                                initMoes();
+                                initFastLoad(moeParent);
+                                initAutoRxAndICDComplete();
+                            });
+                        } else {
+                            pageReload(target);
+                        }
+                    }, function (errorMessage) {
+
+                    }, false);
+                }
+                else {
+                    doAjaxFormData(url, data, null, function () {
+                        moe.isProcessing = false;
+                    }, function (data) {
+                        if(noreload) {
+                            $(cancel).trigger('click.moe');
+                            hideMoeFormMask();
+                            hideMask();
+                            toastr.success('Done');
+                            return;
+                        }
+                        if (justLog) { // this is to test!
+                            console.log('RETURNED', data);
+                        } else if (hook) {
+                            $(cancel).trigger('click.moe');
+                            hideMoeFormMask();
+                            hideMask();
+                            runMCHook(hook);
+                        } else if(isDynamicStagPopupPresent()) {
+                            let targetUrl = false;
+                            if (redir) {
+                                if (redir.indexOf('[data]') > -1) {
+                                    targetUrl = redir.replace('[data]', data);
+                                }
+                            }
+                            refreshDynamicStagPopup(targetUrl);
+                        } else if (redir) {
+                            if (redir == "back") {
+                                window.top.history.back();
+                            } else {
+                                if (redir.indexOf('[data]') > -1) {
+                                    redir = redir.replace('[data]', data);
+                                }
+                                fastLoad(redir, true, false);
+                            }
+                        } else if (moeParent.length) {
+                            showMask();
+                            $.get(moeParent.attr('url'), function (_data) {
+                                moeParent.html(_data);
+                                hideMask();
+                                hideMoeFormMask();
+                                initMoes();
+                                initFastLoad(moeParent);
+                                initAutoRxAndICDComplete();
+                            });
+                        } else {
+                            pageReload(target);
+                        }
+                    }, function (errorMessage) {
+
+                    }, false);
+                }
+
+            }
+        });
+
+        moe.attr('initialized', 1); // mark as initialized
+
+    });
+}
+
+jQuery(document).ready(function () {
+    var $ = jQuery;
+    $('body').mousedown(function(e){
+        if($(e.target).closest('[moe]').length ||
+            $(e.target).closest('#create-shortcut-form').length ||
+            $(e.target).is('#create-shortcut-form') ||
+            $(e.target).is('.stag-shortcuts .sc') ||
+            $(e.target).closest('.ui-datepicker').length) {
+            return;
+        }
+        $('[moe] [url]:not([show])').hide();
+        hideMoeFormMask();
+    });
+
+    initMoes();
+
+    $('table[info] input').each(function () {
+        $(this).prop('readonly', true);
+    });
+
+    //...for checkboxes readonly
+    $('input[type=checkbox][readonly],input[type=radio][readonly]').each(function () {
+        var x = this;
+        var isChecked = $(x).attr('checked');
+        $(x).change(function () {
+            $(x).attr('checked', isChecked);
+        });
+    });
+
+    $('[show-if]').each(function () { //TODO show-if="isOpen"    show-if="isTimeSpecific"    show-if="refillFrequency=MONTH"
+        var x = this;
+        var sel = $(x).attr('show-if');
+        var selParts = sel.split('=');
+        var selName = selParts[0];
+        var selValue = selParts[1];
+        var useOpposite = selName[0] == '!';
+        if (useOpposite) {
+            selName = selName.slice(1);
+        }
+        var form = $(x).closest('form');
+        var conditionFields = $(form).find('[name=' + selName + ']');
+
+        function hideX() {
+            $(x).hide();
+        }
+
+        function showX() {
+            $(x).show();
+        }
+        var go = function () {
+            if (selValue) {
+                var value = $(conditionFields).val();
+                if (value == selValue) {
+                    if (useOpposite) {
+                        hideX()
+                    } else {
+                        showX()
+                    }
+                } else {
+                    if (useOpposite) {
+                        showX()
+                    } else {
+                        hideX()
+                    }
+                }
+            } else {
+                var isChecked = $(conditionFields).prop('checked');
+                if (isChecked) {
+                    if (useOpposite) {
+                        hideX()
+                    } else {
+                        showX()
+                    }
+                } else {
+                    if (useOpposite) {
+                        showX()
+                    } else {
+                        hideX()
+                    }
+                }
+            }
+        };
+        go();
+        $(conditionFields).change(function () {
+            go();
+        });
+    });
+
+});
+
+//now goTo is a plugin...
+(function ($) {
+    $.fn.goTo = function (x) {
+        $('html, body').animate({
+            scrollTop: ($(this).offset().top - x) + 'px'
+        }, 1);
+        return this; // for chaining...
+    };
+})(jQuery);
+
+$(document).ready(function () {
+    $(".expander").on("click", function () {
+        var expandedID = $(this).attr("id");
+        if ($(this).text() == "-") {
+            $(this).text("+");
+        } else {
+            $(this).text("-");
+        }
+        $("." + expandedID).toggle();
+        return false;
+    });
+});
+
+
+
+$(document).ready(function () {
+    $('[showMap]').each(function () {
+        var mapper = $(this);
+        var adr = mapper.attr('showMap');
+        mapper.on('click', function () {
+            showAddr(adr);
+            return false;
+        });
+    });
+});
+
+
+$(document).ready(function () {
+    $('[dateRanger]').each(function () {
+        var dr = $(this);
+        var rangeTypeSelect = dr.find('select')[0];
+        var date1Input = dr.find('[date1]')[0];
+        var date2Input = dr.find('[date2]')[0];
+        var d1Val = '';
+        var d2Val = '';
+        var d1 = function (enable) {
+            if (enable) {
+                var hasVal = $(date1Input).val();
+                if (!hasVal) {
+                    $(date1Input).val(d1Val);
+                }
+                $(date1Input).show();
+            } else {
+                d1Val = $(date1Input).val();
+                $(date1Input).val('');
+                $(date1Input).hide();
+            }
+        };
+        var d2 = function (enable) {
+            if (enable) {
+                var hasVal = $(date2Input).val();
+                if (!hasVal) {
+                    $(date2Input).val(d2Val);
+                }
+                $(date2Input).show();
+            } else {
+                d2Val = $(date2Input).val();
+                $(date2Input).val('');
+                $(date2Input).hide();
+            }
+        };
+        var adjustFields = function () {
+            var rangeType = $(rangeTypeSelect).val();
+            if (rangeType == 'all') {
+                d1();
+                d2();
+            } else if (rangeType == 'on-or-before') {
+                d1(true);
+                d2();
+            } else if (rangeType == 'on-or-after') {
+                d1(true);
+                d2();
+            } else if (rangeType == 'between') {
+                d1(true);
+                d2(true);
+            } else if (rangeType == 'on') {
+                d1(true);
+                d2();
+            } else if (rangeType == 'not-on') {
+                d1(true);
+                d2();
+            } else if (rangeType == 'not-in-between') {
+                d1(true);
+                d2(true);
+            }
+        };
+        adjustFields();
+        $(rangeTypeSelect).change(function () {
+            adjustFields();
+        });
+    });
+    $('[numRanger]').each(function () {
+        var nr = $(this);
+        var rangeTypeSelect = nr.find('select')[0];
+        var num1Input = nr.find('[num1]')[0];
+        var num2Input = nr.find('[num2]')[0];
+        var n1 = function (enable) {
+            if (enable) {
+                $(num1Input).show();
+            } else {
+                $(num1Input).hide();
+            }
+        };
+        var n2 = function (enable) {
+            if (enable) {
+                $(num2Input).show();
+            } else {
+                $(num2Input).hide();
+            }
+        };
+        var adjustFields = function () {
+            var rangeType = $(rangeTypeSelect).val();
+            if (rangeType == 'all') {
+                n1();
+                n2();
+            } else if (rangeType == 'less-than') {
+                n1(true);
+                n2();
+            } else if (rangeType == 'greater-than') {
+                n1(true);
+                n2();
+            } else if (rangeType == 'equal-to') {
+                n1(true);
+                n2();
+            } else if (rangeType == 'between') {
+                n1(true);
+                n2(true);
+            } else if (rangeType == 'not-equal-to') {
+                n1(true);
+                n2();
+            } else if (rangeType == 'not-in-between') {
+                n1(true);
+                n2(true);
+            }
+        };
+        adjustFields('all');
+        $(rangeTypeSelect).change(function () {
+            adjustFields();
+        });
+    });
+});
+$(document).ready(function () {
+    $('[minzero]').on('change', function () {
+        var val = $(this).val();
+        val = parseFloat(val);
+        if (val < 0) {
+            alert('This number cannot be less than zero.');
+            $(this).val('');
+            $(this).focus();
+        }
+    });
+});
+
+var showAddr = function (adr) {
+    window.open('http://192.241.155.210/geo.php?adr=' + adr, new Date().getTime(), "height=400,width=520");
+};
+
+$(document).ready(function () {
+    var globalSearch = function () {
+        var substring = $('#globalSearch').val();
+        console.log("SUBSTRING", substring);
+        if (substring.length > 2) {
+            $("#results").show();
+            $("#results").load("/global-search?substring=" + encodeURIComponent(substring));
+        } else {
+            $("#results").hide();
+        }
+    };
+    $("#globalSearch").on('keyup', function (evnt) {
+        globalSearch();
+    });
+    $("#globalSearch").on('focus', function (evnt) {
+        globalSearch();
+    });
+    $("#globalSearch").on('blur', function (evt) {
+        setTimeout(function () {
+            $("#results").hide();
+        }, 500);
+    });
+});
+
+$('a[aller]').attr('href', '#');
+var selectAll = true;
+$('a[aller]').click(function () {
+    $('input[type=checkbox][aller]').each(function () {
+        if (!$(this).is(':disabled')) {
+            $(this).prop('checked', selectAll);
+        }
+    });
+    selectAll = !selectAll;
+    return false;
+});
+
+$(function () {
+    $('.showOnLoad').show();
+});
+
+$(function () {
+    var i = 0;
+    function pulsate() {
+        $(".urgentIndicator").
+        animate({
+            opacity: 0.2
+        }, 200, 'linear').
+        animate({
+            opacity: 1
+        }, 200, 'linear', pulsate);
+    }
+    pulsate();
+});
+
+$(function () {
+    $('[remote-searcher]').each(function () {
+
+        var me = this;
+
+        $(me).hide();
+
+        var selections = [];
+
+        var isMulti = typeof $(me).attr('multiple') == 'string';
+
+        $(me).find('[rid]').each(function () {
+            selections.push({
+                id: $(this).attr('rid'),
+                display: $(this).attr('display')
+            });
+        });
+
+        if (!isMulti && selections[0]) {
+            selections = [selections[0]];
+        }
+
+        $(me).html('');
+
+        var url = $(me).attr('remote-searcher');
+        var charMin = $(me).attr('char-min');
+        var name = $(me).attr('name');
+
+        $(me).append('<select multiple style="display:none;" name="' + name + '"></select><span choices></span><input type="text" style="border:none;margin:5px;width:100%;outline:none;display:none;"/></span>');
+        $(me).append('<div style="margin-top:2px;background:white;border:1px lightgray solid;display:none;width:99%;position:absolute;z-index:999"></div>');
+
+        var choices = $(me).find('span[choices]');
+
+        var selectField = $(me).find('select');
+        var textField = $(me).find('input[type=text]');
+        var resultDiv = $(me).find('div');
+
+        var setResultMask = function () {
+            $(resultDiv).html('<div style="background-image: url(/icons/vanillaspin.gif); background-repeat: no-repeat; width:100%; height:60px;background-position: center;"></div>');
+        }
+
+        var fillSelected = function (selected) {
+            $(selectField).html('');
+            $(choices).html('');
+            selected.forEach(function (choice, index) {
+                if (isMulti || (!isMulti && index == 0)) {
+                    $(selectField).append('<option selected value="' + choice.id + '">' + choice.display + '</option>');
+                    $(choices).append('<button style="margin:2px;" rid="' + choice.id + '" index="' + index + '">' + choice.display + ' x</button>');
+                }
+            });
+            $(choices).find('button').on('click', function () {
+                var btn = this;
+                var rid = $(btn).attr('rid');
+                var index = $(btn).attr('index');
+                selections.splice(index, 1);
+                fillSelected(selected);
+                return false;
+            });
+        }
+
+        fillSelected(selections);
+
+        var setValue = function (val, display) {
+            if (!isMulti) {
+                selections = [];
+            }
+            // get rid of earliers
+            for (var i = 0; i < selections.length; i++) {
+                var sel = selections[i];
+                if (sel.id == parseInt(val)) {
+                    selections.splice(i, 1);
+                }
+            }
+            selections.push({
+                id: val,
+                display: display
+            });
+            fillSelected(selections);
+            $(textField).val('');
+            $(textField).hide();
+        }
+
+        var getMatches = function () {
+            var substring = $(textField).val();
+            if (charMin > substring.length) {
+                return;
+            }
+            setResultMask();
+            $(resultDiv).show();
+            //url, data, pre, post, onSuccess, onFailure, suppressErrorMessage, onHttpFailure, shouldHideMask
+            doAjax(url, {
+                substring: substring
+            }, null, null, function (matches) {
+                $(resultDiv).find('[rid]').each(function () {
+                    $(this).off()
+                });
+                $(resultDiv).html('');
+                matches.forEach(function (match) {
+                    if (typeof match == 'string') {
+                        match = {
+                            id: match,
+                            display: match
+                        }
+                    }
+                    if (typeof match == 'object' && !match.id) {
+                        match.id = match.display;
+                    }
+                    $(resultDiv).append('<a href="#" class="searcher-result" display="' + match.display + '" rid="' + match.id + '">' + match.display + '</a>');
+                });
+                $(resultDiv).find('[rid]').each(function () {
+                    var result = this;
+                    $(result).mousedown('click', function () {
+                        var val = $(result).attr('rid');
+                        var display = $(result).attr('display');
+                        setValue(val, display);
+                        //$(textField).hide();
+                        return false;
+                    });
+                });
+            }, null, true, null, true);
+        };
+
+        $(textField).on('keyup', function () {
+            getMatches();
+        });
+
+        $(textField).on('blur', function () {
+            $(textField).val('');
+            $(textField).hide();
+            if ($(resultDiv).is(':visible')) {
+                $(resultDiv).hide();
+            };
+        });
+
+        $(textField).on('focus', function () {
+            getMatches();
+        });
+
+        $(me).on('click', function () {
+            $(textField).show();
+            $(textField).focus();
+        });
+
+        $(me).show();
+    });
+});
+
+$(document).ready(function () {
+    // setInterval(function () {
+    //     doAjax('/api/session/test', null, null, null, null, function () {
+    //         window.location.reload(true);
+    //     }, true, null, true);
+    // }, 10000);
+});
+
+$(document).ready(function () {
+    if (focusOn) {
+        $('#' + focusOn).focus();
+    }
+});
+
+$(function () {
+    $('[setMaskOnClick]').click(function () {
+        showMask();
+    });
+});
+
+$(function () {
+    $('input[type=file][ajaxload]').each(function () {
+        var me = this;
+        var name = $(me).attr('ajaxload');
+        $(me).wrap('<span class="ajaxload"></span>');
+        $(me).closest('span').append('<input type="hidden" name="' + name + '"/>');
+        $(me).on('change', function (event) {
+            console.log("file received.");
+            var fileField = me;
+            var files = event.target.files;
+            var data = new FormData();
+            $.each(files, function (key, value) {
+                data.append(key, value);
+            });
+            $.ajax({
+                url: '/api/systemFile/upload',
+                type: 'POST',
+                data: data,
+                cache: false,
+                dataType: 'json',
+                processData: false, // Don't process the files
+                contentType: false, // Set content type to false as jQuery will tell the server its a query string request
+                success: function (data, textStatus, jqXHR) {
+                    var systemFileID = data.data;
+                    console.log("UPLOAD WORKED::", data);
+                    $(me).closest('span').find('input[type=hidden]').val(systemFileID);
+                },
+                error: function (jqXHR, textStatus, errorThrown) {
+                    console.log('ERRORS: ' + textStatus);
+                }
+            });
+        });
+    });
+});
+
+// catch ESC and discard any visible moes
+$(document).ready(function () {
+    $(document)
+        .off('keydown.moe-escape')
+        .on('keydown.moe-escape', function (e) {
+            if(e.which === 27) {
+                if(isEventConsumed(e)) return;
+                let visibleMoes = $('[moe] [url]:not([show]):visible');
+                if (visibleMoes.length) {
+                    hideMoeFormMask();
+                    visibleMoes.hide();
+                    window.moeClosedAt = (new Date()).getTime();
+                    markEventAsConsumed(e);
+                    return false;
+                }
+            }
+        });
+});

+ 15 - 4
minify.sh

@@ -1,5 +1,16 @@
-## npm install uglifyjs -g
-
-uglifyjs yemi.js --compress --mangle --output  public/js/yemi.js
-
+## npm install uglify-js -g
 
+uglifyjs js-dev/yemi.js --compress --mangle --output  public/js/yemi.js
+uglifyjs js-dev/tsvToArray.js --compress --mangle --output  public/js/tsvToArray.js
+uglifyjs js-dev/stag-table-filter.js --compress --mangle --output public/js/stag-table-filter.js
+uglifyjs js-dev/stag-suggest.js --compress --mangle --output public/js/stag-suggest.js
+uglifyjs js-dev/stag-popup.js --compress --mangle --output public/js/stag-popup.js
+uglifyjs js-dev/stag-collapsible-card.js --compress --mangle --output public/js/stag-collapsible-card.js
+uglifyjs js-dev/show-on-click.js --compress --mangle --output public/js/show-on-click.js
+uglifyjs js-dev/shortcut.js --compress --mangle --output public/js/shortcut.js
+uglifyjs js-dev/pro-suggest.js --compress --mangle --output public/js/pro-suggest.js
+uglifyjs js-dev/option-list.js --compress --mangle --output public/js/option-list.js
+uglifyjs js-dev/mc-init.js --compress --mangle --output public/js/mc-init.js
+uglifyjs js-dev/mc.js --compress --mangle --output public/js/mc.js
+uglifyjs js-dev/dq.js --compress --mangle --output public/js/dq.js
+uglifyjs js-dev/click-to-copy.js --compress --mangle --output public/js/click-to-copy.js

+ 14 - 0
public/js/.gitignore

@@ -0,0 +1,14 @@
+click-to-copy.js
+dq.js
+mc.js
+mc-init.js
+option-list.js
+pro-suggest.js
+shortcut.js
+show-on-click.js
+stag-collapsible-card.js
+stag-popup.js
+stag-suggest.js
+stag-table-filter.js
+tsvToArray.js
+yemi.js

+ 28 - 0
public/js/icd-autocomplete copy.js

@@ -0,0 +1,28 @@
+(function() {
+
+    function init() {
+        let self = this;
+        $('[icd-autocomplete-code]:not([ac-initialized])').each(function() {
+            let elem = this, dynID = 'icd-' + Math.ceil(Math.random() * 1000000),
+                codeElem = $(this), descElem = $(this).closest('form').find('[icd-autocomplete-description]');
+            $(elem).attr('id', dynID);
+            new window.Def.Autocompleter.Search(dynID,
+                'https://clinicaltables.nlm.nih.gov/api/icd10cm/v3/search?sf=code,name&ef=name', {
+                    tableFormat: true,
+                    valueCols: [0],
+                    colHeaders: ['Code', 'Name'],
+                }
+            );
+            window.Def.Autocompleter.Event.observeListSelections(dynID, function() {
+                let autocomp = elem.autocomp, acData = autocomp.getSelectedItemData();
+                codeElem.val(acData[0].code).trigger('change');
+                descElem.val(acData[0].data['name']).trigger('change');
+                return false;
+            });
+            $(elem).attr('ac-initialized', 1);
+        });
+    }
+
+    addMCInitializer('icd-autocomplete', init);
+
+}).call(window);

ファイルの差分が大きいため隠しています
+ 0 - 0
public/js/yemi.js


+ 2 - 2
resources/views/app/generic-bills/add-bill-form/_default-script.blade.php

@@ -15,7 +15,7 @@
 
                 // max num units to limit at $15
                 if ($(_trigger).attr('data-entity-type') === 'Note') {
-                    let maxNABillableAmount = 15,
+                    let maxNABillableAmount = 30,
                         amountPer5Minutes = selectedGenericRate / 12,
                         maxNumberOf5Minutes = Math.ceil(maxNABillableAmount / amountPer5Minutes),
                         maxHours = (maxNumberOf5Minutes * 5) / 60,
@@ -76,4 +76,4 @@
         }
         addMCInitializer('init-generic-add-bill', init);
     }).call(window);
-</script>
+</script>

+ 25 - 16
resources/views/app/new-patient.blade.php

@@ -18,7 +18,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 				</strong>
 			</div>
 			<div class="card-body">
-				<form show url="/api/client/create" class="px-2 pb-1 primary-form" redir="patients/view/[data]">
+				<form id="createNewPatientForm" show url="/api/client/create" class="px-2 pb-1 primary-form" redir="patients/view/[data]">
 					@if (session('message'))
 					<div class="alert alert-danger">{{ session('message') }}</div>
 					@endif
@@ -30,23 +30,23 @@ $medicaidStates = Config::get('constants.medicaid_states');
 								</div>
 								<div class="form-group col-md-4">
 									<label class="control-label">First Name <span class="text-danger">*</span> </label>
-									<input type="text" required name="patientNameFirst" value="" class="form-control input-sm">
+									<input autocomplete="_blank" type="text" required name="patientNameFirst" value="" class="form-control input-sm">
 								</div>
 								<div class="form-group col-md-4">
 									<label class="control-label">Middle Name / MI</label>
-									<input type="text" name="patientNameMiddle" value="" class="form-control input-sm">
+									<input autocomplete="_blank" type="text" name="patientNameMiddle" value="" class="form-control input-sm">
 								</div>
 								<div class="form-group col-md-4">
 									<label class="control-label">Last Name <span class="text-danger">*</span></label>
-									<input type="text" required name="patientNameLast" value="" class="form-control input-sm">
+									<input autocomplete="_blank" type="text" required name="patientNameLast" value="" class="form-control input-sm">
 								</div>
 								<div class="form-group col-md-4">
 									<label class="control-label">Prefix</label>
-									<input type="text" name="patientNamePrefix" value="" class="form-control input-sm">
+									<input autocomplete="_blank" type="text" name="patientNamePrefix" value="" class="form-control input-sm">
 								</div>
 								<div class="form-group col-md-4">
 									<label class="control-label">Suffix</label>
-									<input type="text" name="patientNameSuffix" value="" class="form-control input-sm">
+									<input autocomplete="_blank" type="text" name="patientNameSuffix" value="" class="form-control input-sm">
 								</div>
 								<div class="form-group col-md-4">
 									<label class="control-label">Sex</label>
@@ -134,7 +134,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 												<i class="fa fa-retweet"></i>
 											</a>
 										</label>
-										<input class='form-control' stag-input-phone type='tel' name='homeNumber' v-model="form.homeNumber">
+										<input class='form-control' autocomplete="_blank" stag-input-phone type='tel' name='homeNumber' v-model="form.homeNumber">
 									</div>
 								</div>
 								<div class="col-md-4">
@@ -145,7 +145,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 												<i class="fa fa-arrow-left"></i>
 											</a>
 										</label>
-										<input class='form-control' stag-input-phone type='tel' name='cellNumber' v-model="form.cellNumber">
+										<input class='form-control' autocomplete="_blank" stag-input-phone type='tel' name='cellNumber' v-model="form.cellNumber">
 									</div>
 								</div>
 								<div class="col-md-4">
@@ -159,12 +159,12 @@ $medicaidStates = Config::get('constants.medicaid_states');
 
 							<div class='form-group mb-3'>
 								<label class='control-label'>How did you hear about us?</label>
-								<input class='form-control' type='text' required="" name='initiative' />
+								<input class='form-control' type='text' name='initiative' />
 							</div>
 
 							<div class='form-group mb-3 checkbox'>
 								<label>
-									<input type='checkbox' name='isTestRecord' />	
+									<input type='checkbox' name='isTestRecord' />
 									This is a test record
 								</label>
 							</div>
@@ -194,7 +194,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 										<div class="row" v-show="planType == 'COMMERCIAL'">
 											<div class="form-group col-md-12">
 												<label for="" class="control-label">Commercial Payer</label>
-												<input name="commercialPayerUidSuggest" class="form-control input-sm" value="" stag-suggest stag-suggest-ep="/search-payer/json" />
+												<input name="commercialPayerUidSuggest" class="form-control input-sm" value="" autocomplete="off" stag-suggest stag-suggest-ep="/search-payer/json" />
 												<input type="hidden" name="commercialPayerUid" />
 											</div>
 											<div class="form-group col-md-6">
@@ -275,8 +275,8 @@ $medicaidStates = Config::get('constants.medicaid_states');
 												<div class="px-2">
 													<div class="form-group col-md-6">
 														<label for="" class="control-label">Medicaid State</label>
-														<input class="form-control input-sm" list="mcdPayer" name="mcdPayerName" id="mcdPayerName">
-														<datalist id="mcdPayer">
+														<input class="form-control input-sm" list="mcdPayerOptions" name="mcdPayerName" id="mcdPayerName">
+														<datalist id="mcdPayerOptions">
 															<option value="">--</option>
 															@foreach($medicaidStates as $state)
 															<option>{{ $state }}</option>
@@ -286,7 +286,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 
 													<div class="form-group col-md-6">
 														<label class="control-label">Medicaid Number</label>
-														<input type="text" name="mcdNumber" class="form-control input-sm">
+														<input type="text" name="mcdNumber" class="form-control input-sm" oninput="this.value = this.value.toUpperCase()">
 													</div>
 												</div>
 											</div>
@@ -302,7 +302,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 												<div class="px-2">
 													<div class="form-group col-md-6">
 														<label class="control-label">Medicare Number</label>
-														<input type="text" name="mcrNumber" class="form-control input-sm">
+														<input type="text" name="mcrNumber" class="form-control input-sm" oninput="this.value = this.value.toUpperCase()">
 													</div>
 												</div>
 											</div>
@@ -376,7 +376,16 @@ $medicaidStates = Config::get('constants.medicaid_states');
 						hiddenInput.val(_data.uid);
 					});
 			},
+			initOnInputChange: function() {
+				var form = $('#createNewPatientForm');
+				form.find('input[type=text],textarea').change(function() {
+					var value = this.value.replace(/\s\s+/g, ' ');
+					value = value.trim();
+					$(this).val(value);
+				});
+			},
 			init: function() {
+				this.initOnInputChange();
 				this.onCommercialPayerChange();
 			}
 		},
@@ -386,4 +395,4 @@ $medicaidStates = Config::get('constants.medicaid_states');
 	});
 </script>
 
-@endsection
+@endsection

+ 83 - 29
resources/views/app/patient/coverage-status.blade.php

@@ -1,28 +1,43 @@
 <div>
     @php
         $coverage = $patient->latestClientPrimaryCoverage;
+        $mcnDetails = json_decode($patient->mcn_response_detail ?? null);
     @endphp
     @if(!$coverage)
-        <span><b>No coverage info!</b></span>
+        <table class="table table-sm table-bordered">
+          <tr>
+            <td>
+              <b>No coverage info!</b>
+            </td>
+          </tr>
+        </table>
     @elseif($coverage->plan_type === 'MEDICARE')
       @if($coverage->creation_strategy == 'NEW' || $coverage->creation_strategy == 'AUTO_REFRESH')
       <table class="table table-sm table-bordered">
         <tr>
           <td class="font-weight-bold">Medicare Part B (Primary)</td>
           <td>
+            @if($mcnDetails && $mcnDetails->plan_details)
+            <span class="font-weight-bold">{{ $mcnDetails->plan_details->MC->payer_name }}</span> <br>
+              @foreach($mcnDetails->plan_details->MC->contacts as $contact)
+                @if($contact->contact_type == 'telephone')
+                  <a href="tel:{{ $contact->contact_value }}"><b><i class="fas fa-phone-alt"></i></b> {{ $contact->contact_value }}</a> <br>
+                @endif
+              @endforeach
+            @endif
             @if($coverage->auto_medicare_is_partbprimary == 'YES')
-              <span><i class="fas fa-check-circle text-success"></i> (auto)</span>
+              <span><i class="fas fa-check-circle text-success"></i> <b>Part B Primary:</b> YES (auto)</span> <br>
             @elseif(!$coverage->auto_medicare_is_match_found)
-              <span><i class="fas fa-times text-danger"></i> record not found (auto)</span>
+              <span><i class="fas fa-times text-danger"></i> record not found (auto)</span> <br>
             @else
-              <span><i class="fas fa-times text-danger"></i> {{$coverage->auto_medicare_is_partbprimary}}</span> <br>
               <span><i class="fas fa-check-circle text-success"></i> record found</span> <br>
-              <span><b>Part B:</b> {{$coverage->auto_medicare_is_partbactive}}</span> <br>
-              <span><b>Part C:</b> {{$coverage->auto_medicare_is_partcactive}}</span>
+              <span><i class="fas fa-times text-danger"></i> <b>Part B Primary:</b> {{$coverage->auto_medicare_is_partbprimary}}</span> <br>
+              <span><b>Part B Active:</b> {{$coverage->auto_medicare_is_partbactive}}</span> <br>
+              <span><b>Part C Active:</b> {{$coverage->auto_medicare_is_partcactive}}</span>
             @endif
           </td>
         </tr>
-        @if($coverage->auto_medicare_is_partbactive == 'YES' && $performer->pro->pro_type == 'ADMIN')
+        @if($coverage->auto_medicare_is_partbactive == 'YES' && !$coverage->auto_medicare_is_partcactive)
         <tr>
           <td class="font-weight-bold">Part B Deductible</td>
           <td>{{number_format($coverage->auto_medicare_mpb_deductible, 2, '.',',') ?? '-'}}</td>
@@ -32,25 +47,43 @@
           <td>{{number_format($coverage->auto_medicare_mpb_remaining,2, '.',',') ?? '-'}}</td>
         </tr>
         @endif
+        @if($coverage->manual_determination_category_memo)
+        <tr>
+          <td><b>Manual Determination Memo: </b></td>
+          <td>{{$coverage->manual_determination_category_memo}}</td>
+        </tr>
+        @endif
       </table>
       @else
+      <!-- Manual determination -->
       <table class="table table-sm table-bordered">
         <tr>
           <td class="font-weight-bold">Medicare Part B (Primary)</td>
           <td>
-            @if($coverage->manual_medicare_is_partbprimary)
-              <span><i class="fas fa-check-circle text-success"></i>  ({{$coverage->manual_determination_strategy}})</span>
-            @elseif(!$coverage->manual_medicare_is_match_found)
-            <span><i class="fas fa-times text-danger"></i> record not found ({{$coverage->manual_determination_strategy}})</span>
-            @else
-            <span><i class="fas fa-times text-danger"></i> not primary! ({{$coverage->manual_determination_strategy}})</span> <br>
-            <span><i class="fas fa-check-circle text-success"></i> record found</span> <br>
-            <span><b>Part B:</b> {{$coverage->manual_medicare_is_partbactive}}</span> <br>
-            <span><b>Part C:</b> {{$coverage->manual_medicare_is_partcactive}}</span>
+            @if($mcnDetails && $mcnDetails->plan_details)
+              <span class="font-weight-bold">{{ $mcnDetails->plan_details->MC->payer_name }}</span> <br>
+              @foreach($mcnDetails->plan_details->MC->contacts as $contact)
+                @if($contact->contact_type == 'telephone')
+                  <a href="tel:{{ $contact->contact_value }}"><b><i class="fas fa-phone-alt"></i></b> {{ $contact->contact_value }}</a> <br>
+                @endif
+              @endforeach
             @endif
+
+            @if($coverage->manual_medicare_is_partbprimary == 'YES')
+              <span><i class="fas fa-check-circle text-success"></i> <b>Part B Primary:</b> YES ({{$coverage->manual_determination_strategy}})</span> <br>
+            @elseif($coverage->manual_medicare_is_matched == 'NO')
+              <span><i class="fas fa-times text-danger"></i> record not found ({{$coverage->manual_determination_strategy}})</span> <br>
+            @else
+              <span><i class="fas fa-check-circle text-success"></i> record found</span> <br>
+              <span><i class="fas fa-times text-danger"></i> <b>Part B Primary:</b> {{$coverage->manual_medicare_is_partbprimary}}</span> <br>
+              <span><b>Part B Active:</b> {{$coverage->manual_medicare_is_partbactive}}</span> <br>
+              @if($coverage->manual_medicare_is_partcactive)
+              <span><b>Part C Active:</b> {{$coverage->manual_medicare_is_partcactive}}</span>
+              @endif
+              @endif
           </td>
         </tr>
-        @if($coverage->auto_medicare_is_partbactive && $performer->pro->pro_type == 'ADMIN')
+        @if($coverage->auto_medicare_is_partbactive && !$coverage->manual_medicare_is_partcactive)
         <tr>
           <td class="font-weight-bold">Part B Deductible</td>
           <td>{{number_format($coverage->auto_medicare_mpb_deductible,2,'.',',') ?? '-'}}</td>
@@ -60,11 +93,14 @@
           <td>{{number_format($coverage->auto_medicare_mpb_remaining, 2, '.',',') ?? '-'}}</td>
         </tr>
         @endif
+        @if($coverage->manual_determination_category_memo)
+        <tr>
+          <td><b>Manual Determination Memo: </b></td>
+          <td>{{$coverage->manual_determination_category_memo}}</td>
+        </tr>
+        @endif
       </table>
       @endif
-      <div class="w-50">
-        {{$coverage->manual_determination_category_memo}}
-      </div>
 
     @elseif($coverage->plan_type === 'MEDICAID')
       @if($coverage->creation_strategy == 'NEW' || $coverage->creation_strategy == 'AUTO_REFRESH')
@@ -72,7 +108,7 @@
         <tr>
           <td class="font-weight-bold">Medicaid (Primary):</td>
           <td>
-            <span><b>{{$coverage->mcd_payer_name ?? '-'}}</b></span> <br>
+            <span><b>{{$coverage->mcdPayer->name ?? '-'}}</b></span> <br>
             <span><i class="fas fa-hourglass-half text-warning"></i> Pending Validation</span> <br>
           </td>
         </tr>
@@ -80,6 +116,12 @@
           <td class="font-weight-bold">Date Created:</td>
           <td><span>{{date_format($coverage->created_at, 'm/d/Y')}}</span></td>
         </tr>
+        @if($coverage->manual_determination_category_memo)
+        <tr>
+          <td><b>Manual Determination Memo: </b></td>
+          <td>{{$coverage->manual_determination_category_memo}}</td>
+        </tr>
+        @endif
       </table>
       @else
         <table class="table table-sm table-bordered">
@@ -90,7 +132,7 @@
               @if($coverage->manual_determination_category == 'COVERED')
               <span><i class="fas fa-check-circle text-success"></i></span>
               @elseif($coverage->manual_determination_category == 'NOT_COVERED')
-              <span><i class="fas fa-check-circle text-danger"></i> record found</span> <br>
+              <span><i class="fas fa-check-circle text-success"></i> record found</span> <br>
               <span><i class="fas fa-times text-danger"></i> not covered ({{$coverage->manual_determination_strategy}})</span>
               @elseif($coverage->manual_determination_category == 'INVALID')
               <span><i class="fas fa-times text-danger"></i> record not found ({{$coverage->manual_determination_strategy}})</span>
@@ -99,11 +141,14 @@
               @endif
             </td>
           </tr>
+          @if($coverage->manual_determination_category_memo)
+          <tr>
+            <td><b>Manual Determination Memo: </b></td>
+            <td>{{$coverage->manual_determination_category_memo}}</td>
+          </tr>
+          @endif
         </table>
       @endif
-      <div class="w-50">
-        {{$coverage->manual_determination_category_memo}}
-      </div>
 
     @elseif($coverage->plan_type === 'COMMERCIAL')
       @if($coverage->creation_strategy == 'NEW' || $coverage->creation_strategy == 'AUTO_REFRESH')
@@ -119,6 +164,12 @@
           <td class="font-weight-bold">Date Created:</td>
           <td><span>{{date_format($coverage->created_at, 'm/d/Y')}}</span></td>
         </tr>
+        @if($coverage->manual_determination_category_memo)
+        <tr>
+          <td><b>Manual Determination Memo: </b></td>
+          <td>{{$coverage->manual_determination_category_memo}}</td>
+        </tr>
+        @endif
       </table>
       @else
         <table class="table table-sm table-bordered">
@@ -129,7 +180,7 @@
               @if($coverage->manual_determination_category == 'COVERED')
               <span><i class="fas fa-check-circle text-success"></i></span>
               @elseif($coverage->manual_determination_category == 'NOT_COVERED')
-              <span><i class="fas fa-check-circle text-danger"></i> record found</span> <br>
+              <span><i class="fas fa-check-circle text-success"></i> record found</span> <br>
               <span><i class="fas fa-times text-danger"></i> not covered ({{$coverage->manual_determination_strategy}})</span>
               @elseif($coverage->manual_determination_category == 'INVALID')
               <span><i class="fas fa-times text-danger"></i> record not found ({{$coverage->manual_determination_strategy}})</span>
@@ -138,10 +189,13 @@
               @endif
             </td>
           </tr>
+          @if($coverage->manual_determination_category_memo)
+          <tr>
+            <td><b>Manual Determination Memo: </b></td>
+            <td>{{$coverage->manual_determination_category_memo}}</td>
+          </tr>
+          @endif
         </table>
       @endif
-      <div class="w-50">
-        {{$coverage->manual_determination_category_memo}}
-      </div>
     @endif
 </div>

+ 5 - 8
resources/views/app/patient/note/dashboard_script.blade.php

@@ -209,16 +209,13 @@
                             editParent.removeClass('edit');
                         }
                         else {
+                            let docRoot = $('html');
+                            let prevEffectiveTop = editParent.offset().top - docRoot.scrollTop();
                             $('.note-section.edit').removeClass('edit');
                             editParent.addClass('edit');
-                            editParent[0].scrollIntoView({
-                                behavior: 'auto',
-                                block: "start",
-                                inline: "center"
-                            });
-                            $('html').scrollTop($('html').scrollTop() - 60);
-                            if(editParent.find('[autofocus]').length) {
-                                editParent.find('[autofocus]').first().focus();
+                            let newEffectiveTop = editParent.offset().top - docRoot.scrollTop();
+                            if(newEffectiveTop < prevEffectiveTop) {
+                                docRoot.scrollTop(docRoot.scrollTop() - (prevEffectiveTop - newEffectiveTop));
                             }
                         }
 

+ 2 - 0
resources/views/app/patient/notes.blade.php

@@ -228,7 +228,9 @@
                         <i class="fa fa-info-circle"></i>
                         <div class="position-absolute bg-white border rounded p-2 stag-tooltip-content">
                             <div class="text-nowrap small text-left pb-1">Created on <b>{{ friendly_date_time($note->created_at, true) }}</b></div>
+                            @if($note->createdSession && $note->createdSession->pro)
                             <div class="text-nowrap small text-left">Created by <b>{{ $note->createdSession->pro->displayName() }}</b></div>
+                            @endif
                         </div>
                     </div>
                 </td>

+ 11 - 10
resources/views/app/patient/primary-coverage-form.blade.php

@@ -1,9 +1,10 @@
 <?php
-$medicaidStates = Config::get('constants.medicaid_states');
+	$medicaidStates = Config::get('constants.medicaid_states');
+	$cpc = $patient->latestClientPrimaryCoverage;
 ?>
 	<div id="new-coverage-form-{{$patient->uid}}">
 		<div class="p-3">
-			<form :url="url" class="mcp-theme-1" @submit.prevent="submitForm">
+			<form :url="url" class="mcp-theme-1" @submit.prevent="submitForm" autocomplete="off">
 				<input type="hidden" name="clientUid" value="{{$patient->uid}}" class="form-control input-sm" />
 				<div class="row">
 					<div class="form-group col-md-12">
@@ -59,11 +60,11 @@ $medicaidStates = Config::get('constants.medicaid_states');
 					</div>
 					<div class="form-group col-md-4">
 						<label class="control-label">Patient Sex</label>
-						<select class="form-control input-sm" name="patientSex" select2>
+						<select class="form-control input-sm" name="sex" select2>
 							<option value="">--</option>
-							<option value="M">Male</option>
-							<option value="F">Female</option>
-							<option value="UNKNOWN">Unknown</option>
+							<option value="M" @if($patient->sex === 'M') selected @endif>Male</option>
+							<option value="F"  @if($patient->sex === 'F') selected @endif>Female</option>
+							<option value="UNKNOWN"  @if($patient->sex === 'UNKNOWN') selected @endif>Unknown</option>
 						</select>
 					</div>
 					<div class="form-group col-md-4">
@@ -144,8 +145,8 @@ $medicaidStates = Config::get('constants.medicaid_states');
 					</div>
 					<div class="form-group col-md-6">
 						<label for="" class="control-label">Medicaid State</label>
-						<input class="form-control input-sm" list="mcdPayer" name="mcdPayerUid" id="mcdPayerUid">
-						<datalist id="mcdPayer">
+						<input class="form-control input-sm" list="mcdPayerOptions" name="mcdPayerName" id="mcdPayerName">
+						<datalist id="mcdPayerOptions">
 							<option value="">--</option>
 							@foreach($medicaidStates as $state)
               <option>{{$state}}</option>
@@ -155,7 +156,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 
 					<div class="form-group col-md-6">
 						<label class="control-label">Medicaid Number</label>
-						<input type="text" name="mcdNumber" class="form-control input-sm">
+						<input type="text" name="mcdNumber" class="form-control input-sm" value="{{ $cpc->mcd_number ?? '' }}" oninput="this.value = this.value.toUpperCase()">
 					</div>
 				</div>
 
@@ -165,7 +166,7 @@ $medicaidStates = Config::get('constants.medicaid_states');
 					</div>
 					<div class="form-group col-md-6">
 						<label class="control-label">Medicare Number</label>
-						<input type="text" name="mcrNumber" class="form-control input-sm">
+						<input type="text" name="mcrNumber" class="form-control input-sm" value="{{ $cpc->mcr_number ?? '' }}" oninput="this.value = this.value.toUpperCase()">
 					</div>
 
 				</div>

+ 20 - 9
resources/views/app/patient/primary-coverage-manual-determination-commercial-modal.blade.php

@@ -3,6 +3,17 @@
 	$cpc = $patient->latestClientPrimaryCoverage;
 	@endphp
 	<div class="p-3">
+		@if($cpc->mcd_number)
+		<div class="mb-2">
+			<span><b>Medicaid Number:</b> {{$cpc->mcd_number}}</span>
+			<span class="ml-3"><b>Medicaid State:</b> {{$cpc->mcd_payer_id ? $cpc->mcdPayer->name : '-'}}</span>
+		</div>
+		@endif
+		@if($cpc->mcr_number)
+		<div class="mb-2">
+			<b>Medicare Number:</b> {{$cpc->mcr_number}}
+		</div>
+		@endif
 		<form @submit.prevent="submitForm" method="post" class="mcp-theme-1">
 			<input type="hidden" name="clientPrimaryCoverageUid" value="{{$cpc->uid}}" class="form-control input-sm" />
 			<div class="row">
@@ -20,9 +31,9 @@
 				<table class="table table-sm table-bordered table-striped">
 					<thead>
 						<tr>
-							<th></th>
-							<th>Automatic</th>
-							<th>Override</th>
+							<th class="border-bottom-0"></th>
+							<th class="border-bottom-0">Automatic</th>
+							<th class="border-bottom-0">Override</th>
 						</tr>
 					</thead>
 					<tbody>
@@ -30,7 +41,7 @@
 							<td>Record Found?</td>
 							<td>{{$cpc->auto_commercial_is_match_found ? 'YES' : 'NO'}}</td>
 							<td>
-								<div class="form-group">
+								<div class="form-group mb-0">
 									<div class="form-check form-check-inline">
 										<label class="form-check-label"><input class="form-check-input" type="radio" name="manualCommercialIsMatched" value="YES" @change="onInputChange">Yes</label>
 									</div>
@@ -44,9 +55,9 @@
 							<td>Coverage Status?</td>
 							<td>UNKNOWN</td>
 							<td>
-								<select name="manualDeterminationCategory" class="form-control input-sm" @change="onInputChange">
-									<option value="">--select--</option>
-									<option value="COVERED" :selected="uiState.manualCommercialIsMatched == 'YES'">Covered</option>
+								<select name="manualDeterminationCategory" class="form-control input-sm" @change="onInputChange" required>
+									<option value="" :selected="uiState.manualCommercialIsMatched == 'YES'">--select--</option>
+									<option value="COVERED">Covered</option>
 									<option value="NOT_COVERED">Not Covered</option>
 									<option value="INVALID" :selected="uiState.manualCommercialIsMatched == 'NO'">Invalid</option>
 									<option value="UNKNOWN">Unknown</option>
@@ -66,7 +77,7 @@
 						</tr>
 						<tr>
 							<td>Medicaid State</td>
-							<td>{{$cpc->mcd_payer_name ?? '-'}}</td>
+							<td>{{$cpc->mcd_payer_name ? $cpc->mcdPayer->name : '-'}}</td>
 						</tr>
 						<tr>
 							<td>Was Medicaid Record Found?</td>
@@ -138,7 +149,7 @@
 						<tr>
 							<td>Is Part C Active?</td>
 							<td>{{$cpc->auto_medicare_is_partcactive}}</td>
-							<td>
+							<td style="max-width:200px;">
 								<div class="alert alert-danger" v-if="(cpc.auto_medicare_is_partcactive == 'YES' && cpc.auto_medicare_is_partbprimary == 'YES') || (uiState.manualMedicareIsPartBPrimary == 'YES' && uiState.manualMedicareIsPartCActive == 'YES')">
 									Oops! Patient Medicare Part B Primary is set to <b>Yes</b>.
 								</div>

+ 13 - 7
resources/views/app/patient/primary-coverage-manual-determination-medicaid-modal.blade.php

@@ -3,6 +3,12 @@
 	$cpc = $patient->latestClientPrimaryCoverage;
 	@endphp
 	<div class="p-3">
+		@if($cpc->mcd_number)
+		<div class="mb-2">
+			<span><b>Medicaid Number:</b> {{$cpc->mcd_number}}</span>
+			<span class="ml-3"><b>Medicaid State:</b> {{$cpc->mcd_payer_id ? $cpc->mcdPayer->name : '-'}}</span>
+		</div>
+		@endif
 		<form @submit.prevent="submitForm" method="post" class="mcp-theme-1">
 			<input type="hidden" name="clientPrimaryCoverageUid" value="{{$cpc->uid}}" class="form-control input-sm" />
 			<div class="row">
@@ -20,9 +26,9 @@
 				<table class="table table-sm table-bordered table-striped">
 					<thead>
 						<tr>
-							<th></th>
-							<th>Automatic</th>
-							<th>Override</th>
+							<th class="border-bottom-0"></th>
+							<th class="border-bottom-0">Automatic</th>
+							<th class="border-bottom-0">Override</th>
 						</tr>
 					</thead>
 					<tbody>
@@ -30,7 +36,7 @@
 							<td>Record Found?</td>
 							<td>{{$cpc->auto_medicaid_is_match_found ? 'YES' : 'NO'}}</td>
 							<td>
-								<div class="form-group">
+								<div class="form-group mb-0">
 									<div class="form-check form-check-inline">
 										<label class="form-check-label"><input class="form-check-input" type="radio" name="manualMedicaidIsMatched" value="YES" :checked="uiState.manualMedicaidIsMatched === 'YES'" @change="inputChange">Yes</label>
 									</div>
@@ -44,9 +50,9 @@
 							<td>Coverage Status?</td>
 							<td>UNKNOWN</td>
 							<td>
-								<select name="manualDeterminationCategory" class="form-control input-sm" @change="inputChange">
-									<option value="">--select--</option>
-									<option value="COVERED" :selected="uiState.manualMedicaidIsMatched == 'YES'">Covered</option>
+								<select name="manualDeterminationCategory" class="form-control input-sm" required @change="inputChange">
+									<option value="" :selected="uiState.manualMedicaidIsMatched == 'YES'">--select--</option>
+									<option value="COVERED">Covered</option>
 									<option value="NOT_COVERED">Not Covered</option>
 									<option value="INVALID" :selected="uiState.manualMedicaidIsMatched == 'NO'">Invalid</option>
 									<option value="UNKNOWN">Unknown</option>

+ 10 - 8
resources/views/app/patient/primary-coverage-manual-determination-medicare-modal.blade.php

@@ -3,6 +3,11 @@
 	$cpc = $patient->latestClientPrimaryCoverage;
 	@endphp
 	<div class="p-3">
+		@if($cpc->mcr_number)
+		<div class="mb-2">
+			<b>Medicare Number:</b> {{$cpc->mcr_number}}
+		</div>
+		@endif
 		<form @submit.prevent="submitForm" method="post" class="mcp-theme-1">
 			<input type="hidden" name="clientPrimaryCoverageUid" value="{{$cpc->uid}}" class="form-control input-sm" />
 			<div class="row">
@@ -20,9 +25,9 @@
 				<table class="table table-sm table-bordered table-striped">
 					<thead>
 						<tr>
-							<th></th>
-							<th>Automatic</th>
-							<th>Override</th>
+							<th class="border-bottom-0"></th>
+							<th class="border-bottom-0">Automatic</th>
+							<th class="border-bottom-0">Override</th>
 						</tr>
 					</thead>
 					<tbody>
@@ -40,9 +45,6 @@
 								</div>
 							</td>
 						</tr>
-
-
-
 						<tr>
 							<td>Part B Active?</td>
 							<td>{{$cpc->auto_medicare_is_partbactive}}</td>
@@ -82,8 +84,8 @@
 						<tr>
 							<td>Is Part C Active?</td>
 							<td>{{$cpc->auto_medicare_is_partcactive}}</td>
-							<td>
-								<div class="alert alert-danger" v-if="(cpc.auto_medicare_is_partcactive == 'YES' && cpc.auto_medicare_is_partbprimary == 'YES') || (uiState.manualMedicareIsPartBPrimary == 'YES' && uiState.manualMedicareIsPartCActive == 'YES')">
+							<td style="max-width:200px;">
+								<div class="alert alert-danger p-1 mb-1" v-if="(cpc.auto_medicare_is_partcactive == 'YES' && cpc.auto_medicare_is_partbprimary == 'YES') || (uiState.manualMedicareIsPartBPrimary == 'YES' && uiState.manualMedicareIsPartCActive == 'YES')">
 									Oops! Patient Medicare Part B Primary is set to <b>Yes</b>.
 								</div>
 								<div class="form-group mb-0">

+ 9 - 5
resources/views/app/patient/primary-coverage-manual-determination-view-commercial.blade.php

@@ -3,9 +3,9 @@
 	<table class="table table-sm table-bordered table-striped">
 		<thead>
 			<tr>
-				<th></th>
-				<th>Automatic</th>
-				<th>Override</th>
+				<th class="border-bottom-0"></th>
+				<th class="border-bottom-0">Automatic</th>
+				<th class="border-bottom-0">Override</th>
 			</tr>
 		</thead>
 		<tbody>
@@ -13,7 +13,7 @@
 				<td>Record Found?</td>
 				<td>{{$cpc->auto_commercial_is_match_found ? 'YES' : 'NO'}}</td>
 				<td>
-					<div class="form-group">
+					<div class="form-group mb-0">
 						<p class="mb-1 text-secondary">Manual Determination Category</p>
 						<span>{{$cpc->manual_determination_category ?? '-'}}</span>
 					</div>
@@ -34,7 +34,7 @@
 				<td>Part B Primary?</td>
 				<td>{{$cpc->auto_medicare_is_partbprimary}}</td>
 				<td>
-					<div class="form-group">
+					<div class="form-group mb-1">
 						<p class="mb-1 text-secondary">Manual Determination Category</p>
 						<span>{{$cpc->manual_determination_category  ?? '-'}}</span>
 					</div>
@@ -97,6 +97,10 @@
 					</div>
 				</td>
 			</tr>
+			<tr>
+				<td>Memo</td>
+				<td colspan="2">{{$cpc->manual_determination_category_memo ?? '-'}}</td>
+			</tr>
 		</tbody>
 	</table>
 </div>

+ 9 - 5
resources/views/app/patient/primary-coverage-manual-determination-view-medicaid.blade.php

@@ -3,9 +3,9 @@
 	<table class="table table-sm table-bordered table-striped">
 		<thead>
 			<tr>
-				<th></th>
-				<th>Automatic</th>
-				<th>Override</th>
+				<th class="border-bottom-0"></th>
+				<th class="border-bottom-0">Automatic</th>
+				<th class="border-bottom-0">Override</th>
 			</tr>
 		</thead>
 		<tbody>
@@ -13,7 +13,7 @@
 				<td>Record Found?</td>
 				<td>{{$cpc->auto_medicaid_is_match_found ? 'YES' : 'NO'}}</td>
 				<td>
-					<div class="form-group">
+					<div class="form-group mb-0">
 						<p class="mb-1 text-secondary">Is Matched?</p>
 						<span>{{$cpc->manual_medicaid_is_matched ?? '-'}}</span>
 					</div>
@@ -23,12 +23,16 @@
 				<td>Coverage Status?</td>
 				<td>UNKNOWN</td>
 				<td>
-					<div class="form-group">
+					<div class="form-group mb-0">
 						<p class="mb-1 text-secondary">Manual Determination Category</p>
 						<span>{{$cpc->manual_determination_category ?? '-'}}</span>
 					</div>
 				</td>
 			</tr>
+			<tr>
+				<td>Memo</td>
+				<td colspan="2">{{$cpc->manual_determination_category_memo ?? '-'}}</td>
+			</tr>
 		</tbody>
 	</table>
 </div>

+ 9 - 5
resources/views/app/patient/primary-coverage-manual-determination-view-medicare.blade.php

@@ -3,9 +3,9 @@
 	<table class="table table-sm table-bordered table-striped">
 		<thead>
 			<tr>
-				<th></th>
-				<th>Automatic</th>
-				<th>Override</th>
+				<th class="border-bottom-0"></th>
+				<th class="border-bottom-0">Automatic</th>
+				<th class="border-bottom-0">Override</th>
 			</tr>
 		</thead>
 		<tbody>
@@ -17,7 +17,7 @@
 				<td>Record Found?</td>
 				<td>{{$cpc->auto_medicare_is_match_found ? 'YES' : 'NO'}}</td>
 				<td>
-					<div class="form-group">
+					<div class="form-group mb-0">
 						<p class="mb-1 text-secondary">Is Matched?</p>
 						<span>{{$cpc->manual_medicare_is_matched ?? '-'}}</span>
 					</div>
@@ -39,7 +39,7 @@
 				<td>Part B Primary?</td>
 				<td>{{$cpc->auto_medicare_is_partbprimary}}</td>
 				<td>
-					<div class="form-group">
+					<div class="form-group mb-1">
 						<p class="mb-1 text-secondary">Manual Determination Category</p>
 						<span>{{$cpc->manual_determination_category  ?? '-'}}</span>
 					</div>
@@ -103,6 +103,10 @@
 					</div>
 				</td>
 			</tr>
+			<tr>
+				<td>Memo</td>
+				<td colspan="2">{{$cpc->manual_determination_category_memo ?? '-'}}</td>
+			</tr>
 		</tbody>
 	</table>
 </div>

+ 120 - 98
resources/views/app/patient/primary-coverage-view.blade.php

@@ -1,116 +1,138 @@
-<h4 class="font-weight-bold">Patient Name / Demographics</h4>
-<div class="table-responsive">
-	<table class="table table-sm table-bordered table-striped">
-		<tbody>
-			<tr>
-				<td>Patient First Name</td>
-				<td>{{$cpc->patient_name_first}}</td>
-			</tr>
-			<tr>
-				<td>Patient Middle Name / MI</td>
-				<td>{{$cpc->patient_name_middle}}</td>
-			</tr>
-			<tr>
-				<td>Patient Last Name</td>
-				<td>{{$cpc->patient_name_last}}</td>
-			</tr>
-			<tr>
-				<td>Patient Suffix</td>
-				<td>{{$cpc->patient_name_suffix}}</td>
-			</tr>
-			<tr>
-				<td>Patient Dob</td>
-				<td>{{$cpc->patient_dob ? date_format(date_create($cpc->patient_dob), 'm/d/Y') : '-'}}</td>
-			</tr>
-			<tr>
-				<td>Patient Sex</td>
-				<td>{{$cpc->patient_sex ?? '-'}}</td>
-			</tr>
-		</tbody>
-	</table>
-</div>
+<div class="container-fluid px-lg-0">
+	<div class="row">
+		<div class="col-lg-5">
+			<h4 class="font-weight-bold">Patient Name / Demographics</h4>
+			<div class="table-responsive">
+				<table class="table table-sm table-bordered table-striped">
+					<tbody>
+						<tr>
+							<td>Patient First Name</td>
+							<td>{{$cpc->patient_name_first}}</td>
+						</tr>
+						<tr>
+							<td>Patient Middle Name / MI</td>
+							<td>{{$cpc->patient_name_middle}}</td>
+						</tr>
+						<tr>
+							<td>Patient Last Name</td>
+							<td>{{$cpc->patient_name_last}}</td>
+						</tr>
+						<tr>
+							<td>Patient Suffix</td>
+							<td>{{$cpc->patient_name_suffix}}</td>
+						</tr>
+						<tr>
+							<td>Patient Dob</td>
+							<td>{{$cpc->patient_dob ? date_format(date_create($cpc->patient_dob), 'm/d/Y') : '-'}}</td>
+						</tr>
+						<tr>
+							<td>Patient Sex</td>
+							<td>{{$cpc->patient_sex ?? '-'}}</td>
+						</tr>
+					</tbody>
+				</table>
+			</div>
 
-<h4 class="font-weight-bold">Primary Coverage Information</h4>
-<div id="primaryCoverageLatestCoverage">
-	<div class="table-responsive">
-	<table class="table table-sm table-bordered table-striped">
-		<tbody>
-			<tr>
-				<td>Plan Type</td>
-				<td>{{$cpc->plan_type}}</td>
-			</tr>
-			<tr v-if="cpc.plan_type == 'COMMERCIAL'">
-				<td>Commercial Payer</td>
-				<td>{{$cpc->commercial_payer_id ? $cpc->payer->name : '-'}}</td>
-			</tr>
-			<tr v-if="cpc.plan_type == 'COMMERCIAL'">
-				<td>Patient Member Identifier</td>
-				<td>{{$cpc->commercial_member_identifier ?? '-'}}</td>
-			</tr>
-			<tr v-if="cpc.plan_type == 'COMMERCIAL'">
-				<td>Patient Group Name</td>
-				<td>{{$cpc->commercial_group_number ?? '-'}}</td>
-			</tr>
-			<tr>
-				<td>Date of Service</td>
-				<td>{{$cpc->date_of_service ? date_format(date_create($cpc->date_of_service), 'm/d/Y') : '-'}}</td>
-			</tr>
-			<tr v-if="cpc.plan_type == 'COMMERCIAL' || cpc.plan_type == 'MEDICAID'">
-				<td colspan="2">
-					<h5 class="font-weight-bold">Subscriber Details</h5>
-					<table class="table table-bordered table-striped">
+			<h4 class="font-weight-bold">Primary Coverage Information</h4>
+			<div id="primaryCoverageLatestCoverage">
+				<div class="table-responsive">
+					<table class="table table-sm table-bordered table-striped">
 						<tbody>
 							<tr>
-								<td>Is Patient the subscriber?</td>
-								<td>{{$cpc->is_patient_subscriber ? 'Yes' : 'No'}}</td>
+								<td>Plan Type</td>
+								<td>{{$cpc->plan_type}}</td>
 							</tr>
-							@if(!$cpc->is_patient_subscriber)
-							<tr>
-								<td>First Name</td>
-								<td>{{$cpc->subscriber_name_first ?? '-'}}</td>
+							<tr v-if="cpc.plan_type == 'COMMERCIAL'">
+								<td>Commercial Payer</td>
+								<td>{{$cpc->commercial_payer_id ? $cpc->payer->name : '-'}}</td>
 							</tr>
-							<tr>
-								<td>Middle Name / MI</td>
-								<td>{{$cpc->subscriber_name_middle ?? '-'}}</td>
+							<tr v-if="cpc.plan_type == 'COMMERCIAL'">
+								<td>Patient Member Identifier</td>
+								<td>{{$cpc->commercial_member_identifier ?? '-'}}</td>
 							</tr>
-							<tr>
-								<td>Last Name</td>
-								<td>{{$cpc->subscriber_name_last ?? '-'}}</td>
+							<tr v-if="cpc.plan_type == 'COMMERCIAL'">
+								<td>Patient Group Name</td>
+								<td>{{$cpc->commercial_group_number ?? '-'}}</td>
 							</tr>
-							<tr>
-								<td>Suffix</td>
-								<td>{{$cpc->subscriber_name_suffix ?? '-'}}</td>
+							<tr v-if="cpc.plan_type == 'COMMERCIAL' || cpc.plan_type == 'MEDICAID'">
+								<td colspan="2">
+									<h5 class="font-weight-bold">Subscriber Details</h5>
+									<div class="table-responsive">
+										<table class="table table-bordered">
+											<tbody>
+												<tr class="bg-white">
+													<td>Is Patient the subscriber?</td>
+													<td>{{$cpc->is_patient_subscriber ? 'Yes' : 'No'}}</td>
+												</tr>
+												@if(!$cpc->is_patient_subscriber)
+												<tr class="bg-white">
+													<td>First Name</td>
+													<td>{{$cpc->subscriber_name_first ?? '-'}}</td>
+												</tr>
+												<tr class="bg-white">
+													<td>Middle Name / MI</td>
+													<td>{{$cpc->subscriber_name_middle ?? '-'}}</td>
+												</tr>
+												<tr class="bg-white">
+													<td>Last Name</td>
+													<td>{{$cpc->subscriber_name_last ?? '-'}}</td>
+												</tr>
+												<tr class="bg-white">
+													<td>Suffix</td>
+													<td>{{$cpc->subscriber_name_suffix ?? '-'}}</td>
+												</tr>
+												<tr class="bg-white">
+													<td>Sex</td>
+													<td>{{$cpc->subscriber_sex ?? '-'}}</td>
+												</tr>
+												<tr class="bg-white">
+													<td>Dob</td>
+													<td>{{$cpc->subscriber_dob ? date_format(date_create($cpc->subscriber_dob), 'm/d/Y') : '-'}}</td>
+												</tr>
+												@endif
+											</tbody>
+										</table>
+									</div>
+								</td>
 							</tr>
 							<tr>
-								<td>Sex</td>
-								<td>{{$cpc->subscriber_sex ?? '-'}}</td>
+								<td>Date of Service</td>
+								<td>{{$cpc->date_of_service ? date_format(date_create($cpc->date_of_service), 'm/d/Y') : '-'}}</td>
 							</tr>
-							<tr>
-								<td>Dob</td>
-								<td>{{$cpc->subscriber_dob ? date_format(date_create($cpc->subscriber_dob), 'm/d/Y') : '-'}}</td>
+							<tr v-if="cpc.plan_type == 'MEDICAID' || (cpc.plan_type == 'COMMERCIAL' && cpc.mcd_number)">
+								<td>Medicaid State</td>
+								<td>{{$cpc->mcd_payer_id ? $cpc->mcdPayer->name : '-'}}</td>
+							</tr>
+							<tr v-if="cpc.plan_type == 'MEDICAID' || (cpc.plan_type == 'COMMERCIAL' && cpc.mcd_number)">
+								<td>Medicaid Number</td>
+								<td class="text-uppercase">{{$cpc->mcd_number ?? '-'}}</td>
+							</tr>
+							<tr v-if="cpc.plan_type == 'MEDICARE' || (cpc.plan_type == 'COMMERCIAL' && cpc.mcr_number)">
+								<td>Medicare Number</td>
+								<td class="text-uppercase">{{$cpc->mcr_number ?? '-'}}</td>
 							</tr>
-							@endif
 						</tbody>
 					</table>
-				</td>
-			</tr>
+				</div>
+			</div>
 
-			<tr v-if="cpc.plan_type == 'MEDICAID' || (cpc.plan_type == 'COMMERCIAL' && cpc.mcd_number)">
-				<td>Medicaid State</td>
-				<td>{{$cpc->mcd_payer_id ?? '-'}}</td>
-			</tr>
-			<tr v-if="cpc.plan_type == 'MEDICAID' || (cpc.plan_type == 'COMMERCIAL' && cpc.mcd_number)">
-				<td>Medicaid Number</td>
-				<td>{{$cpc->mcd_number ?? '-'}}</td>
-			</tr>
-			<tr v-if="cpc.plan_type == 'MEDICARE' || (cpc.plan_type == 'COMMERCIAL' && cpc.mcr_number)">
-				<td>Medicare Number</td>
-				<td>{{$cpc->mcr_number ?? '-'}}</td>
-			</tr>
-		</tbody>
-	</table>
-</div>
+		</div>
+		<div class="col-lg-7">
+
+			<h4 class="font-weight-bold">Manual Determination Information</h4>
+			@if($cpc->plan_type == 'MEDICARE')
+				@include('app.patient.primary-coverage-manual-determination-view-medicare')
+			@elseif($cpc->plan_type == 'MEDICAID')
+			@include('app.patient.primary-coverage-manual-determination-view-medicaid')
+			@elseif($cpc->plan_type == 'COMMERCIAL')
+			@include('app.patient.primary-coverage-manual-determination-view-commercial')
+			@else
+				No plan Type specified.
+			@endif
+		</div>
+	</div>
 </div>
+
 <script type="text/javascript">
 	var primaryCoverageLatestCoverage = new Vue({
 		el: '#primaryCoverageLatestCoverage',

+ 9 - 26
resources/views/app/patient/primary-coverage.blade.php

@@ -64,37 +64,20 @@
 
         <div class="mt-4">
           <div class="row">
-            <div class="col-md-9">
-
+            <div class="col-md-12">
               @include('app.patient.primary-coverage-view')
-
-              <h4 class="font-weight-bold">Manual Determination Information</h4>
-              @if($cpc->plan_type == 'MEDICARE')
-                @include('app.patient.primary-coverage-manual-determination-view-medicare')
-              @elseif($cpc->plan_type == 'MEDICAID')
-              @include('app.patient.primary-coverage-manual-determination-view-medicaid')
-              @elseif($cpc->plan_type == 'COMMERCIAL')
-              @include('app.patient.primary-coverage-manual-determination-view-commercial')
-              @else
-                No plan Type specified.
-              @endif
             </div>
           </div>
-
             {{--
-              @php
-              dump(json_decode($cpc->toJson(JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)));
-              @endphp
-               --}}
-
-        </div>
-
-        <div>
+            @php
+            dump(json_decode($cpc->toJson(JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)));
+            @endphp
+            --}}
             {{--
-              @php
-                  dump($cpc->auto_detail_json);
-              @endphp
-              --}}
+            @php
+            dump($cpc->auto_detail_json);
+            @endphp
+            --}}
         </div>
     @endif
 </div>

+ 1 - 1
resources/views/app/patient/segment-templates/chief_complaint/edit.blade.php

@@ -50,7 +50,7 @@ if(!$parsed || !@$parsed->free_text) {
              class="form-group mb-2 border-left border-right rte-holder"
              data-field-name="free_text"
         ><?= $parsed && @$parsed->free_text ? $parsed->free_text : '' ?></div>
-        <div>
+        <div class="m-2">
             <button submit class="btn btn-sm btn-primary mr-2"><i class="fa fa-save"></i></button>
             <div class="d-inline-flex align-self-stretch align-items-center">
                 <span class="autosave-indicator saving text-sm text-secondary">Saving changes &hellip;</span>

+ 2 - 2
resources/views/app/patient/segment-templates/disclaimers/edit.blade.php

@@ -18,8 +18,8 @@ if (!!@$point->data) {
     $contentData = json_decode($point->data, true);
 }
 ?>
-<div visit-moe close-on-save close-on-cancel class="d-block">
-    <form show url="/api/visitPoint/<?= $endPoint ?>" class="mcp-theme-1 mt-2">
+<div visit-moe close-on-save close-on-cancel class="d-block p-3">
+    <form show url="/api/visitPoint/<?= $endPoint ?>" class="mcp-theme-1">
         <input type="hidden" name="segmentUid" value="<?= $segment->uid ?>">
         <input type="hidden" name="category" value="<?= $category ?>">
         <input type="hidden" name="data" value="{{json_encode($contentData)}}">

+ 1 - 1
resources/views/app/patient/settings.blade.php

@@ -997,7 +997,7 @@
 
                 <hr class="m-negator-3 my-3">
                 <span>MCP: <b>{{ $patient->mcp ? $patient->mcp->displayName() : '-' }}</b></span>
-                @if($pro->pro_type == 'ADMIN')
+                @if($pro->pro_type == 'ADMIN' || $pro->id == $patient->default_na_pro_id)
                     <div moe class="ml-2">
                         <a start show><i class="fa fa-edit"></i></a>
                         <form url="/api/client/putMcp" class="mcp-theme-1">

+ 5 - 6
resources/views/layouts/patient.blade.php

@@ -246,7 +246,7 @@ $isOldClient = (date_diff(date_create(config('app.point_impl_date')), date_creat
 						<li class="nav-item">
 							<a class="nav-link" href="/patients/view/{{ $patient->uid }}/intake">Intake</a>
 						</li>
-						@if($performer->pro->pro_type == 'ADMIN')
+						@if($performer->pro->pro_type == 'ADMIN' || $performer->pro->id == $patient->default_na_pro_id)
 						<li class="nav-item">
 							<a class="nav-link {{ strpos($routeName, 'patients.view.mcp-requests') === 0 ? 'active' : '' }}"
 							   href="{{ route('patients.view.mcp-requests', $patient) }}">MCP Requests</a>
@@ -394,7 +394,7 @@ $isOldClient = (date_diff(date_create(config('app.point_impl_date')), date_creat
 											</div>
 										</div>
 										<div class="screen-only">
-											<div class=separators>											
+											<div class=separators>
 												<div>
 													<label>MCP:</label> {{$mcpName}}
 													@if($patient->has_mcp_done_onboarding_visit !== 'YES' && $pro->pro_type == 'ADMIN')
@@ -510,7 +510,7 @@ $isOldClient = (date_diff(date_create(config('app.point_impl_date')), date_creat
 												@endif
 											</div>
 											</div>
-										
+
 										<div>
 											<label>Physician:</label> {{$patient->pcp ? $patient->pcp->displayName() : '-' }}
 											@if($pro->pro_type == 'ADMIN')
@@ -560,7 +560,7 @@ $isOldClient = (date_diff(date_create(config('app.point_impl_date')), date_creat
                               @endif
                           @endif
                       </div>
-											
+
                                         </div>
                                     </section>
                                     {{--<section>
@@ -738,10 +738,9 @@ $isOldClient = (date_diff(date_create(config('app.point_impl_date')), date_creat
 																									class="on-hover-opaque fa fa-video text-secondary"></i>&nbsp;Join</button>
 																				</div>
                                     </section>
-									
 									@if(!$patient->getPrimaryCoverage() || $patient->getPrimaryCoverageStatus() !== 'YES')
 									<section class="hide-inside-popup screen-only vbox align-self-start mt-2 mx-2">
-											@include('app.patient.coverage-status')										
+											@include('app.patient.coverage-status')
 									</section>
 									@endif
 									<ul class="vbox mt-2 align-self-start patient-header-address ml-auto">

+ 3 - 3
routes/web.php

@@ -345,7 +345,7 @@ Route::middleware('pro.auth')->group(function () {
 
     });
 
-    Route::middleware('pro.auth.admin')->group(function () {
+    // Route::middleware('pro.auth.admin')->group(function () {
         Route::get('patients/view/mcp-requests/{patient?}', 'PatientController@mcpRequests')->name('patients.view.mcp-requests');
         Route::get('patients/view/eligible-refreshes/{patient}', 'PatientController@eligibleRefreshes')->name('patients.view.eligible-refreshes');
         Route::get('patients/view/insurance-coverage/{patient}', 'PatientController@insuranceCoverage')->name('patients.view.insurance-coverage');
@@ -353,7 +353,7 @@ Route::middleware('pro.auth')->group(function () {
         Route::get('patients/view/primary-coverage/{patient}', 'PatientController@primaryCoverage')->name('patients.view.primary-coverage');
         Route::get('patients/view/primary-coverage-form/{patient}', 'PatientController@primaryCoverageForm')->name('patients.view.primary-coverage-form');
         Route::get('patients/view/primary-coverage-manual-determination-modal/{patient}', 'PatientController@primaryCoverageManualDeterminationModal')->name('patients.view.primary-coverage-manual-determination-modal');
-    });
+    // });
 
     Route::name('patients.view.')->prefix('patients/view/{patient}')->group(function () {
 
@@ -596,4 +596,4 @@ Route::get("/get-default-section-data/{patientID}/{sectionTemplateID}", 'NoteCon
 
 Route::get("/get-segment-html/{segmentUid}/{sessionKey}", 'NoteController@getHtmlForSegment')->name('get_segment_html');
 
-Route::any("/nop", 'HomeController@nop')->name('nop');
+Route::any("/nop", 'HomeController@nop')->name('nop');

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません