sarga/packages/Webkul/Sales/src/Repositories/InvoiceRepository.php

268 lines
10 KiB
PHP
Raw Normal View History

<?php
namespace Webkul\Sales\Repositories;
use Illuminate\Container\Container as App;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\DB;
use Webkul\Core\Eloquent\Repository;
2019-04-03 13:21:05 +00:00
use Webkul\Sales\Contracts\Invoice;
class InvoiceRepository extends Repository
{
/**
* OrderRepository object
*
2020-03-05 13:37:08 +00:00
* @var \Webkul\Sales\Repositories\OrderRepository
*/
2019-06-28 14:18:52 +00:00
protected $orderRepository;
/**
* OrderItemRepository object
*
2020-03-05 13:37:08 +00:00
* @var \Webkul\Sales\Repositories\OrderItemRepository
*/
2019-06-28 14:18:52 +00:00
protected $orderItemRepository;
/**
* InvoiceItemRepository object
*
2020-03-05 13:37:08 +00:00
* @var \Webkul\Sales\Repositories\InvoiceItemRepository
*/
2019-06-28 14:18:52 +00:00
protected $invoiceItemRepository;
/**
* DownloadableLinkPurchasedRepository object
*
2020-03-05 13:37:08 +00:00
* @var \Webkul\Sales\Repositories\DownloadableLinkPurchasedRepository
2019-06-28 14:18:52 +00:00
*/
protected $downloadableLinkPurchasedRepository;
/**
* Create a new repository instance.
*
2020-03-05 13:37:08 +00:00
* @param \Webkul\Sales\Repositories\OrderRepository $orderRepository
* @param \Webkul\Sales\Repositories\OrderItemRepository $orderItemRepository
* @param \Webkul\Sales\Repositories\InvoiceItemRepository $invoiceItemRepository
* @param \Webkul\Sales\Repositories\DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository
* @param \Illuminate\Container\Container $app
*/
public function __construct(
2019-06-28 14:18:52 +00:00
OrderRepository $orderRepository,
OrderItemRepository $orderItemRepository,
InvoiceItemRepository $invoiceItemRepository,
DownloadableLinkPurchasedRepository $downloadableLinkPurchasedRepository,
App $app
)
{
2019-06-28 14:18:52 +00:00
$this->orderRepository = $orderRepository;
$this->orderItemRepository = $orderItemRepository;
2019-06-28 14:18:52 +00:00
$this->invoiceItemRepository = $invoiceItemRepository;
2019-06-28 14:18:52 +00:00
$this->invoiceItemRepository = $invoiceItemRepository;
$this->downloadableLinkPurchasedRepository = $downloadableLinkPurchasedRepository;
parent::__construct($app);
}
2019-09-09 07:27:28 +00:00
/**
* Specify Model class name
*
2020-03-05 13:37:08 +00:00
* @return string
*/
function model()
{
2019-04-03 13:21:05 +00:00
return Invoice::class;
}
/**
2020-03-05 13:37:08 +00:00
* @param array $data
* @return \Webkul\Sales\Contracts\Invoice
*/
public function create(array $data)
{
DB::beginTransaction();
2019-09-09 07:27:28 +00:00
try {
2019-12-24 14:01:13 +00:00
Event::dispatch('sales.invoice.save.before', $data);
2019-06-28 14:18:52 +00:00
$order = $this->orderRepository->find($data['order_id']);
$totalQty = array_sum($data['invoice']['items']);
$invoice = $this->model->create([
2020-02-27 08:03:03 +00:00
'order_id' => $order->id,
'total_qty' => $totalQty,
2020-07-28 14:48:27 +00:00
'state' => 'pending',
2020-02-27 08:03:03 +00:00
'base_currency_code' => $order->base_currency_code,
'channel_currency_code' => $order->channel_currency_code,
'order_currency_code' => $order->order_currency_code,
2020-03-04 06:32:53 +00:00
'order_address_id' => $order->billing_address->id,
2020-02-27 08:03:03 +00:00
]);
foreach ($data['invoice']['items'] as $itemId => $qty) {
2020-02-20 06:47:44 +00:00
if (! $qty) {
2020-08-04 13:00:37 +00:00
continue;
2020-02-20 06:47:44 +00:00
}
2019-06-28 14:18:52 +00:00
$orderItem = $this->orderItemRepository->find($itemId);
2020-02-20 06:47:44 +00:00
if ($qty > $orderItem->qty_to_invoice) {
$qty = $orderItem->qty_to_invoice;
2020-02-20 06:47:44 +00:00
}
2019-06-28 14:18:52 +00:00
$invoiceItem = $this->invoiceItemRepository->create([
2020-02-27 08:03:03 +00:00
'invoice_id' => $invoice->id,
'order_item_id' => $orderItem->id,
'name' => $orderItem->name,
'sku' => $orderItem->sku,
'qty' => $qty,
'price' => $orderItem->price,
'base_price' => $orderItem->base_price,
'total' => $orderItem->price * $qty,
'base_total' => $orderItem->base_price * $qty,
'tax_amount' => ( ($orderItem->tax_amount / $orderItem->qty_ordered) * $qty ),
'base_tax_amount' => ( ($orderItem->base_tax_amount / $orderItem->qty_ordered) * $qty ),
'discount_amount' => ( ($orderItem->discount_amount / $orderItem->qty_ordered) * $qty ),
'base_discount_amount' => ( ($orderItem->base_discount_amount / $orderItem->qty_ordered) * $qty ),
'product_id' => $orderItem->product_id,
'product_type' => $orderItem->product_type,
2020-03-04 06:32:53 +00:00
'additional' => $orderItem->additional,
2020-02-27 08:03:03 +00:00
]);
2019-09-06 14:08:54 +00:00
if ($orderItem->getTypeInstance()->isComposite()) {
foreach ($orderItem->children as $childOrderItem) {
$finalQty = $childOrderItem->qty_ordered
2020-02-27 08:03:03 +00:00
? ($childOrderItem->qty_ordered / $orderItem->qty_ordered) * $qty
: $orderItem->qty_ordered;
2019-09-06 14:08:54 +00:00
$this->invoiceItemRepository->create([
2020-02-27 08:03:03 +00:00
'invoice_id' => $invoice->id,
'order_item_id' => $childOrderItem->id,
'parent_id' => $invoiceItem->id,
'name' => $childOrderItem->name,
'sku' => $childOrderItem->sku,
'qty' => $finalQty,
'price' => $childOrderItem->price,
'base_price' => $childOrderItem->base_price,
'total' => $childOrderItem->price * $finalQty,
'base_total' => $childOrderItem->base_price * $finalQty,
'tax_amount' => 0,
'base_tax_amount' => 0,
'discount_amount' => 0,
'base_discount_amount' => 0,
'product_id' => $childOrderItem->product_id,
'product_type' => $childOrderItem->product_type,
2020-03-04 06:32:53 +00:00
'additional' => $childOrderItem->additional,
2020-02-27 08:03:03 +00:00
]);
2019-12-24 14:01:13 +00:00
2020-02-24 12:19:12 +00:00
if ($childOrderItem->product
&& ! $childOrderItem->getTypeInstance()->isStockable()
2020-02-28 10:25:53 +00:00
&& $childOrderItem->getTypeInstance()->showQuantityBox()
) {
2019-09-06 14:08:54 +00:00
$this->invoiceItemRepository->updateProductInventory([
2020-02-27 08:03:03 +00:00
'invoice' => $invoice,
'product' => $childOrderItem->product,
'qty' => $finalQty,
2020-03-04 06:32:53 +00:00
'vendor_id' => isset($data['vendor_id']) ? $data['vendor_id'] : 0,
2020-02-27 08:03:03 +00:00
]);
2019-09-06 14:08:54 +00:00
}
$this->orderItemRepository->collectTotals($childOrderItem);
}
2020-02-24 12:19:12 +00:00
} elseif ($orderItem->product
&& ! $orderItem->getTypeInstance()->isStockable()
2020-02-28 10:25:53 +00:00
&& $orderItem->getTypeInstance()->showQuantityBox()
) {
2019-09-06 14:08:54 +00:00
$this->invoiceItemRepository->updateProductInventory([
2020-02-27 08:03:03 +00:00
'invoice' => $invoice,
'product' => $orderItem->product,
'qty' => $qty,
2020-03-04 06:32:53 +00:00
'vendor_id' => isset($data['vendor_id']) ? $data['vendor_id'] : 0,
2020-02-27 08:03:03 +00:00
]);
}
2019-06-28 14:18:52 +00:00
$this->orderItemRepository->collectTotals($orderItem);
2019-10-11 08:20:15 +00:00
$this->downloadableLinkPurchasedRepository->updateStatus($orderItem, 'available');
}
$this->collectTotals($invoice);
2019-06-28 14:18:52 +00:00
$this->orderRepository->collectTotals($order);
2019-12-24 14:01:13 +00:00
Event::dispatch('sales.invoice.save.after', $invoice);
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
2019-09-09 07:27:28 +00:00
DB::commit();
return $invoice;
}
2019-12-24 14:01:13 +00:00
/**
2020-03-05 13:37:08 +00:00
* @param \Webkul\Sales\Contracts\Invoice $invoice
* @return \Webkul\Sales\Contracts\Invoice
*/
public function collectTotals($invoice)
{
2019-09-19 11:54:56 +00:00
$invoice->sub_total = $invoice->base_sub_total = 0;
$invoice->tax_amount = $invoice->base_tax_amount = 0;
$invoice->discount_amount = $invoice->base_discount_amount = 0;
2019-01-15 11:54:41 +00:00
foreach ($invoice->items as $invoiceItem) {
2019-09-19 11:54:56 +00:00
$invoice->sub_total += $invoiceItem->total;
$invoice->base_sub_total += $invoiceItem->base_total;
2019-09-19 11:54:56 +00:00
$invoice->tax_amount += $invoiceItem->tax_amount;
$invoice->base_tax_amount += $invoiceItem->base_tax_amount;
2019-05-23 11:30:11 +00:00
2019-09-19 11:54:56 +00:00
$invoice->discount_amount += $invoiceItem->discount_amount;
$invoice->base_discount_amount += $invoiceItem->base_discount_amount;
}
2019-09-19 11:54:56 +00:00
$invoice->shipping_amount = $invoice->order->shipping_amount;
$invoice->base_shipping_amount = $invoice->order->base_shipping_amount;
2020-01-09 11:33:58 +00:00
$invoice->discount_amount += $invoice->order->shipping_discount_amount;
$invoice->base_discount_amount += $invoice->order->base_shipping_discount_amount;
if ($invoice->order->shipping_amount) {
2019-01-15 11:54:41 +00:00
foreach ($invoice->order->invoices as $prevInvoice) {
2020-02-20 06:47:44 +00:00
if ((float) $prevInvoice->shipping_amount) {
2019-09-19 11:54:56 +00:00
$invoice->shipping_amount = $invoice->base_shipping_amount = 0;
2020-02-20 06:47:44 +00:00
}
2020-01-09 11:33:58 +00:00
if ($prevInvoice->id != $invoice->id) {
$invoice->discount_amount -= $invoice->order->shipping_discount_amount;
$invoice->base_discount_amount -= $invoice->order->base_shipping_discount_amount;
}
}
}
2019-09-19 11:54:56 +00:00
$invoice->grand_total = $invoice->sub_total + $invoice->tax_amount + $invoice->shipping_amount - $invoice->discount_amount;
$invoice->base_grand_total = $invoice->base_sub_total + $invoice->base_tax_amount + $invoice->base_shipping_amount - $invoice->base_discount_amount;
$invoice->save();
return $invoice;
}
2020-08-04 13:00:37 +00:00
/*
2020-07-28 14:48:27 +00:00
* @param \Webkul\Sales\Contracts\Invoice $invoice
* @return void
*/
public function updateInvoiceState($invoice, $status)
{
$invoice->state = $status;
$invoice->save();
return true;
}
}