Skip to content

Commit

Permalink
Initial Implementation of Adhoc Invoice Feature and Migrations
Browse files Browse the repository at this point in the history
  • Loading branch information
zanechua committed Nov 24, 2018
1 parent bf82837 commit 7aa6e9c
Show file tree
Hide file tree
Showing 18 changed files with 1,014 additions and 379 deletions.
251 changes: 251 additions & 0 deletions app/Http/Controllers/AdhocInvoiceController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,251 @@
<?php

namespace App\Http\Controllers;

use App\Http\Requests\CreateAdhocInvoiceRequest;
use App\Http\Requests\UpdateAdhocInvoiceRequest;
use App\Http\Requests\UpdateInvoiceRequest;
use App\Models\Company;
use App\Models\OldInvoice;
use App\Models\OldInvoiceItem;
use Illuminate\Http\Request;
use App\Models\Invoice;
use App\Models\InvoiceItem;
use PragmaRX\Countries\Package\Countries;

class AdhocInvoiceController extends Controller
{

public function __construct(){
$this->countries = new Countries();
}

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
//
}

/**
* Show the form for creating a new resource.
*
* @param Company $company
* @return Response
*/
public function create(Company $company)
{
if($company)
{
$invoicenumber = $company->niceinvoiceid();
$itemtemplates = $company->itemtemplates;
$countries = $this->countries->all();

return view('pages.invoice.adhoc.create', compact('company', 'invoicenumber', 'countries', 'itemtemplates'));
}
else
{
return view('pages.invoice.nocompany');
}
}

/**
* Store a newly created resource in storage.
*
* @param CreateAdhocInvoiceRequest $request
* @param Company $company
* @return Response
*/
public function store(CreateAdhocInvoiceRequest $request, Company $company)
{
$invoice = new Invoice;
$invoice->nice_invoice_id = $company->niceinvoiceid();
$invoice->fill($request->all());
$invoice->company_id = $company->id;
$invoice->notify = $request->has('notify') ? true : false;

$client = [
'companyname' => $request->input('companyname'),
'country_code' => $request->input('country_code'),
'block' => $request->input('block'),
'street' => $request->input('street'),
'unitnumber' => $request->input('unitnumber'),
'postalcode' => $request->input('postalcode')
];
$invoice->client_data = json_encode($client);

$invoice->save();

foreach($request->input('item_name') as $key => $item)
{
$invoiceitem = new InvoiceItem;
$invoiceitem->name = $item;
$invoiceitem->description = $request->input('item_description')[$key];
$invoiceitem->quantity = $request->input('item_quantity')[$key];
$invoiceitem->price = $request->input('item_price')[$key];
$invoiceitem->invoice_id = $invoice->id;
$invoiceitem->save();
}

$invoice->setInvoiceTotal();

flash('Invoice Created', 'success');

return redirect()->route('invoice.show', [ 'invoice' => $invoice, 'company' => $company ]);
}

/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}

/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit(Company $company, Invoice $invoice)
{
if($invoice->isLocked())
{
flash('More than 120 days has passed since the invoice has been completed, the invoice is now locked', 'error');

return redirect()->route('invoice.show', [ 'invoice' => $invoice, 'company' => $company ]);
}

$client = $invoice->getClient();
$countries = $this->countries->all();

return view('pages.invoice.adhoc.edit', compact('invoice', 'client', 'countries'));
}

/**
* Update the specified resource in storage.
*
* @param UpdateAdhocInvoiceRequest $request
* @param Company $company
* @param Invoice $invoice
* @return Response
*/
public function update(UpdateAdhocInvoiceRequest $request, Company $company, Invoice $invoice)
{
if($invoice->isLocked())
{
flash('More than 120 days has passed since the invoice has been completed, the invoice is now locked', 'error');

return redirect()->route('invoice.show', [ 'invoice' => $invoice, 'company' => $company ]);
}

$invoice->fill($request->all());
$invoice->notify = $request->has('notify') ? true : false;

$ismodified = false;

foreach($request->input('item_id') as $key => $itemid)
{
$invoiceitem = InvoiceItem::find($itemid);
$ismodified = $invoiceitem->modified(
$request->input('item_name')[$key],
$request->input('item_description')[$key],
$request->input('item_quantity')[$key],
$request->input('item_price')[$key]
);

if ($ismodified)
{
break;
}
}

if(count($request->input('item_name')) != count($request->input('item_id')))
{
$ismodified = true;
}

if($invoice->isDirty() || $ismodified){
$originalinvoice = $invoice->getOriginal();
$originalitems = $invoice->items;

$oldinvoice = new OldInvoice;
$oldinvoice->fill($originalinvoice);

$oldinvoice->created_at = $originalinvoice['created_at'];
$oldinvoice->updated_at = $originalinvoice['updated_at'];

$invoice->history()->save($oldinvoice);
$invoice->touch();

foreach($originalitems as $item)
{
$oldinvoiceitem = new OldInvoiceItem;
$oldinvoiceitem->fill($item->toArray());
$oldinvoiceitem->old_invoice_id = $oldinvoice->id;
$oldinvoiceitem->save();
}
}

$client = [
'companyname' => $request->input('companyname'),
'country_code' => $request->input('country_code'),
'block' => $request->input('block'),
'street' => $request->input('street'),
'unitnumber' => $request->input('unitnumber'),
'postalcode' => $request->input('postalcode')
];

$invoice->client_data = json_encode($client);

$invoice->save();

foreach($request->input('item_name') as $key => $itemname)
{
if (isset($request->input('item_id')[$key]))
{
//TODO: Validate the invoice item belongs to the invoice/company, need to do authentication here.
$invoiceitem = InvoiceItem::find($request->input('item_id')[$key]);
if($invoiceitem->invoice_id != $invoice->id)
{
continue;
}
}
else
{
$invoiceitem = new InvoiceItem;
}
$invoiceitem->name = $itemname;
$invoiceitem->description = $request->input('item_description')[$key];
$invoiceitem->quantity = $request->input('item_quantity')[$key];
$invoiceitem->price = $request->input('item_price')[$key];
$invoiceitem->invoice_id = $invoice->id;
$invoiceitem->save();
}

$invoice = $invoice->fresh();
$invoice->setInvoiceTotal();

flash('Invoice Updated', 'success');

return redirect()->route('invoice.show', [ 'invoice' => $invoice, 'company' => $company ]);
}

/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}
41 changes: 6 additions & 35 deletions app/Http/Controllers/InvoiceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Collection;
use PragmaRX\Countries\Package\Countries;
use Log;
use PDF;
use Uuid;
Expand All @@ -32,7 +31,6 @@
class InvoiceController extends Controller
{
public function __construct(){
$this->countries = new Countries();
}

/**
Expand Down Expand Up @@ -160,12 +158,11 @@ public function duplicate(Company $company, Invoice $invoice)
*/
public function create(Company $company)
{
$clients = $company->clients;
$itemtemplates = $company->itemtemplates;

if($company)
{
$invoicenumber = $company->niceinvoiceid();
$clients = $company->clients;
$itemtemplates = $company->itemtemplates;

if ($company->clients->count() == 0)
{
Expand Down Expand Up @@ -325,7 +322,7 @@ public function convertToQuote(Company $company, Invoice $invoice)
*/
public function show(Company $company, Invoice $invoice)
{
$client = $invoice->client;
$client = $invoice->getClient();
$histories = $invoice->history()->orderBy('updated_at', 'desc')->get();
$payments = $invoice->payments;
$event = $invoice->event;
Expand Down Expand Up @@ -390,6 +387,8 @@ public function edit(Company $company, Invoice $invoice)
* @param Company $company
* @param \App\Models\Invoice $invoice
* @return Response
* @throws \Recurr\Exception\InvalidArgument
* @throws \Recurr\Exception\InvalidRRule
*/
public function update(UpdateInvoiceRequest $request, Company $company, Invoice $invoice)
{
Expand Down Expand Up @@ -612,7 +611,7 @@ public function destroy(Company $company, Invoice $invoice)
*/
public function history(Company $company, Invoice $invoice)
{
$client = $invoice->client;
$client = $invoice->getClient();
$histories = $invoice->history()->orderBy('created_at', 'desc')->get();

return view('pages.invoice.history', compact('invoice', 'client', 'histories'));
Expand All @@ -631,32 +630,4 @@ public function checkSiblings(Company $company, Invoice $invoice)

return response()->json(compact('hasSiblings'));
}

/**
* Show the form for creating a new resource.
*
* @param Company $company
* @return Response
*/
public function adhoccreate(Company $company)
{
if($company)
{
if ($company->clients->count() == 0)
{
return view('pages.invoice.noclients');
}
else
{
$invoicenumber = $company->niceinvoiceid();
$countries = $this->countries->all();

return view('pages.invoice.adhoccreate', compact('company', 'invoicenumber', 'countries'));
}
}
else
{
return view('pages.invoice.nocompany');
}
}
}
5 changes: 3 additions & 2 deletions app/Http/Controllers/OldInvoiceController.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ public function store(Request $request, Company $company)
*/
public function show(Company $company, OldInvoice $invoice)
{
$client = $invoice->client;
$client = $invoice->getClient();

return view('pages.oldinvoice.show', compact('invoice', 'client'));
}

Expand All @@ -68,7 +69,7 @@ public function show(Company $company, OldInvoice $invoice)
public function printview(Company $company, OldInvoice $invoice)
{
$pdf = $invoice->generatePDFView();
return $pdf->inline(str_slug($invoice->nice_invoice_id . ' - ' . $invoice->created_at) . 'test.pdf');
return $pdf->inline(str_slug($invoice->nice_invoice_id . ' - ' . $invoice->created_at) . '.pdf');
}

/**
Expand Down
36 changes: 36 additions & 0 deletions app/Http/Requests/CreateAdhocInvoiceRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class CreateAdhocInvoiceRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'date' => 'required|date_format:"j F, Y"',
'netdays' => 'required|integer|min:0',
'companyname' => 'required|string',
'item_name.*' => 'required|string',
'item_quantity.*' => 'required|integer|min:1',
'item_price.*' => 'required|numeric',
'item_description.*' => 'required|string',
];
}
}
Loading

0 comments on commit 7aa6e9c

Please sign in to comment.