Преглед изворни кода

Invoice-center - customer and invoice transactions

Vijayakrishnan пре 3 година
родитељ
комит
1fc9d2b441

+ 26 - 0
app/Helpers/helpers.php

@@ -214,6 +214,32 @@ if(!function_exists('friendly_date_time')) {
     }
 }
 
+if(!function_exists('friendly_date_time_with_seconds')) {
+    function friendly_date_time_with_seconds($value, $includeTime = true, $default = '-', $long_year=false) {
+        if(!$value || empty($value)) return $default;
+        try {
+            if($includeTime) {
+                $realTimezone = 'US/Eastern';
+                $date = new DateTime($value);
+                $date->setTimezone(new DateTimeZone($realTimezone));
+                return $date->format("m/d/y" . ($includeTime ? ", h:i:sa" : "")) . ($includeTime ? ' EST' : '');
+            }
+            else {
+                $result = strtotime($value);
+                if($long_year){
+                    $result = date("m/d/Y" . ($includeTime ? ", h:i:sa" : ""), $result);
+                }else{
+                    $result = date("m/d/y" . ($includeTime ? ", h:i:sa" : ""), $result);
+                }
+                return $result;
+            }
+        }
+        catch (Exception $e) {
+            return $value;
+        }
+    }
+}
+
 if(!function_exists('friendly_date_month_year')) {
     function friendly_date_month_year($value, $default = '-', $long_year=true) {
         if(!$value || empty($value)) return $default;

+ 16 - 0
app/Http/Controllers/InvoiceController.php

@@ -177,5 +177,21 @@ ORDER BY client.name_first, client.name_last",
             "data" => $matches
         ]);
     }
+
+    public function customerInvoicesJSON(Request $request, Customer $customer) {
+        $invoices = [];
+        foreach ($customer->invoices as $invoice) {
+            $invoices[] = [
+                "uid" => $invoice->uid,
+                "text" => '$' . $invoice->amount .
+                    ($invoice->description ? ' | ' . substr($invoice->description, 0, 15) : '') .
+                    ' | ' . friendly_date_time($invoice->created_at)
+            ];
+        }
+        return json_encode([
+            "success" => true,
+            "data" => $invoices
+        ]);
+    }
    
 }

+ 6 - 0
app/Models/Customer.php

@@ -4,6 +4,8 @@ namespace App\Models;
 
 # use Illuminate\Database\Eloquent\Model;
 
+use Illuminate\Database\Eloquent\Relations\HasMany;
+
 class Customer extends Model
 {
     protected $table = 'customer';
@@ -15,4 +17,8 @@ class Customer extends Model
     public function company() {
         return $this->hasOne(Company::class, 'id', 'company_id');
     }
+
+    public function invoices() {
+        return $this->hasMany(Invoice::class, 'customer_id', 'id')->orderBy('created_at', 'DESC');
+    }
 }

+ 3 - 0
app/Models/CustomerTransaction.php

@@ -8,4 +8,7 @@ class CustomerTransaction extends Model
 {
     protected $table = 'customer_transaction';
 
+    public function customer() {
+        return $this->hasOne(Customer::class, 'id', 'customer_id');
+    }
 }

+ 3 - 0
app/Models/InvoiceTransaction.php

@@ -8,4 +8,7 @@ class InvoiceTransaction extends Model
 {
     protected $table = 'invoice_transaction';
 
+    public function invoice() {
+        return $this->hasOne(Invoice::class, 'id', 'invoice_id');
+    }
 }

+ 123 - 1
resources/views/app/invoice-center/customer-transactions.blade.php

@@ -1,4 +1,126 @@
 @extends('layouts.invoice-center')
 @section('inner-content')
-    Customer Transactions
+    <div class="d-flex mb-2 pb-2 align-items-center border-bottom">
+        <div class="font-size-14 font-weight-bold">Customer Transactions</div>
+        <div moe class="ml-3">
+            <a href="" start show class="btn btn-sm btn-primary font-weight-normal text-white">
+                + Add Manual Plus Transaction
+            </a>
+            <form url="/api/customerTransaction/createManualPlus" class="mcp-theme-1">
+                <p class="mb-2 text-secondary font-weight-bold text-nowrap">Add Manual Plus Transaction</p>
+                <div class="mb-2">
+                    <label class="text-sm text-secondary mb-1">Customer</label>
+                    <input type="hidden" name="customerUid">
+                    <input type="text"
+                           name="customerName"
+                           target-key="uid"
+                           target-field="customerUid"
+                           autocomplete="off"
+                           class="form-control form-control-sm"
+                           stag-suggest
+                           stag-suggest-ep="/customer-suggest"
+                           required>
+                </div>
+                <div class="mb-2">
+                    <label class="text-sm text-secondary mb-1">Amount</label>
+                    <input type="text"
+                           name="amount"
+                           autocomplete="off"
+                           class="form-control form-control-sm"
+                           required>
+                </div>
+                <div class="mb-2">
+                    <label class="text-sm text-secondary mb-1">Memo</label>
+                    <textarea rows="2"
+                              name="customMemo"
+                              autocomplete="off"
+                              class="form-control form-control-sm"></textarea>
+                </div>
+                <div>
+                    <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+                    <button cancel class="btn btn-sm btn-default border">Cancel</button>
+                </div>
+            </form>
+        </div>
+        <div moe class="ml-3">
+            <a href="" start show class="btn btn-sm btn-primary font-weight-normal text-white">
+                + Add Manual Minus Transaction
+            </a>
+            <form url="/api/customerTransaction/createManualMinus" class="mcp-theme-1">
+                <p class="mb-2 text-secondary font-weight-bold text-nowrap">Add Manual Minus Transaction</p>
+                <div class="mb-2">
+                    <label class="text-sm text-secondary mb-1">Customer</label>
+                    <input type="hidden" name="customerUid">
+                    <input type="text"
+                           name="customerName"
+                           target-key="uid"
+                           target-field="customerUid"
+                           autocomplete="off"
+                           class="form-control form-control-sm"
+                           stag-suggest
+                           stag-suggest-ep="/customer-suggest"
+                           required>
+                </div>
+                <div class="mb-2">
+                    <label class="text-sm text-secondary mb-1">Amount</label>
+                    <input type="text"
+                           name="amount"
+                           autocomplete="off"
+                           class="form-control form-control-sm"
+                           required>
+                </div>
+                <div class="mb-2">
+                    <label class="text-sm text-secondary mb-1">Memo</label>
+                    <textarea rows="2"
+                              name="customMemo"
+                              autocomplete="off"
+                              class="form-control form-control-sm"></textarea>
+                </div>
+                <div>
+                    <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+                    <button cancel class="btn btn-sm btn-default border">Cancel</button>
+                </div>
+            </form>
+        </div>1
+    </div>
+    @if(count($records))
+        <table class="table table-sm table-bordered table-striped">
+            <thead>
+            <tr>
+                <th class="border-bottom-0">Created</th>
+                <th class="border-bottom-0">Customer</th>
+                <th class="border-bottom-0">Plus / Minus</th>
+                <th class="border-bottom-0">Amount</th>
+                <th class="border-bottom-0">Memo</th>
+                <th class="border-bottom-0">Type</th>
+                <th class="border-bottom-0">Starting<br>Balance</th>
+                <th class="b1order-bottom-0">Resulting<br>Balance</th>
+            </tr>
+            </thead>
+            <tbody>
+            @foreach($records as $record)
+                <tr>
+                    <td>{{ friendly_date_time_with_seconds($record->created_at) }}</td>
+                    <td>
+                        @if($record->customer && $record->customer->client)
+                            <a href="{{route('patients.view.dashboard', $record->customer->client)}}">
+                                {{$record->customer->client->displayName()}}
+                            </a>
+                        @else
+                            -
+                        @endif
+                    </td>
+                    <td>{{ sanitize_state_name($record->plus_or_minus) }}</td>
+                    <td>${{ is_null($record->amount) ? 0 : $record->amount }}</td>
+                    <td>{{ $record->custom_memo ?: '' }}</td>
+                    <td>{{ sanitize_state_name($record->reason_type)}}</td>
+                    <td>${{ is_null($record->starting_balance) ? 0 : $record->starting_balance }}</td>
+                    <td>${{ is_null($record->resulting_balance) ? 0 : $record->resulting_balance }}</td>
+                </tr>
+            @endforeach
+            </tbody>
+        </table>
+    @else
+        <div class="text-secondary">No customer transactions yet!</div>
+    @endif
 @endsection

+ 159 - 1
resources/views/app/invoice-center/invoice-transactions.blade.php

@@ -1,4 +1,162 @@
 @extends('layouts.invoice-center')
 @section('inner-content')
-    Invoice Transactions
+    <div id="invoice-transactions">
+        <div class="d-flex mb-2 pb-2 align-items-center border-bottom">
+            <div class="font-size-14 font-weight-bold">Invoice Transactions</div>
+            <div moe class="ml-3">
+                <a href="" start show class="btn btn-sm btn-primary font-weight-normal text-white">
+                    + Add Manual Plus Transaction
+                </a>
+                <form url="/api/invoiceTransaction/createManualPlus" class="mcp-theme-1">
+                    <p class="mb-2 text-secondary font-weight-bold text-nowrap">Add Manual Plus Transaction</p>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Customer</label>
+                        <input type="text"
+                               name="customerName"
+                               autocomplete="off"
+                               class="form-control form-control-sm customer-select"
+                               stag-suggest
+                               stag-suggest-ep="/customer-suggest"
+                               required>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Invoice</label>
+                        <select name="invoiceUid"
+                               class="form-control form-control-sm"
+                               required>
+                            <option value="">-- select --</option>
+                        </select>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Amount</label>
+                        <input type="text"
+                               name="amount"
+                               autocomplete="off"
+                               class="form-control form-control-sm"
+                               required>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Memo</label>
+                        <textarea rows="2"
+                                  name="customMemo"
+                                  autocomplete="off"
+                                  class="form-control form-control-sm"></textarea>
+                    </div>
+                    <div>
+                        <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+                        <button cancel class="btn btn-sm btn-default border">Cancel</button>
+                    </div>
+                </form>
+            </div>
+            <div moe class="ml-3">
+                <a href="" start show class="btn btn-sm btn-primary font-weight-normal text-white">
+                    + Add Manual Minus Transaction
+                </a>
+                <form url="/api/invoiceTransaction/createManualMinus" class="mcp-theme-1">
+                    <p class="mb-2 text-secondary font-weight-bold text-nowrap">Add Manual Minus Transaction</p>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Customer</label>
+                        <input type="hidden" name="customerUid">
+                        <input type="text"
+                               name="customerName"
+                               autocomplete="off"
+                               class="form-control form-control-sm customer-select"
+                               stag-suggest
+                               stag-suggest-ep="/customer-suggest"
+                               required>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Invoice</label>
+                        <select name="invoiceUid"
+                                class="form-control form-control-sm"
+                                required>
+                            <option value="">-- select --</option>
+                        </select>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Amount</label>
+                        <input type="text"
+                               name="amount"
+                               autocomplete="off"
+                               class="form-control form-control-sm"
+                               required>
+                    </div>
+                    <div class="mb-2">
+                        <label class="text-sm text-secondary mb-1">Memo</label>
+                        <textarea rows="2"
+                                  name="customMemo"
+                                  autocomplete="off"
+                                  class="form-control form-control-sm"></textarea>
+                    </div>
+                    <div>
+                        <button submit class="btn btn-sm btn-primary mr-2">Submit</button>
+                        <button cancel class="btn btn-sm btn-default border">Cancel</button>
+                    </div>
+                </form>
+            </div>1
+        </div>
+        @if(count($records))
+            <table class="table table-sm table-bordered table-striped">
+                <thead>
+                <tr>
+                    <th class="border-bottom-0">Created</th>
+                    <th class="border-bottom-0">Customer</th>
+                    <th class="border-bottom-0">Plus / Minus</th>
+                    <th class="border-bottom-0">Amount</th>
+                    <th class="border-bottom-0">Memo</th>
+                    <th class="border-bottom-0">Starting<br>Balance</th>
+                    <th class="b1order-bottom-0">Resulting<br>Balance</th>
+                </tr>
+                </thead>
+                <tbody>
+                @foreach($records as $record)
+                    <tr>
+                        <td>{{ friendly_date_time_with_seconds($record->created_at) }}</td>
+                        <td>
+                            @if($record->invoice && $record->invoice->customer && $record->invoice->customer->client)
+                                <a href="{{route('patients.view.dashboard', $record->invoice->customer->client)}}">
+                                    {{$record->invoice->customer->client->displayName()}}
+                                </a>
+                            @else
+                                -
+                            @endif
+                        </td>
+                        <td>{{ sanitize_state_name($record->plus_or_minus) }}</td>
+                        <td>${{ is_null($record->amount) ? 0 : $record->amount }}</td>
+                        <td>{{ $record->custom_memo ?: '' }}</td>
+                        <td>${{ is_null($record->starting_balance) ? 0 : $record->starting_balance }}</td>
+                        <td>${{ is_null($record->resulting_balance) ? 0 : $record->resulting_balance }}</td>
+                    </tr>
+                @endforeach
+                </tbody>
+            </table>
+        @else
+            <div class="text-secondary">No customer transactions yet!</div>
+        @endif
+    </div>
+    <script>
+        (function () {
+            function init() {
+                let parentSegment = $('#invoice-transactions');
+                parentSegment.find('input.customer-select')
+                    .off('stag-suggest-selected')
+                    .on('stag-suggest-selected', (_e, _input, _data) => {
+                        _input = $(_input);
+                        let select = _input.closest('form').find('select[name="invoiceUid"]').empty();
+                        select.append('<option value="">-- select --</option>');
+                        select.prop('disabled', true);
+                        $.get('/customer/invoicesJSON/' + _data.uid, _data => {
+                             if(!hasResponseError(_data)) {
+                                 for (let i = 0; i < _data.data.length; i++) {
+                                     select.append($('<option/>').attr('value', _data.data[i].uid).text(_data.data[i].text));
+                                 }
+                             }
+                        }, 'json').then(() => {
+                            select.prop('disabled', false);
+                        });
+                    });
+            }
+            addMCInitializer('invoice-transactions', init, )
+        }).call(window);
+    </script>
 @endsection

+ 1 - 0
routes/web.php

@@ -649,6 +649,7 @@ Route::middleware('pro.auth')->group(function () {
     Route::get('/company-suggest', 'InvoiceController@companySuggestJSON')->name('company-suggest-json');
     Route::get('/client-suggest', 'InvoiceController@clientSuggestJSON')->name('client-suggest-json');
     Route::get('/customer-suggest', 'InvoiceController@customerSuggestJSON')->name('customer-suggest-json');
+    Route::get('/customer/invoicesJSON/{customer}', 'InvoiceController@customerInvoicesJSON')->name('customer-invoices-json');
 
     // Pro suggest
     Route::get('/pro-suggest', 'HomeController@proSuggest');