diff --git a/app/Expense.php b/app/Expense.php index b7627a34..085345f7 100644 --- a/app/Expense.php +++ b/app/Expense.php @@ -5,6 +5,7 @@ use Illuminate\Database\Eloquent\Model; use Spatie\MediaLibrary\HasMedia\HasMedia; use Spatie\MediaLibrary\HasMedia\HasMediaTrait; use Crater\ExpenseCategory; +use Crater\User; use Carbon\Carbon; use Illuminate\Support\Facades\DB; @@ -16,6 +17,7 @@ class Expense extends Model implements HasMedia 'expense_category_id', 'amount', 'company_id', + 'user_id', 'expense_date', 'notes', 'attachment_receipt' @@ -32,6 +34,11 @@ class Expense extends Model implements HasMedia return $this->belongsTo(ExpenseCategory::class, 'expense_category_id'); } + public function user() + { + return $this->belongsTo(User::class); + } + public function getFormattedExpenseDateAttribute($value) { $dateFormat = CompanySetting::getSetting('carbon_date_format', $this->company_id); @@ -81,6 +88,11 @@ class Expense extends Model implements HasMedia return $query->where('expenses.expense_category_id', $categoryId); } + public function scopeWhereUser($query, $user_id) + { + return $query->where('expenses.user_id', $user_id); + } + public function scopeApplyFilters($query, array $filters) { $filters = collect($filters); @@ -89,6 +101,10 @@ class Expense extends Model implements HasMedia $query->whereCategory($filters->get('expense_category_id')); } + if ($filters->get('user_id')) { + $query->whereUser($filters->get('user_id')); + } + if ($filters->get('from_date') && $filters->get('to_date')) { $start = Carbon::createFromFormat('d/m/Y', $filters->get('from_date')); $end = Carbon::createFromFormat('d/m/Y', $filters->get('to_date')); diff --git a/app/Http/Controllers/ExpensesController.php b/app/Http/Controllers/ExpensesController.php index b2f15b50..9b0d97d5 100644 --- a/app/Http/Controllers/ExpensesController.php +++ b/app/Http/Controllers/ExpensesController.php @@ -24,9 +24,11 @@ class ExpensesController extends Controller $limit = $request->has('limit') ? $request->limit : 10; $expenses = Expense::with('category') + ->leftJoin('users', 'users.id', '=', 'expenses.user_id') ->join('expense_categories', 'expense_categories.id', '=', 'expenses.expense_category_id') ->applyFilters($request->only([ 'expense_category_id', + 'user_id', 'search', 'from_date', 'to_date', @@ -34,11 +36,16 @@ class ExpensesController extends Controller 'orderBy' ])) ->whereCompany($request->header('company')) - ->select('expenses.*', 'expense_categories.name') + ->select('expenses.*', 'expense_categories.name', 'users.name as user_name') ->paginate($limit); + $customers = User::customer() + ->whereCompany($request->header('company')) + ->get(); + return response()->json([ 'expenses' => $expenses, + 'customers' => $customers, 'currency' => Currency::findOrFail( CompanySetting::getSetting('currency', $request->header('company')) ) @@ -53,9 +60,13 @@ class ExpensesController extends Controller public function create(Request $request) { $categories = ExpenseCategory::whereCompany($request->header('company'))->get(); + $customers = User::customer() + ->whereCompany($request->header('company')) + ->get(); return response()->json([ - 'categories' => $categories + 'categories' => $categories, + 'customers' => $customers ]); } @@ -72,6 +83,7 @@ class ExpensesController extends Controller $expense = new Expense(); $expense->notes = $request->notes; $expense->expense_category_id = $request->expense_category_id; + $expense->user_id = $request->user_id; $expense->amount = $request->amount; $expense->company_id = $request->header('company'); $expense->expense_date = $expense_date; @@ -107,7 +119,9 @@ class ExpensesController extends Controller public function edit(Request $request,$id) { $categories = ExpenseCategory::whereCompany($request->header('company'))->get(); - $customers = User::where('role', 'customer')->whereCompany($request->header('company'))->get(); + $customers = User::customer() + ->whereCompany($request->header('company')) + ->get(); $expense = Expense::with('category')->where('id', $id)->first(); return response()->json([ @@ -132,6 +146,7 @@ class ExpensesController extends Controller $expense->notes = $request->notes; $expense->expense_category_id = $request->expense_category_id; $expense->amount = $request->amount; + $expense->user_id = $request->user_id; $expense->expense_date = $expense_date; $expense->save(); @@ -205,7 +220,7 @@ class ExpensesController extends Controller * Retrive details of an expense receipt from storage. * @param int $id * @return \Illuminate\Http\JsonResponse - */ + */ public function showReceipt($id) { $expense = Expense::find($id); @@ -239,7 +254,7 @@ class ExpensesController extends Controller * @param int $id * @param strig $hash * @return \Symfony\Component\HttpFoundation\BinaryFileResponse | \Illuminate\Http\JsonResponse - */ + */ public function downloadReceipt($id, $hash) { $company = Company::where('unique_hash', $hash)->first(); diff --git a/app/User.php b/app/User.php index 2879593e..c3d93b45 100644 --- a/app/User.php +++ b/app/User.php @@ -9,6 +9,7 @@ use carbon\carbon; use Crater\MemberLoan; use Crater\Address; use Crater\Payment; +use Crater\Expense; use Crater\Company; use Crater\Notifications\MailResetPasswordNotification; use Spatie\MediaLibrary\HasMedia\HasMedia; @@ -105,6 +106,11 @@ class User extends Authenticatable implements HasMedia return $this->hasMany(Address::class); } + public function expenses() + { + return $this->hasMany(Expense::class); + } + public function billingAddress() { return $this->hasOne(Address::class)->where('type', Address::BILLING_TYPE); diff --git a/database/migrations/2018_11_02_133956_create_expenses_table.php b/database/migrations/2018_11_02_133956_create_expenses_table.php index 25912644..a0e745a5 100644 --- a/database/migrations/2018_11_02_133956_create_expenses_table.php +++ b/database/migrations/2018_11_02_133956_create_expenses_table.php @@ -23,6 +23,8 @@ class CreateExpensesTable extends Migration $table->foreign('expense_category_id')->references('id')->on('expense_categories')->onDelete('cascade'); $table->integer('company_id')->unsigned()->nullable(); $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); + $table->integer('user_id')->unsigned()->nullable(); + $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->timestamps(); }); } diff --git a/resources/assets/js/plugins/ar.json b/resources/assets/js/plugins/ar.json index 67b81f35..fa784699 100644 --- a/resources/assets/js/plugins/ar.json +++ b/resources/assets/js/plugins/ar.json @@ -412,6 +412,8 @@ "title": "النفقات", "expenses_list": "قائمة النفقات", "expense_title": "Title", + "select_a_customer": "حدد عميلاً", + "customer": "العميل", "contact": "تواصل", "category": "الفئة", "from_date": "من تاريخ", diff --git a/resources/assets/js/plugins/de.json b/resources/assets/js/plugins/de.json index 2779e0fe..a7e00b8d 100644 --- a/resources/assets/js/plugins/de.json +++ b/resources/assets/js/plugins/de.json @@ -201,6 +201,7 @@ "action": "Aktion", "add_expense": "Aufwendung hinzufügen", "add_new_expense": "Neue Aufwendung hinzufügen", + "select_a_customer": "Wählen Sie einen Kunden aus", "amount": "Summe", "categories": { "actions": "Aktionen", @@ -215,6 +216,7 @@ "title": "Titel" }, "category": "Kategorie", + "customer": "Kunden", "category_id": "Kategorie-Id", "confirm_delete": "Sie können diese Ausgabe nicht wiederherstellen. | Sie können diese Ausgaben nicht wiederherstellen.", "contact": "Kontakt", diff --git a/resources/assets/js/plugins/en.json b/resources/assets/js/plugins/en.json index 47d7b22f..430ca4b1 100644 --- a/resources/assets/js/plugins/en.json +++ b/resources/assets/js/plugins/en.json @@ -426,7 +426,9 @@ "expenses": { "title": "Expenses", "expenses_list": "Expenses List", + "select_a_customer": "Select a customer", "expense_title": "Title", + "customer": "Customer", "contact": "Contact", "category": "Category", "from_date": "From Date", diff --git a/resources/assets/js/plugins/es.json b/resources/assets/js/plugins/es.json index 208f79c2..4d571df1 100644 --- a/resources/assets/js/plugins/es.json +++ b/resources/assets/js/plugins/es.json @@ -412,6 +412,8 @@ "expenses_list": "Lista de gastos", "expense_title": "Título", "contact": "Contacto", + "customer": "Cliente", + "select_a_customer": "Selecciona un cliente", "category": "Categoría", "from_date": "Desde la fecha", "to_date": "Hasta la fecha", diff --git a/resources/assets/js/plugins/fr.json b/resources/assets/js/plugins/fr.json index a5444850..689a1537 100644 --- a/resources/assets/js/plugins/fr.json +++ b/resources/assets/js/plugins/fr.json @@ -410,6 +410,8 @@ "expenses_list": "Liste des dépenses", "expense_title": "Titre", "contact": "Contact", + "customer": "Client Client", + "select_a_customer": "Sélectionnez un client", "category": "Catégorie", "from_date": "A partir de la date", "to_date": "À ce jour", diff --git a/resources/assets/js/plugins/pt-br.json b/resources/assets/js/plugins/pt-br.json index cc97d497..7d12081d 100644 --- a/resources/assets/js/plugins/pt-br.json +++ b/resources/assets/js/plugins/pt-br.json @@ -414,6 +414,7 @@ "expense_title": "Título", "contact": "Contato", "category": "Categoria", + "customer": "Cliente", "from_date": "A partir da Data", "to_date": "Até a Data", "expense_date": "Data", diff --git a/resources/assets/js/views/expenses/Create.vue b/resources/assets/js/views/expenses/Create.vue index 1acdecc7..9a26df11 100644 --- a/resources/assets/js/views/expenses/Create.vue +++ b/resources/assets/js/views/expenses/Create.vue @@ -102,6 +102,19 @@ {{ $t('validation.price_minvalue') }} +