mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-24 02:14:21 -04:00
Expense a Purchase Order
This commit is contained in:
parent
ffcd3b05d4
commit
6b3b50318b
@ -29,8 +29,10 @@ use App\Jobs\PurchaseOrder\PurchaseOrderEmail;
|
|||||||
use App\Jobs\PurchaseOrder\ZipPurchaseOrders;
|
use App\Jobs\PurchaseOrder\ZipPurchaseOrders;
|
||||||
use App\Models\Account;
|
use App\Models\Account;
|
||||||
use App\Models\Client;
|
use App\Models\Client;
|
||||||
|
use App\Models\Expense;
|
||||||
use App\Models\PurchaseOrder;
|
use App\Models\PurchaseOrder;
|
||||||
use App\Repositories\PurchaseOrderRepository;
|
use App\Repositories\PurchaseOrderRepository;
|
||||||
|
use App\Transformers\ExpenseTransformer;
|
||||||
use App\Transformers\PurchaseOrderTransformer;
|
use App\Transformers\PurchaseOrderTransformer;
|
||||||
use App\Utils\Ninja;
|
use App\Utils\Ninja;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
@ -640,6 +642,16 @@ class PurchaseOrderController extends BaseController
|
|||||||
if (! $bulk) {
|
if (! $bulk) {
|
||||||
return response()->json(['message' => 'email sent'], 200);
|
return response()->json(['message' => 'email sent'], 200);
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 'expense':
|
||||||
|
|
||||||
|
if($purchase_order->expense()->exists())
|
||||||
|
return response()->json(['message' => ctrans('texts.purchase_order_already_expensed')], 400);
|
||||||
|
|
||||||
|
$expense = $purchase_order->service()->expense();
|
||||||
|
|
||||||
|
return $this->itemResponse($purchase_order);
|
||||||
|
|
||||||
case 'cancel':
|
case 'cancel':
|
||||||
|
|
||||||
|
@ -102,6 +102,11 @@ class Expense extends BaseModel
|
|||||||
return $this->belongsTo(Client::class);
|
return $this->belongsTo(Client::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function purchase_order()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(PurchaseOrder::class);
|
||||||
|
}
|
||||||
|
|
||||||
public function translate_entity()
|
public function translate_entity()
|
||||||
{
|
{
|
||||||
return ctrans('texts.expense');
|
return ctrans('texts.expense');
|
||||||
|
@ -72,10 +72,6 @@ class PurchaseOrder extends BaseModel
|
|||||||
'custom_surcharge2',
|
'custom_surcharge2',
|
||||||
'custom_surcharge3',
|
'custom_surcharge3',
|
||||||
'custom_surcharge4',
|
'custom_surcharge4',
|
||||||
// 'custom_surcharge_tax1',
|
|
||||||
// 'custom_surcharge_tax2',
|
|
||||||
// 'custom_surcharge_tax3',
|
|
||||||
// 'custom_surcharge_tax4',
|
|
||||||
'design_id',
|
'design_id',
|
||||||
'invoice_id',
|
'invoice_id',
|
||||||
'assigned_user_id',
|
'assigned_user_id',
|
||||||
@ -83,7 +79,6 @@ class PurchaseOrder extends BaseModel
|
|||||||
'balance',
|
'balance',
|
||||||
'partial',
|
'partial',
|
||||||
'paid_to_date',
|
'paid_to_date',
|
||||||
// 'subscription_id',
|
|
||||||
'vendor_id',
|
'vendor_id',
|
||||||
'last_viewed'
|
'last_viewed'
|
||||||
];
|
];
|
||||||
@ -171,6 +166,11 @@ class PurchaseOrder extends BaseModel
|
|||||||
return $this->belongsTo(Company::class);
|
return $this->belongsTo(Company::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function expense()
|
||||||
|
{
|
||||||
|
return $this->hasOne(Expense::class);
|
||||||
|
}
|
||||||
|
|
||||||
public function user()
|
public function user()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(User::class)->withTrashed();
|
return $this->belongsTo(User::class)->withTrashed();
|
||||||
|
41
app/Services/PurchaseOrder/PurchaseOrderExpense.php
Normal file
41
app/Services/PurchaseOrder/PurchaseOrderExpense.php
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com).
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2022. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://www.elastic.co/licensing/elastic-license
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Services\PurchaseOrder;
|
||||||
|
|
||||||
|
use App\Factory\ExpenseFactory;
|
||||||
|
use App\Models\PurchaseOrder;
|
||||||
|
|
||||||
|
class PurchaseOrderExpense
|
||||||
|
{
|
||||||
|
|
||||||
|
private PurchaseOrder $purchase_order;
|
||||||
|
|
||||||
|
public function __construct(PurchaseOrder $purchase_order)
|
||||||
|
{
|
||||||
|
$this->purchase_order = $purchase_order;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function run()
|
||||||
|
{
|
||||||
|
|
||||||
|
$expense = ExpenseFactory::create($this->purchase_order->company_id, $this->purchase_order->user_id);
|
||||||
|
$expense->amount = $this->purchase_order->amount;
|
||||||
|
$expense->date = now();
|
||||||
|
$expense->vendor_id = $this->purchase_order->vendor_id;
|
||||||
|
$expense->public_notes = $this->purchase_order->public_notes;
|
||||||
|
$expense->purchase_order_id = $this->purchase_order->id;
|
||||||
|
$expense->save();
|
||||||
|
|
||||||
|
return $expense;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -16,6 +16,7 @@ use App\Models\PurchaseOrder;
|
|||||||
use App\Services\PurchaseOrder\ApplyNumber;
|
use App\Services\PurchaseOrder\ApplyNumber;
|
||||||
use App\Services\PurchaseOrder\CreateInvitations;
|
use App\Services\PurchaseOrder\CreateInvitations;
|
||||||
use App\Services\PurchaseOrder\GetPurchaseOrderPdf;
|
use App\Services\PurchaseOrder\GetPurchaseOrderPdf;
|
||||||
|
use App\Services\PurchaseOrder\PurchaseOrderExpense;
|
||||||
use App\Services\PurchaseOrder\TriggeredActions;
|
use App\Services\PurchaseOrder\TriggeredActions;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
|
|
||||||
@ -115,6 +116,15 @@ class PurchaseOrderService
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function expense()
|
||||||
|
{
|
||||||
|
$this->markSent();
|
||||||
|
|
||||||
|
$expense = (new PurchaseOrderExpense($this->purchase_order))->run();
|
||||||
|
|
||||||
|
return $expense;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Saves the purchase order.
|
* Saves the purchase order.
|
||||||
* @return \App\Models\PurchaseOrder object
|
* @return \App\Models\PurchaseOrder object
|
||||||
|
@ -78,7 +78,6 @@ class ExpenseTransformer extends EntityTransformer
|
|||||||
'transaction_reference' => (string) $expense->transaction_reference ?: '',
|
'transaction_reference' => (string) $expense->transaction_reference ?: '',
|
||||||
'transaction_id' => (string) $expense->transaction_id ?: '',
|
'transaction_id' => (string) $expense->transaction_id ?: '',
|
||||||
'date' => $expense->date ?: '',
|
'date' => $expense->date ?: '',
|
||||||
//'expense_date' => $expense->date ?: '',
|
|
||||||
'number' => (string)$expense->number ?: '',
|
'number' => (string)$expense->number ?: '',
|
||||||
'payment_date' => $expense->payment_date ?: '',
|
'payment_date' => $expense->payment_date ?: '',
|
||||||
'custom_value1' => $expense->custom_value1 ?: '',
|
'custom_value1' => $expense->custom_value1 ?: '',
|
||||||
@ -95,6 +94,7 @@ class ExpenseTransformer extends EntityTransformer
|
|||||||
'uses_inclusive_taxes' => (bool) $expense->uses_inclusive_taxes,
|
'uses_inclusive_taxes' => (bool) $expense->uses_inclusive_taxes,
|
||||||
'calculate_tax_by_amount' => (bool) $expense->calculate_tax_by_amount,
|
'calculate_tax_by_amount' => (bool) $expense->calculate_tax_by_amount,
|
||||||
'entity_type' => 'expense',
|
'entity_type' => 'expense',
|
||||||
|
'purchase_order_id' => (string) $this->encodePrimaryKey($expense->purchase_order_id),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class AddPurchaseOrderToExpense extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('expenses', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger('purchase_order_id')->nullable()->index();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
@ -4634,6 +4634,7 @@ $LANG = array(
|
|||||||
'notification_purchase_order_accepted_subject' => 'Purchase Order :purchase_order was accepted by :vendor',
|
'notification_purchase_order_accepted_subject' => 'Purchase Order :purchase_order was accepted by :vendor',
|
||||||
'notification_purchase_order_accepted' => 'The following vendor :vendor accepted Purchase Order :purchase_order for :amount.',
|
'notification_purchase_order_accepted' => 'The following vendor :vendor accepted Purchase Order :purchase_order for :amount.',
|
||||||
'amount_received' => 'Amount received',
|
'amount_received' => 'Amount received',
|
||||||
|
'purchase_order_already_expensed' => 'Already converted to an expense.',
|
||||||
);
|
);
|
||||||
|
|
||||||
return $LANG;
|
return $LANG;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user