diff --git a/app/Factory/CloneInvoiceFactory.php b/app/Factory/CloneInvoiceFactory.php new file mode 100644 index 000000000000..f4cb5bd1a057 --- /dev/null +++ b/app/Factory/CloneInvoiceFactory.php @@ -0,0 +1,25 @@ +replicate(); + $clone_invoice->status_id = Invoice::STATUS_DRAFT; + $clone_invoice->invoice_number = ''; + $clone_invoice->invoice_date = null; + $clone_invoice->due_date = null; + $clone_invoice->partial_due_date = null; + $clone_invoice->user_id = $user_id; + $clone_invoice->balance = $invoice->amount; + $clone_invoice->settings = $invoice->settings; + $clone_invoice->line_items = $invoice->line_items; + + return $clone_invoice; + } + +} \ No newline at end of file diff --git a/app/Factory/InvoiceFactory.php b/app/Factory/InvoiceFactory.php index 3615e97d869d..7652bbdec9cf 100644 --- a/app/Factory/InvoiceFactory.php +++ b/app/Factory/InvoiceFactory.php @@ -17,8 +17,13 @@ class InvoiceFactory $invoice->discount = 0; $invoice->is_amount_discount = true; $invoice->po_number = ''; + $invoice->footer = ''; + $invoice->terms = ''; + $invoice->public_notes = ''; + $invoice->private_notes = ''; $invoice->invoice_date = null; $invoice->due_date = null; + $invoice->partial_due_date = null; $invoice->is_deleted = false; $invoice->line_items = json_encode([]); $invoice->settings = ClientSettings::buildClientSettings(CompanySettings::defaults(), ClientSettings::defaults()); //todo need to embed the settings here diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 0a598bccede1..941c8655705a 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -2,8 +2,10 @@ namespace App\Http\Controllers; +use App\Factory\CloneInvoiceFactory; use App\Factory\InvoiceFactory; use App\Filters\InvoiceFilters; +use App\Http\Requests\Invoice\ActionInvoiceRequest; use App\Http\Requests\Invoice\CreateInvoiceRequest; use App\Http\Requests\Invoice\DestroyInvoiceRequest; use App\Http\Requests\Invoice\EditInvoiceRequest; @@ -15,6 +17,7 @@ use App\Repositories\InvoiceRepository; use App\Transformers\InvoiceTransformer; use App\Utils\Traits\MakesHash; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; /** * Class InvoiceController @@ -161,5 +164,41 @@ class InvoiceController extends BaseController return response()->json([], 200); } + + public function action(ActionInvoiceRequest $request, Invoice $invoice, $action) + { + + switch ($action) { + case 'clone': + $invoice = CloneInvoiceFactory::create($invoice, auth()->user()->id); + return $this->itemResponse($invoice); + break; + case 'clone_to_quote': + # code... + break; + case 'history': + # code... + break; + case 'delivery_note': + # code... + break; + case 'mark_paid': + # code... + break; + case 'archive': + # code... + break; + case 'delete': + # code... + break; + case 'email': + //dispatch email to queue + break; + + default: + # code... + break; + } + } } diff --git a/app/Http/Requests/Invoice/ActionInvoiceRequest.php b/app/Http/Requests/Invoice/ActionInvoiceRequest.php new file mode 100644 index 000000000000..4987f00fb9d0 --- /dev/null +++ b/app/Http/Requests/Invoice/ActionInvoiceRequest.php @@ -0,0 +1,21 @@ +user()->can('edit', $this->invoice); + } + +} \ No newline at end of file diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 9cbe771a79a2..3bab2c4c3499 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -23,9 +23,10 @@ class Invoice extends BaseModel const STATUS_DRAFT = 1; const STATUS_SENT = 2; - const STATUS_VIEWED = 3; const STATUS_PARTIAL = 5; const STATUS_PAID = 6; + const STATUS_REVERSED = 7; //new for V2 + const STATUS_OVERDUE = -1; const STATUS_UNPAID = -2; diff --git a/app/Transformers/InvoiceTransformer.php b/app/Transformers/InvoiceTransformer.php index 5867c91ab115..a2f0ab0f1f5f 100644 --- a/app/Transformers/InvoiceTransformer.php +++ b/app/Transformers/InvoiceTransformer.php @@ -125,22 +125,16 @@ class InvoiceTransformer extends EntityTransformer 'invoice_status_id' => (int) ($invoice->invoice_status_id ?: 1), 'updated_at' => $invoice->updated_at, 'archived_at' => $invoice->deleted_at, - 'invoice_number' => $invoice->is_recurring ? '' : $invoice->invoice_number, + 'invoice_number' => $invoice->invoice_number, 'discount' => (float) $invoice->discount, 'po_number' => $invoice->po_number, 'invoice_date' => $invoice->invoice_date ?: '', 'due_date' => $invoice->due_date ?: '', - 'terms' => $invoice->terms, + 'terms' => $invoice->terms ?: '', 'public_notes' => $invoice->public_notes ?: '', 'private_notes' => $invoice->private_notes ?: '', 'is_deleted' => (bool) $invoice->is_deleted, 'invoice_type_id' => (int) $invoice->invoice_type_id, - 'is_recurring' => (bool) $invoice->is_recurring, - 'frequency_id' => (int) $invoice->frequency_id, - 'start_date' => $invoice->start_date ?: '', - 'end_date' => $invoice->end_date ?: '', - 'last_sent_date' => $invoice->last_sent_date ?: '', - 'recurring_invoice_id' => (int) ($invoice->recurring_invoice_id ?: 0), 'tax_name1' => $invoice->tax_name1 ? $invoice->tax_name1 : '', 'tax_rate1' => (float) $invoice->tax_rate1, 'tax_name2' => $invoice->tax_name2 ? $invoice->tax_name2 : '', @@ -149,18 +143,16 @@ class InvoiceTransformer extends EntityTransformer 'invoice_footer' => $invoice->invoice_footer ?: '', 'partial' => (float) ($invoice->partial ?: 0.0), 'partial_due_date' => $invoice->partial_due_date ?: '', - 'has_tasks' => (bool) $invoice->has_tasks, - 'auto_bill' => (bool) $invoice->auto_bill, 'custom_value1' => (float) $invoice->custom_value1, 'custom_value2' => (float) $invoice->custom_value2, 'custom_taxes1' => (bool) $invoice->custom_taxes1, 'custom_taxes2' => (bool) $invoice->custom_taxes2, + 'has_tasks' => (bool) $invoice->has_tasks, 'has_expenses' => (bool) $invoice->has_expenses, - 'quote_invoice_id' => (int) ($invoice->quote_invoice_id ?: 0), 'custom_text_value1' => $invoice->custom_text_value1 ?: '', 'custom_text_value2' => $invoice->custom_text_value2 ?: '', - 'is_public' => (bool) $invoice->is_public, 'backup' => $invoice->backup ?: '', + 'settings' => $invoice->settings, ]; } } \ No newline at end of file diff --git a/database/migrations/2014_10_13_000000_create_users_table.php b/database/migrations/2014_10_13_000000_create_users_table.php index 0e6c07729dcf..49194746390b 100644 --- a/database/migrations/2014_10_13_000000_create_users_table.php +++ b/database/migrations/2014_10_13_000000_create_users_table.php @@ -357,6 +357,12 @@ class CreateUsersTable extends Migration $t->text('settings')->nullable(); $t->text('backup')->nullable(); + $t->text('footer')->nullable(); + $t->text('public_notes')->nullable(); + $t->text('private_notes')->nullable(); + $t->text('terms')->nullable(); + + $t->string('tax_name1'); $t->decimal('tax_rate1', 13, 3); @@ -371,6 +377,9 @@ class CreateUsersTable extends Migration $t->decimal('amount', 13, 2); $t->decimal('balance', 13, 2); $t->decimal('partial', 13, 2)->nullable(); + $t->date('partial_due_date')->nullable(); + + $t->datetime('last_viewed')->nullable(); $t->foreign('client_id')->references('id')->on('clients')->onDelete('cascade'); $t->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); diff --git a/routes/api.php b/routes/api.php index 86474de7f686..0076e0754562 100644 --- a/routes/api.php +++ b/routes/api.php @@ -34,6 +34,8 @@ Route::group(['middleware' => ['db','api_secret_check','token_auth'], 'prefix' = Route::resource('invoices', 'InvoiceController'); // name = (invoices. index / create / show / update / destroy / edit + Route::get('invoices/{invoice}/{action}', 'InvoiceController@action'); + Route::post('invoices/bulk', 'InvoiceController@bulk')->name('invoices.bulk'); Route::resource('products', 'ProductController'); // name = (products. index / create / show / update / destroy / edit diff --git a/tests/Unit/MakesDatesTest.php b/tests/Unit/MakesDatesTest.php index 3d8bbb8614cf..5fa00ff6680c 100644 --- a/tests/Unit/MakesDatesTest.php +++ b/tests/Unit/MakesDatesTest.php @@ -49,7 +49,7 @@ class MakesDatesTest extends TestCase { $date_src = '2007-04-19 23:59'; - $client_timezone = 'Atlantic/Cape_Verde'; // +1 UTC + $client_timezone = 'Atlantic/Cape_Verde'; // -1 UTC $date_time = new \DateTime($date_src, new \DateTimeZone($client_timezone)); $utc_date = $this->createUtcDate($date_time, $client_timezone); @@ -61,7 +61,7 @@ class MakesDatesTest extends TestCase { $date_src = '2007-04-19 22:59'; - $client_timezone = 'Atlantic/Cape_Verde'; // +1 UTC + $client_timezone = 'Atlantic/Cape_Verde'; // -1 UTC $date_time = new \DateTime($date_src, new \DateTimeZone($client_timezone)); $utc_date = $this->createUtcDate($date_time, $client_timezone);