From 7beeb78126e08876e4dda375295a9caf738f5601 Mon Sep 17 00:00:00 2001 From: Hillel Coren Date: Wed, 6 Jan 2016 22:46:11 +0200 Subject: [PATCH] Enabled updating/archiving invoice through the API --- app/Http/Controllers/InvoiceApiController.php | 85 +++++++++---------- app/Http/Controllers/InvoiceController.php | 6 +- .../Controllers/PublicClientController.php | 2 +- app/Http/Requests/CreateClientRequest.php | 4 +- app/Http/Requests/CreateInvoiceRequest.php | 37 ++++++++ ...t.php => SaveInvoiceWithClientRequest.php} | 2 +- app/Http/Requests/UpdateInvoiceRequest.php | 42 +++++++++ app/Models/Account.php | 2 +- app/Ninja/Repositories/InvoiceRepository.php | 6 +- .../Transformers/InvoiceItemTransformer.php | 2 +- app/Ninja/Transformers/InvoiceTransformer.php | 4 +- 11 files changed, 135 insertions(+), 57 deletions(-) create mode 100644 app/Http/Requests/CreateInvoiceRequest.php rename app/Http/Requests/{SaveInvoiceRequest.php => SaveInvoiceWithClientRequest.php} (95%) create mode 100644 app/Http/Requests/UpdateInvoiceRequest.php diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index 4b7fe3391411..052853c8d822 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -15,6 +15,8 @@ use App\Ninja\Repositories\InvoiceRepository; use App\Ninja\Mailers\ContactMailer as Mailer; use App\Http\Controllers\BaseAPIController; use App\Ninja\Transformers\InvoiceTransformer; +use App\Http\Requests\CreateInvoiceRequest; +use App\Http\Requests\UpdateInvoiceRequest; class InvoiceApiController extends BaseAPIController { @@ -103,15 +105,11 @@ class InvoiceApiController extends BaseAPIController * ) * ) */ - public function store() + public function store(CreateInvoiceRequest $request) { $data = Input::all(); $error = null; - if (isset($data['id']) || isset($data['public_id'])) { - die("We don't yet support updating invoices"); - } - if (isset($data['email'])) { $email = $data['email']; $client = Client::scope()->whereHas('contacts', function($query) use ($email) { @@ -140,52 +138,30 @@ class InvoiceApiController extends BaseAPIController $client = $this->clientRepo->save($clientData); } } else if (isset($data['client_id'])) { - $client = Client::scope($data['client_id'])->first(); + $client = Client::scope($data['client_id'])->firstOrFail(); } - // check if the invoice number is set and unique - if (!isset($data['invoice_number']) && !isset($data['id'])) { - // do nothing... invoice number will be set automatically - } else if (isset($data['invoice_number'])) { - $invoice = Invoice::scope()->where('invoice_number', '=', $data['invoice_number'])->first(); - if ($invoice) { - $error = trans('validation.unique', ['attribute' => 'texts.invoice_number']); - } + $data = self::prepareData($data, $client); + $data['client_id'] = $client->id; + $invoice = $this->invoiceRepo->save($data); + + if (!isset($data['id'])) { + $invitation = Invitation::createNew(); + $invitation->invoice_id = $invoice->id; + $invitation->contact_id = $client->contacts[0]->id; + $invitation->invitation_key = str_random(RANDOM_KEY_LENGTH); + $invitation->save(); } - if (!$error) { - if (!isset($data['client_id']) && !isset($data['email'])) { - $error = trans('validation.required_without', ['attribute' => 'client_id', 'values' => 'email']); - } else if (!$client) { - $error = trans('validation.not_in', ['attribute' => 'client_id']); - } + if (isset($data['email_invoice']) && $data['email_invoice']) { + $this->mailer->sendInvoice($invoice); } - if ($error) { - return $error; - } else { - $data = self::prepareData($data, $client); - $data['client_id'] = $client->id; - $invoice = $this->invoiceRepo->save($data); + $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first(); + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($invoice, $transformer, 'invoice'); - if (!isset($data['id'])) { - $invitation = Invitation::createNew(); - $invitation->invoice_id = $invoice->id; - $invitation->contact_id = $client->contacts[0]->id; - $invitation->invitation_key = str_random(RANDOM_KEY_LENGTH); - $invitation->save(); - } - - if (isset($data['email_invoice']) && $data['email_invoice']) { - $this->mailer->sendInvoice($invoice); - } - - $invoice = Invoice::scope($invoice->public_id)->with('client', 'invoice_items', 'invitations')->first(); - $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); - $data = $this->createItem($invoice, $transformer, 'invoice'); - - return $this->response($data); - } + return $this->response($data); } private function prepareData($data, $client) @@ -306,8 +282,25 @@ class InvoiceApiController extends BaseAPIController } - public function update($invoiceId = null) + public function update(UpdateInvoiceRequest $request, $publicId) { - //PUT Stub + if ($request->action == ACTION_ARCHIVE) { + $invoice = Invoice::scope($publicId)->firstOrFail(); + $this->invoiceRepo->archive($invoice); + + $response = json_encode(RESULT_SUCCESS, JSON_PRETTY_PRINT); + $headers = Utils::getApiHeaders(); + return Response::make($response, 200, $headers); + } + + $data = $request->input(); + $data['public_id'] = $publicId; + $this->invoiceRepo->save($data); + + $invoice = Invoice::scope($publicId)->with('client', 'invoice_items', 'invitations')->firstOrFail(); + $transformer = new InvoiceTransformer(\Auth::user()->account, Input::get('serializer')); + $data = $this->createItem($invoice, $transformer, 'invoice'); + + return $this->response($data); } } diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 8faa389de95c..5aa787661cfd 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -28,7 +28,7 @@ use App\Events\InvoiceInvitationWasViewed; use App\Events\QuoteInvitationWasViewed; use App\Services\InvoiceService; use App\Services\RecurringInvoiceService; -use App\Http\Requests\SaveInvoiceRequest; +use App\Http\Requests\SaveInvoiceWithClientRequest; class InvoiceController extends BaseController { @@ -440,7 +440,7 @@ class InvoiceController extends BaseController * * @return Response */ - public function store(SaveInvoiceRequest $request) + public function store(SaveInvoiceWithClientRequest $request) { $action = Input::get('action'); $entityType = Input::get('entityType'); @@ -474,7 +474,7 @@ class InvoiceController extends BaseController * @param int $id * @return Response */ - public function update(SaveInvoiceRequest $request) + public function update(SaveInvoiceWithClientRequest $request) { $action = Input::get('action'); $entityType = Input::get('entityType'); diff --git a/app/Http/Controllers/PublicClientController.php b/app/Http/Controllers/PublicClientController.php index 679e01a29914..dd57425a8a57 100644 --- a/app/Http/Controllers/PublicClientController.php +++ b/app/Http/Controllers/PublicClientController.php @@ -39,7 +39,7 @@ class PublicClientController extends BaseController 'hideLogo' => $account->isWhiteLabel(), 'clientViewCSS' => $account->clientViewCSS(), ]; - + return response()->view('invited.dashboard', $data); } diff --git a/app/Http/Requests/CreateClientRequest.php b/app/Http/Requests/CreateClientRequest.php index 00837d01e511..6fb7060e422f 100644 --- a/app/Http/Requests/CreateClientRequest.php +++ b/app/Http/Requests/CreateClientRequest.php @@ -38,7 +38,9 @@ class CreateClientRequest extends Request } return $factory->make( - $this->input(), $this->container->call([$this, 'rules']), $this->messages() + $this->input(), + $this->container->call([$this, 'rules']), + $this->messages() ); } } diff --git a/app/Http/Requests/CreateInvoiceRequest.php b/app/Http/Requests/CreateInvoiceRequest.php new file mode 100644 index 000000000000..4a11ea56044a --- /dev/null +++ b/app/Http/Requests/CreateInvoiceRequest.php @@ -0,0 +1,37 @@ + 'required_without:client_id', + 'client_id' => 'required_without:email', + 'invoice_items' => 'valid_invoice_items', + 'invoice_number' => 'unique:invoices,invoice_number,,id,account_id,'.Auth::user()->account_id, + 'discount' => 'positive', + ]; + + return $rules; + } +} diff --git a/app/Http/Requests/SaveInvoiceRequest.php b/app/Http/Requests/SaveInvoiceWithClientRequest.php similarity index 95% rename from app/Http/Requests/SaveInvoiceRequest.php rename to app/Http/Requests/SaveInvoiceWithClientRequest.php index 95b14684f307..be925c03207f 100644 --- a/app/Http/Requests/SaveInvoiceRequest.php +++ b/app/Http/Requests/SaveInvoiceWithClientRequest.php @@ -5,7 +5,7 @@ use App\Http\Requests\Request; use Illuminate\Validation\Factory; use App\Models\Invoice; -class SaveInvoiceRequest extends Request +class SaveInvoiceWithClientRequest extends Request { /** * Determine if the user is authorized to make this request. diff --git a/app/Http/Requests/UpdateInvoiceRequest.php b/app/Http/Requests/UpdateInvoiceRequest.php new file mode 100644 index 000000000000..68fa2acaa708 --- /dev/null +++ b/app/Http/Requests/UpdateInvoiceRequest.php @@ -0,0 +1,42 @@ +action == ACTION_ARCHIVE) { + return []; + } + + $publicId = $this->route('invoices'); + $invoiceId = Invoice::getPrivateId($publicId); + + $rules = [ + 'invoice_items' => 'required|valid_invoice_items', + 'invoice_number' => 'unique:invoices,invoice_number,'.$invoiceId.',id,account_id,'.Auth::user()->account_id, + 'discount' => 'positive', + ]; + + return $rules; + } +} diff --git a/app/Models/Account.php b/app/Models/Account.php index ae8276a48dd8..107862557fe0 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -876,7 +876,7 @@ class Account extends Eloquent } public function clientViewCSS(){ - if (($this->isNinjaAccount() && $this->isPro()) || $this->isWhiteLabel()) { + if ((Utils::isNinja() && $this->isPro()) || $this->isWhiteLabel()) { return $this->client_view_css; } diff --git a/app/Ninja/Repositories/InvoiceRepository.php b/app/Ninja/Repositories/InvoiceRepository.php index 3504399238c2..08b1987323dc 100644 --- a/app/Ninja/Repositories/InvoiceRepository.php +++ b/app/Ninja/Repositories/InvoiceRepository.php @@ -233,7 +233,11 @@ class InvoiceRepository extends BaseRepository if (isset($data['partial'])) { $invoice->partial = round(Utils::parseFloat($data['partial']), 2); } - $invoice->invoice_date = isset($data['invoice_date_sql']) ? $data['invoice_date_sql'] : Utils::toSqlDate($data['invoice_date']); + if (isset($data['invoice_date_sql'])) { + $invoice->invoice_date = $data['invoice_date_sql']; + } elseif (isset($data['invoice_date'])) { + $invoice->invoice_date = Utils::toSqlDate($data['invoice_date']); + } if ($invoice->is_recurring) { if ($invoice->start_date && $invoice->start_date != Utils::toSqlDate($data['start_date'])) { diff --git a/app/Ninja/Transformers/InvoiceItemTransformer.php b/app/Ninja/Transformers/InvoiceItemTransformer.php index 0943094b7535..66d9fe137dd8 100644 --- a/app/Ninja/Transformers/InvoiceItemTransformer.php +++ b/app/Ninja/Transformers/InvoiceItemTransformer.php @@ -20,7 +20,7 @@ class InvoiceItemTransformer extends EntityTransformer 'cost' => (float) $item->cost, 'qty' => (float) $item->qty, 'tax_name' => $item->tax_name, - 'tax_rate' => $item->tax_rate + 'tax_rate' => (float) $item->tax_rate ]; } } \ No newline at end of file diff --git a/app/Ninja/Transformers/InvoiceTransformer.php b/app/Ninja/Transformers/InvoiceTransformer.php index 9f4560f267af..09d24ae83260 100644 --- a/app/Ninja/Transformers/InvoiceTransformer.php +++ b/app/Ninja/Transformers/InvoiceTransformer.php @@ -73,8 +73,8 @@ class InvoiceTransformer extends EntityTransformer 'auto_bill' => (bool) $invoice->auto_bill, 'account_key' => $this->account->account_key, 'user_id' => (int) $invoice->user->public_id + 1, - 'custom_value1' => $invoice->custom_value1, - 'custom_value2' => $invoice->custom_value2, + 'custom_value1' => (float) $invoice->custom_value1, + 'custom_value2' => (float) $invoice->custom_value2, 'custom_taxes1' => (bool) $invoice->custom_taxes1, 'custom_taxes2' => (bool) $invoice->custom_taxes2, ];