diff --git a/app/Helpers/Invoice/InvoiceCalc.php b/app/Helpers/Invoice/InvoiceCalc.php index 44ccf2336043..d1565c2f7f15 100644 --- a/app/Helpers/Invoice/InvoiceCalc.php +++ b/app/Helpers/Invoice/InvoiceCalc.php @@ -318,6 +318,12 @@ class InvoiceCalc $this->balance = $value; } + public function getInvoice() + { + //todo build invoice values here and return Invoice + + return $this->invoice; + } /* private function setDiscount($amount, $discount, $is_amount_discount) { diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index 5a5426256576..5ee7363af873 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -101,8 +101,7 @@ class ClientController extends BaseController */ public function update(UpdateClientRequest $request, Client $client) { - - $client = UpdateClient::dispatchNow($request, $client); + $client = $this->clientRepo->save($request, $client); return $this->itemResponse($client); @@ -129,8 +128,9 @@ class ClientController extends BaseController */ public function store(StoreClientRequest $request) { + + $client = $this->clientRepo->save($request, ClientFactory::create(auth()->user()->company()->id, auth()->user()->id)); - $client = StoreClient::dispatchNow($request, ClientFactory::create(auth()->user()->company()->id, auth()->user()->id)); $client->load('contacts', 'primary_contact'); return $this->itemResponse($client); @@ -145,6 +145,7 @@ class ClientController extends BaseController */ public function destroy(DestroyClientRequest $request, Client $client) { + //may not need these destroy routes as we are using actions to 'archive/delete' $client->delete(); return response()->json([], 200); diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index fb5b8e73642e..9a0d489edc4b 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -78,7 +78,8 @@ class InvoiceController extends BaseController public function store(StoreInvoiceRequest $request) { - $invoice = $this->invoice_repo->save(); + $invoice = $this->invoice_repo->save($request, InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id)); + return $this->itemResponse($invoice); } @@ -89,9 +90,11 @@ class InvoiceController extends BaseController * @param int $id * @return \Illuminate\Http\Response */ - public function show(ShowInvoiceRequest $request) + public function show(ShowInvoiceRequest $request, Invoice $invoice) { - // + + return $this->itemResponse($invoice); + } /** @@ -100,9 +103,11 @@ class InvoiceController extends BaseController * @param int $id * @return \Illuminate\Http\Response */ - public function edit(EditInvoiceRequest) + public function edit(EditInvoiceRequest, Invoice $invoice) { - // + + return $this->itemResponse($invoice); + } /** @@ -112,9 +117,13 @@ class InvoiceController extends BaseController * @param int $id * @return \Illuminate\Http\Response */ - public function update(UpdateInvoiceRequest $request) + public function update(UpdateInvoiceRequest $request, Invoice $invoice) { - // + + $invoice = $this->invoice_repo->save($request, $invoice); + + return $this->itemResponse($invoice); + } /** @@ -125,6 +134,10 @@ class InvoiceController extends BaseController */ public function destroy(DestroyInvoiceRequest $request, Invoice $invoice) { - // + + $invoice->delete(); + + return response()->json([], 200); + } } diff --git a/app/Http/Requests/Client/DestroyClientRequest.php b/app/Http/Requests/Client/DestroyClientRequest.php new file mode 100644 index 000000000000..d783937d0e3f --- /dev/null +++ b/app/Http/Requests/Client/DestroyClientRequest.php @@ -0,0 +1,21 @@ +user()->can('edit', $this->client); + } + +} diff --git a/app/Http/Requests/Client/UpdateClientRequest.php b/app/Http/Requests/Client/UpdateClientRequest.php index 09ff311f8b58..250f54556bbe 100644 --- a/app/Http/Requests/Client/UpdateClientRequest.php +++ b/app/Http/Requests/Client/UpdateClientRequest.php @@ -14,10 +14,9 @@ class UpdateClientRequest extends Request * @return bool */ - public function authorize() + public function authorize() : bool { - return true; - // return ! auth()->user(); //todo permissions + return auth()->user()->can('edit', $this->client); } public function rules() diff --git a/app/Http/Requests/Invoice/DestroyInvoiceRequest.php b/app/Http/Requests/Invoice/DestroyInvoiceRequest.php new file mode 100644 index 000000000000..71f853aa8bf3 --- /dev/null +++ b/app/Http/Requests/Invoice/DestroyInvoiceRequest.php @@ -0,0 +1,21 @@ +user()->can('edit', $this->invoice); + } + +} \ No newline at end of file diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 00d55bf215c0..91b8634f8574 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -24,6 +24,11 @@ class StoreInvoiceRequest extends Request } + public function sanitize() + { + //do post processing of invoice request here, ie. invoice_items + } + public function messages() { diff --git a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php index 9d2910de5e50..0e5106c42e72 100644 --- a/app/Http/Requests/Invoice/UpdateInvoiceRequest.php +++ b/app/Http/Requests/Invoice/UpdateInvoiceRequest.php @@ -14,14 +14,31 @@ class UpdateInvoiceRequest extends Request * @return bool */ - public function authorize() + public function authorize() : bool { - return true; - // return ! auth()->user(); //todo permissions + return auth()->user()->can('edit', $this->invoice); } public function rules() { + if (! $this->entity()) { + return []; + } + + $invoiceId = $this->entity()->id; + + $rules = [ + 'client' => 'required', + 'discount' => 'positive', + 'invoice_date' => 'required', + ]; + + return $rules; + } + + public function sanitize() + { + //do post processing of invoice request here, ie. invoice_items } diff --git a/app/Repositories/ClientRepository.php b/app/Repositories/ClientRepository.php index 4809631c3ba9..b986b88bb845 100644 --- a/app/Repositories/ClientRepository.php +++ b/app/Repositories/ClientRepository.php @@ -13,6 +13,22 @@ use Illuminate\Support\Facades\Log; class ClientRepository extends BaseRepository { + /** + * @var ClientContactRepository + */ + protected $contactRepo; + + /** + * ClientController constructor. + * @param ClientContactRepository $contactRepo + */ + public function __construct(ClientContactRepository $contactRepo) + { + + $this->contactRepo = $contactRepo; + + } + public function getClassName() { return Client::class; @@ -23,6 +39,8 @@ class ClientRepository extends BaseRepository $client->fill($request->input()); $client->save(); + $contacts = $this->contactRepo->save($request->input('contacts'), $client); + return $client; } diff --git a/app/Repositories/InvoiceRepository.php b/app/Repositories/InvoiceRepository.php index 088a5d946e3e..16b2fd5b596d 100644 --- a/app/Repositories/InvoiceRepository.php +++ b/app/Repositories/InvoiceRepository.php @@ -21,10 +21,17 @@ class InvoiceRepository extends BaseRepository public function save(Request $request, Invoice $invoice) : ?Invoice { $invoice->fill($request->input()); + $invoice->save(); - $invoice_calc = new InvoiceCalc($invoice, $invoice->settings); + $invoice_calc = new InvoiceCalc($invoice); + + $invoice = $invoice_calc->build()->getInvoice(); + + //fire events here that cascading from the saving of an invoice + //ie. client balance update... + return $invoice; } diff --git a/tests/Feature/ClientTest.php b/tests/Feature/ClientTest.php index 8a818d015900..c0bd5893228d 100644 --- a/tests/Feature/ClientTest.php +++ b/tests/Feature/ClientTest.php @@ -111,7 +111,7 @@ class ClientTest extends TestCase $this->assertNotNull($company); $this->assertNotNull($user->tokens->first()->company); - factory(\App\Models\Client::class, 5)->create(['user_id' => $user->id, 'company_id' => $company->id])->each(function ($c) use ($user, $company){ + factory(\App\Models\Client::class, 3)->create(['user_id' => $user->id, 'company_id' => $company->id])->each(function ($c) use ($user, $company){ factory(\App\Models\ClientContact::class,1)->create([ 'user_id' => $user->id, diff --git a/tests/Feature/InvoiceTest.php b/tests/Feature/InvoiceTest.php new file mode 100644 index 000000000000..3f0767e0c4b3 --- /dev/null +++ b/tests/Feature/InvoiceTest.php @@ -0,0 +1,30 @@ +faker = \Faker\Factory::create(); + + Model::reguard(); + + } + +}