diff --git a/app/Http/Controllers/PurchaseOrderController.php b/app/Http/Controllers/PurchaseOrderController.php index e7ec463ab6c2..c09095c5191c 100644 --- a/app/Http/Controllers/PurchaseOrderController.php +++ b/app/Http/Controllers/PurchaseOrderController.php @@ -29,8 +29,10 @@ use App\Jobs\PurchaseOrder\PurchaseOrderEmail; use App\Jobs\PurchaseOrder\ZipPurchaseOrders; use App\Models\Account; use App\Models\Client; +use App\Models\Expense; use App\Models\PurchaseOrder; use App\Repositories\PurchaseOrderRepository; +use App\Transformers\ExpenseTransformer; use App\Transformers\PurchaseOrderTransformer; use App\Utils\Ninja; use App\Utils\Traits\MakesHash; @@ -640,6 +642,16 @@ class PurchaseOrderController extends BaseController if (! $bulk) { 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': diff --git a/app/Models/Expense.php b/app/Models/Expense.php index 4258a70dd8a5..fe748816b6b7 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -102,6 +102,11 @@ class Expense extends BaseModel return $this->belongsTo(Client::class); } + public function purchase_order() + { + return $this->belongsTo(PurchaseOrder::class); + } + public function translate_entity() { return ctrans('texts.expense'); diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index 445535163633..e9b66389932b 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -72,10 +72,6 @@ class PurchaseOrder extends BaseModel 'custom_surcharge2', 'custom_surcharge3', 'custom_surcharge4', -// 'custom_surcharge_tax1', -// 'custom_surcharge_tax2', -// 'custom_surcharge_tax3', -// 'custom_surcharge_tax4', 'design_id', 'invoice_id', 'assigned_user_id', @@ -83,7 +79,6 @@ class PurchaseOrder extends BaseModel 'balance', 'partial', 'paid_to_date', - // 'subscription_id', 'vendor_id', 'last_viewed' ]; @@ -171,6 +166,11 @@ class PurchaseOrder extends BaseModel return $this->belongsTo(Company::class); } + public function expense() + { + return $this->hasOne(Expense::class); + } + public function user() { return $this->belongsTo(User::class)->withTrashed(); diff --git a/app/Services/PurchaseOrder/PurchaseOrderExpense.php b/app/Services/PurchaseOrder/PurchaseOrderExpense.php new file mode 100644 index 000000000000..52f7d6fae674 --- /dev/null +++ b/app/Services/PurchaseOrder/PurchaseOrderExpense.php @@ -0,0 +1,41 @@ +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; + + } +} diff --git a/app/Services/PurchaseOrder/PurchaseOrderService.php b/app/Services/PurchaseOrder/PurchaseOrderService.php index e68e5c508761..161585011264 100644 --- a/app/Services/PurchaseOrder/PurchaseOrderService.php +++ b/app/Services/PurchaseOrder/PurchaseOrderService.php @@ -16,6 +16,7 @@ use App\Models\PurchaseOrder; use App\Services\PurchaseOrder\ApplyNumber; use App\Services\PurchaseOrder\CreateInvitations; use App\Services\PurchaseOrder\GetPurchaseOrderPdf; +use App\Services\PurchaseOrder\PurchaseOrderExpense; use App\Services\PurchaseOrder\TriggeredActions; use App\Utils\Traits\MakesHash; @@ -115,6 +116,15 @@ class PurchaseOrderService return $this; } + public function expense() + { + $this->markSent(); + + $expense = (new PurchaseOrderExpense($this->purchase_order))->run(); + + return $expense; + } + /** * Saves the purchase order. * @return \App\Models\PurchaseOrder object diff --git a/app/Transformers/ExpenseTransformer.php b/app/Transformers/ExpenseTransformer.php index f6d0c092fa03..17143e29eff5 100644 --- a/app/Transformers/ExpenseTransformer.php +++ b/app/Transformers/ExpenseTransformer.php @@ -78,7 +78,6 @@ class ExpenseTransformer extends EntityTransformer 'transaction_reference' => (string) $expense->transaction_reference ?: '', 'transaction_id' => (string) $expense->transaction_id ?: '', 'date' => $expense->date ?: '', - //'expense_date' => $expense->date ?: '', 'number' => (string)$expense->number ?: '', 'payment_date' => $expense->payment_date ?: '', 'custom_value1' => $expense->custom_value1 ?: '', @@ -95,6 +94,7 @@ class ExpenseTransformer extends EntityTransformer 'uses_inclusive_taxes' => (bool) $expense->uses_inclusive_taxes, 'calculate_tax_by_amount' => (bool) $expense->calculate_tax_by_amount, 'entity_type' => 'expense', + 'purchase_order_id' => (string) $this->encodePrimaryKey($expense->purchase_order_id), ]; } } diff --git a/database/migrations/2022_07_06_080127_add_purchase_order_to_expense.php b/database/migrations/2022_07_06_080127_add_purchase_order_to_expense.php new file mode 100644 index 000000000000..a652404a4ced --- /dev/null +++ b/database/migrations/2022_07_06_080127_add_purchase_order_to_expense.php @@ -0,0 +1,29 @@ +unsignedInteger('purchase_order_id')->nullable()->index(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + } +} diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index 4c9df86e6ac1..5761ff1b3646 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -4634,6 +4634,7 @@ $LANG = array( '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.', 'amount_received' => 'Amount received', + 'purchase_order_already_expensed' => 'Already converted to an expense.', ); return $LANG;