Add API support for expenses

This commit is contained in:
Hillel Coren 2016-10-23 11:01:21 +03:00
parent 4320a72692
commit 6a55cf5b43
4 changed files with 133 additions and 38 deletions

View File

@ -3,6 +3,9 @@
use App\Models\Expense; use App\Models\Expense;
use App\Ninja\Repositories\ExpenseRepository; use App\Ninja\Repositories\ExpenseRepository;
use App\Services\ExpenseService; use App\Services\ExpenseService;
use App\Http\Requests\ExpenseRequest;
use App\Http\Requests\CreateExpenseRequest;
use App\Http\Requests\UpdateExpenseRequest;
class ExpenseApiController extends BaseAPIController class ExpenseApiController extends BaseAPIController
{ {
@ -20,6 +23,22 @@ class ExpenseApiController extends BaseAPIController
$this->expenseService = $expenseService; $this->expenseService = $expenseService;
} }
/**
* @SWG\Get(
* path="/expenses",
* summary="List of expenses",
* tags={"expense"},
* @SWG\Response(
* response=200,
* description="A list with expenses",
* @SWG\Schema(type="array", @SWG\Items(ref="#/definitions/Expense"))
* ),
* @SWG\Response(
* response="default",
* description="an ""unexpected"" error"
* )
* )
*/
public function index() public function index()
{ {
$expenses = Expense::scope() $expenses = Expense::scope()
@ -30,23 +49,101 @@ class ExpenseApiController extends BaseAPIController
return $this->listResponse($expenses); return $this->listResponse($expenses);
} }
public function update() /**
* @SWG\Post(
* path="/expenses",
* tags={"expense"},
* summary="Create a expense",
* @SWG\Parameter(
* in="body",
* name="body",
* @SWG\Schema(ref="#/definitions/Expense")
* ),
* @SWG\Response(
* response=200,
* description="New expense",
* @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Expense"))
* ),
* @SWG\Response(
* response="default",
* description="an ""unexpected"" error"
* )
* )
*/
public function store(CreateExpenseRequest $request)
{ {
//stub $expense = $this->expenseRepo->save($request->input());
$expense = Expense::scope($expense->public_id)
->with('client', 'invoice', 'vendor')
->first();
return $this->itemResponse($expense);
} }
public function store() /**
* @SWG\Put(
* path="/expenses/{expense_id}",
* tags={"expense"},
* summary="Update a expense",
* @SWG\Parameter(
* in="body",
* name="body",
* @SWG\Schema(ref="#/definitions/Expense")
* ),
* @SWG\Response(
* response=200,
* description="Update expense",
* @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Expense"))
* ),
* @SWG\Response(
* response="default",
* description="an ""unexpected"" error"
* )
* )
*/
public function update(UpdateExpenseRequest $request, $publicId)
{ {
//stub if ($request->action) {
return $this->handleAction($request);
}
$data = $request->input();
$data['public_id'] = $publicId;
$expense = $this->expenseRepo->save($data, $request->entity());
return $this->itemResponse($expense);
} }
public function destroy() /**
* @SWG\Delete(
* path="/expenses/{expense_id}",
* tags={"expense"},
* summary="Delete a expense",
* @SWG\Parameter(
* in="body",
* name="body",
* @SWG\Schema(ref="#/definitions/Expense")
* ),
* @SWG\Response(
* response=200,
* description="Delete expense",
* @SWG\Schema(type="object", @SWG\Items(ref="#/definitions/Expense"))
* ),
* @SWG\Response(
* response="default",
* description="an ""unexpected"" error"
* )
* )
*/
public function destroy(ExpenseRequest $request)
{ {
//stub $expense = $request->entity();
$this->expenseRepo->delete($expense);
return $this->itemResponse($expense);
} }
} }

View File

@ -308,11 +308,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function()
Route::post('update_notifications', 'AccountApiController@updatePushNotifications'); Route::post('update_notifications', 'AccountApiController@updatePushNotifications');
Route::get('dashboard', 'DashboardApiController@index'); Route::get('dashboard', 'DashboardApiController@index');
Route::resource('documents', 'DocumentAPIController'); Route::resource('documents', 'DocumentAPIController');
// Vendor
Route::resource('vendors', 'VendorApiController'); Route::resource('vendors', 'VendorApiController');
//Expense
Route::resource('expenses', 'ExpenseApiController'); Route::resource('expenses', 'ExpenseApiController');
}); });

View File

@ -132,12 +132,10 @@ class ExpenseRepository extends BaseRepository
// First auto fill // First auto fill
$expense->fill($input); $expense->fill($input);
$expense->expense_date = Utils::toSqlDate($input['expense_date']); if (isset($input['expense_date'])) {
$expense->expense_date = Utils::toSqlDate($input['expense_date']);
if (isset($input['private_notes'])) {
$expense->private_notes = trim($input['private_notes']);
} }
$expense->public_notes = trim($input['public_notes']);
$expense->should_be_invoiced = isset($input['should_be_invoiced']) && floatval($input['should_be_invoiced']) || $expense->client_id ? true : false; $expense->should_be_invoiced = isset($input['should_be_invoiced']) && floatval($input['should_be_invoiced']) || $expense->client_id ? true : false;
if ( ! $expense->expense_currency_id) { if ( ! $expense->expense_currency_id) {
@ -149,7 +147,9 @@ class ExpenseRepository extends BaseRepository
$rate = isset($input['exchange_rate']) ? Utils::parseFloat($input['exchange_rate']) : 1; $rate = isset($input['exchange_rate']) ? Utils::parseFloat($input['exchange_rate']) : 1;
$expense->exchange_rate = round($rate, 4); $expense->exchange_rate = round($rate, 4);
$expense->amount = round(Utils::parseFloat($input['amount']), 2); if (isset($input['amount'])) {
$expense->amount = round(Utils::parseFloat($input['amount']), 2);
}
$expense->save(); $expense->save();

View File

@ -492,31 +492,33 @@ class InvoiceRepository extends BaseRepository
$invoice->invoice_items()->forceDelete(); $invoice->invoice_items()->forceDelete();
} }
$document_ids = !empty($data['document_ids'])?array_map('intval', $data['document_ids']):[];; if ( ! empty($data['document_ids'])) {
foreach ($document_ids as $document_id){ $document_ids = array_map('intval', $data['document_ids']);
$document = Document::scope($document_id)->first(); foreach ($document_ids as $document_id){
if($document && Auth::user()->can('edit', $document)){ $document = Document::scope($document_id)->first();
if($document && Auth::user()->can('edit', $document)){
if($document->invoice_id && $document->invoice_id != $invoice->id){ if($document->invoice_id && $document->invoice_id != $invoice->id){
// From a clone // From a clone
$document = $document->cloneDocument(); $document = $document->cloneDocument();
$document_ids[] = $document->public_id;// Don't remove this document $document_ids[] = $document->public_id;// Don't remove this document
}
$document->invoice_id = $invoice->id;
$document->expense_id = null;
$document->save();
} }
$document->invoice_id = $invoice->id;
$document->expense_id = null;
$document->save();
} }
}
if ( ! $invoice->wasRecentlyCreated) { if ( ! $invoice->wasRecentlyCreated) {
foreach ($invoice->documents as $document){ foreach ($invoice->documents as $document){
if(!in_array($document->public_id, $document_ids)){ if(!in_array($document->public_id, $document_ids)){
// Removed // Removed
// Not checking permissions; deleting a document is just editing the invoice // Not checking permissions; deleting a document is just editing the invoice
if($document->invoice_id == $invoice->id){ if($document->invoice_id == $invoice->id){
// Make sure the document isn't on a clone // Make sure the document isn't on a clone
$document->delete(); $document->delete();
}
} }
} }
} }