فهرست منبع

Support for hourly and flat rates for Note NA bills

Vijayakrishnan 3 سال پیش
والد
کامیت
048d710d6d

+ 121 - 0
resources/views/app/generic-bills/add-bill-form/Note-script.blade.php

@@ -0,0 +1,121 @@
+<script>
+    /*
+
+start:
+	if only one rate
+		if hourly
+			show minutes select
+		else
+			show reimb amount
+		end if
+	else
+		show rate select
+	end if
+
+----
+
+on rate select change
+	if selected rate is hourly
+		show minutes select
+	else
+		show reimb amount
+	end if
+
+----
+
+on minutes select change
+	show reimb amount
+
+     */
+
+    (function() {
+        function init() {
+
+            let selectedAmount = 0, selectedType = '';
+
+            window.switchGenericRate = function (_trigger) {
+                _trigger = $(_trigger);
+
+                _trigger.closest('form').find('[calculated-generic-amount]').text('');
+
+                let type = '', amount = '';
+                if(_trigger.is('select')) {
+                    let selectedOption = _trigger.find('option:selected').first();
+                    if(selectedOption.length) {
+                        type = selectedOption.attr('data-rate-type');
+                        amount = +(selectedOption.attr('data-amount'));
+                    }
+                }
+                else { // only one rate
+                    type = _trigger.attr('data-rate-type');
+                    amount = +(_trigger.attr('data-amount'));
+                }
+
+                if(!type || !amount) {
+                    return false;
+                }
+
+                selectedType = type;
+                selectedAmount = amount;
+
+                let unitsSelect = $(_trigger).closest('form').find('[name="numberOfUnits"]'),
+                    minutesSelect = $(_trigger).closest('form').find('[name="numMinutes"]');
+
+                if(type === 'hourly') {
+                    unitsSelect.val('');
+                    minutesSelect.val('');
+                    let maxNABillableAmount = 30,
+                        amountPer5Minutes = amount / 12,
+                        maxNumberOf5Minutes = Math.ceil(maxNABillableAmount / amountPer5Minutes),
+                        maxHours = (maxNumberOf5Minutes * 5) / 60;
+                    minutesSelect.find('option').each(function () {
+                        if (this.value) {
+                            if (+this.value > maxHours) {
+                                $(this).hide();
+                            }
+                            else {
+                                $(this).show();
+                            }
+                        }
+                        else {
+                            $(this).show();
+                        }
+                    });
+                    minutesSelect.closest('.minutesSelectContainer').removeClass('d-none');
+                }
+                else { // flat
+                    unitsSelect.val('1');
+                    minutesSelect.closest('.minutesSelectContainer').addClass('d-none');
+                    calculateGenericBillAmount(unitsSelect);
+                }
+            };
+            window.minutesToUnits = function(_trigger) {
+                _trigger = $(_trigger);
+
+                if(!_trigger.val()) return false;
+                let unitsSelect = $(_trigger).closest('form').find('[name="numberOfUnits"]');
+                unitsSelect.val(+(_trigger.val()));
+                calculateGenericBillAmount(unitsSelect);
+            };
+            window.calculateGenericBillAmount = function (_trigger) {
+                _trigger = $(_trigger);
+
+                let amountTarget = _trigger.closest('form').find('[calculated-generic-amount]').text('');
+                let reimbursable = +(_trigger.val()) * selectedAmount;
+                if (isNaN(reimbursable)) reimbursable = 0;
+                amountTarget.html('<b>Reimbursable:</b> $' + reimbursable.toFixed(2));
+            };
+            window.updateGenericBillAction = function (_trigger) {
+                let actions = [];
+                $(_trigger).closest('.generic-bill-actions').find('.generic-bill-action:checked').each(function () {
+                    actions.push($(this).attr('data-action'));
+                });
+                $(_trigger).closest('.generic-bill-actions').find('[name="genericDescription"]').val(actions.join("<br>"));
+            };
+            @if($genericRates && count($genericRates) && count($genericRates) === 1)
+                switchGenericRate($('[name="code"][data-entity-type]'));
+            @endif
+        }
+        addMCInitializer('init-note-generic-add-bill', init);
+    }).call(window);
+</script>

+ 1 - 1
resources/views/app/generic-bills/add-bill-form/Note.blade.php

@@ -70,6 +70,6 @@
                 @include('app.generic-bills.add-bill-form._default-actions')
             @endif
         </form>
-        @include('app.generic-bills.add-bill-form._default-script')
+        @include('app.generic-bills.add-bill-form.Note-script')
     @endif
 @endif

+ 19 - 15
resources/views/app/generic-bills/add-bill-form/_default-fields.blade.php

@@ -21,17 +21,18 @@
     <input type="hidden" name="code"
            data-entity-type="{{$entityType}}"
            data-amount="{{ $genericRates[0]->amount }}"
+           data-rate-type="{{ $genericRates[0]->is_hourly ? 'hourly' : 'flat' }}"
            value="{{$genericRates[0]->code}}">
-    <p class="mb-2">Service: <br><b>{{ $genericRates[0]->code }} (${{ $genericRates[0]->amount }}/hr)</b></p>
+    <p class="mb-2">Service: <br><b>{{ $genericRates[0]->code }} (${{ $genericRates[0]->amount }}{{$genericRates[0]->is_hourly ? '/hr' : ''}})</b></p>
 @else
     <div class="mb-2">
-        <label for="" class="text-secondary text-sm">Service</label>
+        <label for="" class="text-secondary text-sm mb-1">Service</label>
         <select autofocus class="form-control" name="code"
                 data-entity-type="{{$entityType}}"
                 onchange="switchGenericRate(this)">
             <option value="">-- Select Code --</option>
             @foreach($genericPro->genericRates() as $genericRate)
-                <option data-amount="{{ $genericRate->amount }}" value="{{ $genericRate->code }}">
+                <option data-amount="{{ $genericRate->amount }}" data-rate-type="{{ $genericRate->is_hourly ? 'hourly' : 'flat' }}" value="{{ $genericRate->code }}">
                     {{ $genericRate->code }} (${{ $genericRate->amount }})
                 </option>
             @endforeach
@@ -40,29 +41,32 @@
 @endif
 <div class="mb-2">
     <?php
-    if(!@$maxMinutes) {
+    if (!@$maxMinutes) {
         $maxMinutes = 30;
     }
     ?>
-    <label for="" class="text-secondary text-sm">Minutes</label>
-    <div class="mb-2">
-        <select name="numberOfUnits" class="form-control form-control-sm"
-                onchange="calculateGenericBillAmount(this)">
-            <option value=""> -- select -- </option>
-            <?php for ($i = 5; $i <= $maxMinutes; $i+=5) { ?>
-            <option value="{{ $i/60 }}">{{ $i }} minutes</option>
-            <?php } ?>
-        </select>
+    <div class="minutesSelectContainer d-none">
+        <label for="" class="text-secondary text-sm mb-1">Minutes</label>
+        <div class="mb-2">
+            <select name="numMinutes" class="form-control form-control-sm"
+                    onchange="minutesToUnits(this)">
+                <option value=""> -- select --</option>
+                <?php for ($i = 5; $i <= $maxMinutes; $i += 5) { ?>
+                <option value="{{ $i/60 }}">{{ $i }} minutes</option>
+                <?php } ?>
+            </select>
+        </div>
     </div>
+    <input type="hidden" name="numberOfUnits" value="1">
     <div class="mb-2" calculated-generic-amount></div>
 </div>
 @if($entityType !== 'Note')
     <div class="mb-2">
-        <label for="" class="text-secondary text-sm">Description</label>
+        <label for="" class="text-secondary text-sm mb-1">Description</label>
         <input type="text" name="genericDescription" class="form-control form-control-sm" value="">
     </div>
 @endif
 <div class="mb-2">
-    <label for="" class="text-secondary text-sm">Effective Date</label>
+    <label for="" class="text-secondary text-sm mb-1">Effective Date</label>
     <input type="date" name="effectiveDate" class="form-control form-control-sm" value="{{date('Y-m-d')}}" required>
 </div>