Duplicate Invoice Ability Added

This commit is contained in:
Devansh 2022-01-31 17:43:35 +05:30
parent 91ae24664a
commit 4e62451d49
16 changed files with 562 additions and 348 deletions

View File

@ -2,14 +2,16 @@
namespace Webkul\Admin\Http\Controllers\Sales;
use Illuminate\Http\Request;
use Webkul\Admin\Http\Controllers\Controller;
use Webkul\Admin\Traits\Mails;
use Webkul\Core\Traits\PDFHandler;
use Webkul\Sales\Repositories\InvoiceRepository;
use Webkul\Sales\Repositories\OrderRepository;
class InvoiceController extends Controller
{
use PDFHandler;
use Mails, PDFHandler;
/**
* Display a listing of the resource.
@ -133,6 +135,34 @@ class InvoiceController extends Controller
return view($this->_config['view'], compact('invoice'));
}
/**
* Send duplicate invoice.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function sendDuplicateInvoice(Request $request, $id)
{
$request->validate([
'email' => 'required|email',
]);
$invoice = $this->invoiceRepository->findOrFail($id);
if ($invoice) {
$this->sendDuplicateInvoiceMail($invoice, $request->email);
session()->flash('success', __('admin::app.sales.invoices.invoice-sent'));
return redirect()->back();
}
session()->flash('error', __('admin::app.response.something-went-wrong'));
return redirect()->back();
}
/**
* Print and download the for the specified resource.
*

View File

@ -0,0 +1,57 @@
<?php
namespace Webkul\Admin\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class DuplicateInvoiceNotification extends Mailable
{
use Queueable, SerializesModels;
/**
* The invoice instance.
*
* @var \Webkul\Customer\Contracts\Invoice
*/
public $invoice;
/**
* Customer email.
*
* @var string
*/
public $customerEmail;
/**
* Create a new message instance.
*
* @param \Webkul\Customer\Contracts\Invoice $invoice
* @param string $customerEmail
* @return void
*/
public function __construct($invoice, $customerEmail)
{
$this->invoice = $invoice;
$this->customerEmail = $customerEmail;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$order = $this->invoice->order;
$email = $this->customerEmail ?? $order->customer_email;
return $this->from(core()->getSenderEmailDetails()['email'], core()->getSenderEmailDetails()['name'])
->to($email, $order->customer_full_name)
->subject(trans('shop::app.mail.invoice.subject', ['order_id' => $order->increment_id]))
->view('shop::emails.sales.new-invoice');
}
}

View File

@ -401,32 +401,35 @@ return [
],
'invoices' => [
'title' => 'الفواتير',
'id' => 'Id',
'invoice-id' => 'هوية صوتية',
'invoice' => 'فاتورة',
'date' => 'تاريخ الفاتورة',
'order-id' => 'Id طلب',
'customer-name' => 'اسم الزبون',
'status' => 'الحالة',
'amount' => 'المبلغ',
'action' => 'الإجراء',
'add-title' => 'أنشئ الفاتورة',
'save-btn-title' => 'احفظ الفاتورة',
'qty' => 'Qty',
'qty-ordered' => 'تعداد سفارشات',
'qty-to-invoice' => 'qty إلى فاتورة',
'view-title' => '#:invoice_id فاتورة',
'bill-to' => 'بيل إلى',
'ship-to' => 'السفينة إلى',
'print' => 'اطبع',
'order-date' => 'تاريخ الطلب',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'لا يسمح بإنشاء الفواتير.',
'product-error' => 'ولا يمكن إعداد الفاتورة بدون منتجات.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'الفواتير',
'id' => 'Id',
'invoice-id' => 'هوية صوتية',
'invoice' => 'فاتورة',
'date' => 'تاريخ الفاتورة',
'order-id' => 'Id طلب',
'customer-name' => 'اسم الزبون',
'status' => 'الحالة',
'amount' => 'المبلغ',
'action' => 'الإجراء',
'add-title' => 'أنشئ الفاتورة',
'save-btn-title' => 'احفظ الفاتورة',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Qty',
'qty-ordered' => 'تعداد سفارشات',
'qty-to-invoice' => 'qty إلى فاتورة',
'view-title' => '#:invoice_id فاتورة',
'bill-to' => 'بيل إلى',
'ship-to' => 'السفينة إلى',
'print' => 'اطبع',
'order-date' => 'تاريخ الطلب',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'لا يسمح بإنشاء الفواتير.',
'product-error' => 'ولا يمكن إعداد الفاتورة بدون منتجات.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' => [

View File

@ -397,31 +397,34 @@ return [
],
'invoices' =>
[
'title' => 'Rechnungen',
'id' => 'Id',
'invoice-id' => 'Rechnungsnummer',
'date' => 'Rechnungsdatum',
'order-id' => 'Auftragsnummer',
'customer-name' => 'Name des Kunden',
'status' => 'Status',
'amount' => 'Betrag',
'action' => 'Aktion',
'add-title' => 'Rechnung erstellen',
'save-btn-title' => 'Rechnung speichern',
'qty' => 'Menge',
'qty-ordered' => 'Bestellte Menge',
'qty-to-invoice' => 'Menge in Rechnung zu stellen',
'view-title' => 'Rechnung #:invoice_id',
'bill-to' => 'Rechnung an',
'ship-to' => 'Versenden an',
'print' => 'Drucken',
'order-date' => 'Bestell-Datum',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Die Erstellung einer Bestellrechnung ist nicht zulässig.',
'product-error' => 'Eine Rechnung kann nicht ohne Produkte erstellt werden.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'Rechnungen',
'id' => 'Id',
'invoice-id' => 'Rechnungsnummer',
'date' => 'Rechnungsdatum',
'order-id' => 'Auftragsnummer',
'customer-name' => 'Name des Kunden',
'status' => 'Status',
'amount' => 'Betrag',
'action' => 'Aktion',
'add-title' => 'Rechnung erstellen',
'save-btn-title' => 'Rechnung speichern',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Menge',
'qty-ordered' => 'Bestellte Menge',
'qty-to-invoice' => 'Menge in Rechnung zu stellen',
'view-title' => 'Rechnung #:invoice_id',
'bill-to' => 'Rechnung an',
'ship-to' => 'Versenden an',
'print' => 'Drucken',
'order-date' => 'Bestell-Datum',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Die Erstellung einer Bestellrechnung ist nicht zulässig.',
'product-error' => 'Eine Rechnung kann nicht ohne Produkte erstellt werden.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' =>
[

View File

@ -413,32 +413,35 @@ return [
],
'invoices' => [
'title' => 'Invoices',
'id' => 'ID',
'invoice' => 'Invoice',
'invoice-id' => 'Invoice ID',
'date' => 'Invoice Date',
'order-id' => 'Order ID',
'customer-name' => 'Customer Name',
'status' => 'Status',
'amount' => 'Amount',
'action' => 'Action',
'add-title' => 'Create Invoice',
'save-btn-title' => 'Save Invoice',
'qty' => 'Qty',
'qty-ordered' => 'Qty Ordered',
'qty-to-invoice' => 'Qty to Invoice',
'view-title' => 'Invoice #:invoice_id',
'bill-to' => 'Bill to',
'ship-to' => 'Ship to',
'print' => 'Print',
'order-date' => 'Order Date',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Order invoice creation is not allowed.',
'product-error' => 'Invoice can not be created without products.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'Invoices',
'id' => 'ID',
'invoice' => 'Invoice',
'invoice-id' => 'Invoice ID',
'date' => 'Invoice Date',
'order-id' => 'Order ID',
'customer-name' => 'Customer Name',
'status' => 'Status',
'amount' => 'Amount',
'action' => 'Action',
'add-title' => 'Create Invoice',
'save-btn-title' => 'Save Invoice',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Qty',
'qty-ordered' => 'Qty Ordered',
'qty-to-invoice' => 'Qty to Invoice',
'view-title' => 'Invoice #:invoice_id',
'bill-to' => 'Bill to',
'ship-to' => 'Ship to',
'print' => 'Print',
'order-date' => 'Order Date',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Order invoice creation is not allowed.',
'product-error' => 'Invoice can not be created without products.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' => [

View File

@ -411,32 +411,35 @@ return [
],
'invoices' => [
'title' => 'Facturas',
'id' => 'Id',
'invoice-id' => 'Factura #',
'invoice' => 'Factura',
'date' => 'Fecha de factura',
'order-id' => 'Pedido #',
'customer-name' => 'Nombre del cliente',
'status' => 'Estado',
'amount' => 'Monto',
'action' => 'Acción',
'add-title' => 'Crear factura',
'save-btn-title' => 'Guardar factura',
'qty' => 'Cant',
'qty-ordered' => 'Cant pedido',
'qty-to-invoice' => 'Cant a facturar',
'view-title' => 'Factura #:invoice_id',
'bill-to' => 'Facturar a',
'ship-to' => 'Enviar a',
'print' => 'Imprimir',
'order-date' => 'Fecha del pedido',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'La creación de facturas al pedido no está permitida.',
'product-error' => 'La factura no puede ser creada sin productos.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'Facturas',
'id' => 'Id',
'invoice-id' => 'Factura #',
'invoice' => 'Factura',
'date' => 'Fecha de factura',
'order-id' => 'Pedido #',
'customer-name' => 'Nombre del cliente',
'status' => 'Estado',
'amount' => 'Monto',
'action' => 'Acción',
'add-title' => 'Crear factura',
'save-btn-title' => 'Guardar factura',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Cant',
'qty-ordered' => 'Cant pedido',
'qty-to-invoice' => 'Cant a facturar',
'view-title' => 'Factura #:invoice_id',
'bill-to' => 'Facturar a',
'ship-to' => 'Enviar a',
'print' => 'Imprimir',
'order-date' => 'Fecha del pedido',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'La creación de facturas al pedido no está permitida.',
'product-error' => 'La factura no puede ser creada sin productos.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' => [

View File

@ -404,32 +404,35 @@ return [
],
'invoices' => [
'title' => 'صورت حساب',
'id' => 'شناسه',
'invoice-id' => 'شناسه صورت حساب',
'invoice' => 'صورتحساب',
'date' => 'تاریخ صورت حساب',
'order-id' => 'سفارش',
'customer-name' => 'نام مشتری',
'status' => 'وضعیت',
'amount' => 'میزان',
'action' => 'عملیات',
'add-title' => 'ایجاد فاکتور',
'save-btn-title' => 'ایجاد فاکتور',
'qty' => 'مقدار',
'qty-ordered' => 'سفارش داده شده',
'qty-to-invoice' => 'مقدار به فاکتور',
'view-title' => '#:invoice_id صورت حساب',
'bill-to' => 'صورت حساب به',
'ship-to' => 'حمل به',
'print' => 'چاپ',
'order-date' => 'تاریخ سفارش',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'ایجاد فاکتور سفارش مجاز نیست.',
'product-error' => 'بدون محصولات نمی توان فاکتور ایجاد کرد.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'صورت حساب',
'id' => 'شناسه',
'invoice-id' => 'شناسه صورت حساب',
'invoice' => 'صورتحساب',
'date' => 'تاریخ صورت حساب',
'order-id' => 'سفارش',
'customer-name' => 'نام مشتری',
'status' => 'وضعیت',
'amount' => 'میزان',
'action' => 'عملیات',
'add-title' => 'ایجاد فاکتور',
'save-btn-title' => 'ایجاد فاکتور',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'مقدار',
'qty-ordered' => 'سفارش داده شده',
'qty-to-invoice' => 'مقدار به فاکتور',
'view-title' => '#:invoice_id صورت حساب',
'bill-to' => 'صورت حساب به',
'ship-to' => 'حمل به',
'print' => 'چاپ',
'order-date' => 'تاریخ سفارش',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'ایجاد فاکتور سفارش مجاز نیست.',
'product-error' => 'بدون محصولات نمی توان فاکتور ایجاد کرد.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' => [

View File

@ -411,32 +411,35 @@ return [
],
'invoices' => [
'title' => 'Factures',
'id' => 'identifiant',
'invoice' => 'Facturer',
'invoice-id' => 'Identifiant de la facture',
'date' => 'Date de la facture',
'order-id' => 'numéro de commande',
'customer-name' => 'Nom du client',
'status' => 'Statut',
'amount' => 'Montant',
'action' => 'action',
'add-title' => 'Créer une facture',
'save-btn-title' => 'Enregistrer la facture',
'qty' => 'Qté',
'qty-ordered' => 'Qté commandée',
'qty-to-invoice' => 'Quantité à facturer',
'view-title' => 'Facture # :invoice_id',
'bill-to' => 'facturer',
'ship-to' => 'Envoyez à',
'print' => 'Imprimer',
'order-date' => 'Date de commande',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'La création de facture de commande n\'est pas autorisée.',
'product-error' => 'La facture ne peut pas être créée sans produits.',
'status-overdue' => 'En retard',
'status-pending' => 'En attente de paiement',
'status-paid' => 'Payé',
'title' => 'Factures',
'id' => 'identifiant',
'invoice' => 'Facturer',
'invoice-id' => 'Identifiant de la facture',
'date' => 'Date de la facture',
'order-id' => 'numéro de commande',
'customer-name' => 'Nom du client',
'status' => 'Statut',
'amount' => 'Montant',
'action' => 'action',
'add-title' => 'Créer une facture',
'save-btn-title' => 'Enregistrer la facture',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Qté',
'qty-ordered' => 'Qté commandée',
'qty-to-invoice' => 'Quantité à facturer',
'view-title' => 'Facture # :invoice_id',
'bill-to' => 'facturer',
'ship-to' => 'Envoyez à',
'print' => 'Imprimer',
'order-date' => 'Date de commande',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'La création de facture de commande n\'est pas autorisée.',
'product-error' => 'La facture ne peut pas être créée sans produits.',
'status-overdue' => 'En retard',
'status-pending' => 'En attente de paiement',
'status-paid' => 'Payé',
],
'shipments' => [

View File

@ -402,32 +402,35 @@ return [
],
'invoices' => [
'title' => 'Fatture',
'id' => 'Id',
'invoice-id' => 'Id Fattura',
'invoice' => 'Fattura',
'date' => 'Data Fattura',
'order-id' => 'Id Ordine',
'customer-name' => 'Nome Cliente',
'status' => 'Stato',
'amount' => 'Ammontare',
'action' => 'Azione',
'add-title' => 'Crea Fattura',
'save-btn-title' => 'Salva Fattura',
'qty' => 'Qtà',
'qty-ordered' => 'Qtà ordinata',
'qty-to-invoice' => 'Qtà da fatturare',
'view-title' => 'Fattura #:invoice_id',
'bill-to' => 'Fatturato a',
'ship-to' => 'Spedito a',
'print' => 'Stampa',
'order-date' => 'Data Ordine',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'La creazione della fattura dell\'Ordine non è consentita.',
'product-error' => 'La fattura non può essere creata senza prodotti.',
'status-overdue' => 'Pending',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'Fatture',
'id' => 'Id',
'invoice-id' => 'Id Fattura',
'invoice' => 'Fattura',
'date' => 'Data Fattura',
'order-id' => 'Id Ordine',
'customer-name' => 'Nome Cliente',
'status' => 'Stato',
'amount' => 'Ammontare',
'action' => 'Azione',
'add-title' => 'Crea Fattura',
'save-btn-title' => 'Salva Fattura',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Qtà',
'qty-ordered' => 'Qtà ordinata',
'qty-to-invoice' => 'Qtà da fatturare',
'view-title' => 'Fattura #:invoice_id',
'bill-to' => 'Fatturato a',
'ship-to' => 'Spedito a',
'print' => 'Stampa',
'order-date' => 'Data Ordine',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'La creazione della fattura dell\'Ordine non è consentita.',
'product-error' => 'La fattura non può essere creata senza prodotti.',
'status-overdue' => 'Pending',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' => [

View File

@ -398,32 +398,35 @@ return [
],
'invoices' => [
'title' => 'Facturen',
'id' => 'Id',
'invoice-id' => 'Factuurnummer',
'invoice' => 'Factuur',
'date' => 'Factuur datum',
'order-id' => 'Bestelnummer',
'customer-name' => 'Klantnaam',
'status' => 'Status',
'amount' => 'Bedrag',
'action' => 'Actie',
'add-title' => 'Factuur aanmaken',
'save-btn-title' => 'Bewaar factuur',
'qty' => 'Aantal',
'qty-ordered' => 'Besteld aantal',
'qty-to-invoice' => 'Aantal te factureren',
'view-title' => 'Factuur #:invoice_id',
'bill-to' => 'Bill to',
'ship-to' => 'Verzenden naar',
'print' => 'Print',
'order-date' => 'Besteldatum',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'De bestelling staat niet toe dat er een factuur wordt aangemaakt.',
'product-error' => 'Zonder producten kan er geen factuur worden aangemaakt.',
'status-overdue' => 'Verlopen',
'status-pending' => 'Wachten op betaling',
'status-paid' => 'Betaald',
'title' => 'Facturen',
'id' => 'Id',
'invoice-id' => 'Factuurnummer',
'invoice' => 'Factuur',
'date' => 'Factuur datum',
'order-id' => 'Bestelnummer',
'customer-name' => 'Klantnaam',
'status' => 'Status',
'amount' => 'Bedrag',
'action' => 'Actie',
'add-title' => 'Factuur aanmaken',
'save-btn-title' => 'Bewaar factuur',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Aantal',
'qty-ordered' => 'Besteld aantal',
'qty-to-invoice' => 'Aantal te factureren',
'view-title' => 'Factuur #:invoice_id',
'bill-to' => 'Bill to',
'ship-to' => 'Verzenden naar',
'print' => 'Print',
'order-date' => 'Besteldatum',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'De bestelling staat niet toe dat er een factuur wordt aangemaakt.',
'product-error' => 'Zonder producten kan er geen factuur worden aangemaakt.',
'status-overdue' => 'Verlopen',
'status-pending' => 'Wachten op betaling',
'status-paid' => 'Betaald',
],
'shipments' => [

View File

@ -400,32 +400,35 @@ return [
],
'invoices' => [
'title' => 'Faktury',
'id' => 'Id',
'invoice-id' => 'Identyfikator faktury',
'invoice' => 'Faktura',
'date' => 'Data faktury',
'order-id' => 'Identyfikator zamówienia',
'customer-name' => 'Nazwa klienta',
'status' => 'Status',
'amount' => 'Kwota',
'action' => 'Akcja',
'add-title' => 'Utwórz fakturę',
'save-btn-title' => 'Zapisz fakturę',
'qty' => 'Ilość',
'qty-ordered' => 'Zamówiona ilość',
'qty-to-invoice' => 'ilość do faktury',
'view-title' => 'Faktura nr #:invoice_id',
'bill-to' => 'Rachunek do',
'ship-to' => 'Wysłano do',
'print' => 'Drukuj',
'order-date' => 'Data zamówienia',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Tworzenie faktury za zamówienie jest niedozwolone.',
'product-error' => 'Faktury nie można utworzyć bez produktów.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'Faktury',
'id' => 'Id',
'invoice-id' => 'Identyfikator faktury',
'invoice' => 'Faktura',
'date' => 'Data faktury',
'order-id' => 'Identyfikator zamówienia',
'customer-name' => 'Nazwa klienta',
'status' => 'Status',
'amount' => 'Kwota',
'action' => 'Akcja',
'add-title' => 'Utwórz fakturę',
'save-btn-title' => 'Zapisz fakturę',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Ilość',
'qty-ordered' => 'Zamówiona ilość',
'qty-to-invoice' => 'ilość do faktury',
'view-title' => 'Faktura nr #:invoice_id',
'bill-to' => 'Rachunek do',
'ship-to' => 'Wysłano do',
'print' => 'Drukuj',
'order-date' => 'Data zamówienia',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Tworzenie faktury za zamówienie jest niedozwolone.',
'product-error' => 'Faktury nie można utworzyć bez produktów.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' => [

View File

@ -399,32 +399,35 @@ return [
],
'invoices' => [
'title' => 'Faturas',
'id' => 'Id',
'invoice-id' => 'Fatura Id',
'invoice' => 'Fatura',
'date' => 'Data da Fatura',
'order-id' => 'Pedido Id',
'customer-name' => 'Nome do Cliente',
'status' => 'Status',
'amount' => 'Valor',
'action' => 'Ação',
'add-title' => 'Criar Fatura',
'save-btn-title' => 'Salvar Fatura',
'qty' => 'Qtd',
'qty-ordered' => 'Qtd Pedido',
'qty-to-invoice' => 'Qtd Faturado',
'view-title' => 'Fatura #:invoice_id',
'bill-to' => 'Cobrar de',
'ship-to' => 'Enviar para',
'print' => 'Imprimir',
'order-date' => 'Data do Pedido',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'A criação de fatura de pedido não é permitida.',
'product-error' => 'A fatura não pode ser criada sem produtos.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pagamento pendente',
'status-paid' => 'Pago',
'title' => 'Faturas',
'id' => 'Id',
'invoice-id' => 'Fatura Id',
'invoice' => 'Fatura',
'date' => 'Data da Fatura',
'order-id' => 'Pedido Id',
'customer-name' => 'Nome do Cliente',
'status' => 'Status',
'amount' => 'Valor',
'action' => 'Ação',
'add-title' => 'Criar Fatura',
'save-btn-title' => 'Salvar Fatura',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Qtd',
'qty-ordered' => 'Qtd Pedido',
'qty-to-invoice' => 'Qtd Faturado',
'view-title' => 'Fatura #:invoice_id',
'bill-to' => 'Cobrar de',
'ship-to' => 'Enviar para',
'print' => 'Imprimir',
'order-date' => 'Data do Pedido',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'A criação de fatura de pedido não é permitida.',
'product-error' => 'A fatura não pode ser criada sem produtos.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pagamento pendente',
'status-paid' => 'Pago',
],
'shipments' => [

View File

@ -398,32 +398,35 @@ return [
],
'invoices' => [
'title' => 'Faturalar',
'id' => 'ID',
'invoice-id' => 'Fatura No',
'invoice' => 'Fatura',
'date' => 'Fatura Tarihi',
'order-id' => 'Sipariş No',
'customer-name' => 'Müşteri Adı',
'status' => 'Durum',
'amount' => 'Miktar',
'action' => 'Eylem',
'add-title' => 'Fatura Oluştur',
'save-btn-title' => 'Fatura Kaydet',
'qty' => 'Miktar',
'qty-ordered' => 'Sipariş Miktarı',
'qty-to-invoice' => 'Fatura Edilen Miktar',
'view-title' => 'Fatura #:invoice_id',
'bill-to' => 'Fatura Edilen',
'ship-to' => 'Teslim Edilen',
'print' => 'Yazdır',
'order-date' => 'Sipariş Tarihi',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Fatura oluşturulmasına izin verilmedi.',
'product-error' => 'Fatura oluşturulması için ürün ekleyiniz.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
'title' => 'Faturalar',
'id' => 'ID',
'invoice-id' => 'Fatura No',
'invoice' => 'Fatura',
'date' => 'Fatura Tarihi',
'order-id' => 'Sipariş No',
'customer-name' => 'Müşteri Adı',
'status' => 'Durum',
'amount' => 'Miktar',
'action' => 'Eylem',
'add-title' => 'Fatura Oluştur',
'save-btn-title' => 'Fatura Kaydet',
'send-duplicate-invoice' => 'Send Duplicate Invoice',
'send' => 'Send',
'invoice-sent' => 'Invoice sent successfully!',
'qty' => 'Miktar',
'qty-ordered' => 'Sipariş Miktarı',
'qty-to-invoice' => 'Fatura Edilen Miktar',
'view-title' => 'Fatura #:invoice_id',
'bill-to' => 'Fatura Edilen',
'ship-to' => 'Teslim Edilen',
'print' => 'Yazdır',
'order-date' => 'Sipariş Tarihi',
'invalid-qty' => 'We found an invalid quantity to invoice items.',
'creation-error' => 'Fatura oluşturulmasına izin verilmedi.',
'product-error' => 'Fatura oluşturulması için ürün ekleyiniz.',
'status-overdue' => 'Overdue',
'status-pending' => 'Pending Payment',
'status-paid' => 'Paid',
],
'shipments' => [

View File

@ -5,8 +5,9 @@
@stop
@section('content-wrapper')
<?php $order = $invoice->order; ?>
@php
$order = $invoice->order;
@endphp
<div class="content full-page">
<div class="page-header">
@ -25,6 +26,13 @@
<div class="page-action">
{!! view_render_event('sales.invoice.page_action.before', ['order' => $order]) !!}
<a
href="javascript:void(0);"
class="btn btn-lg btn-primary"
@click="showModal('duplicateInvoiceFormModal')">
{{ __('admin::app.sales.invoices.send-duplicate-invoice') }}
</a>
<a href="{{ route('admin.sales.invoices.print', $invoice->id) }}" class="btn btn-lg btn-primary">
{{ __('admin::app.sales.invoices.print') }}
</a>
@ -35,7 +43,6 @@
<div class="page-content">
<tabs>
<tab name="{{ __('admin::app.sales.orders.info') }}" :selected="true">
<div class="sale-container">
<accordian :title="'{{ __('admin::app.sales.orders.order-and-account') }}'" :active="true">
@ -132,46 +139,44 @@
</div>
</accordian>
@if ($order->billing_address || $order->shipping_address)
<accordian :title="'{{ __('admin::app.sales.orders.address') }}'" :active="true">
<div slot="body">
<div class="sale">
@if ($order->billing_address)
<div class="sale-section">
<div class="secton-title" >
<span>{{ __('admin::app.sales.orders.billing-address') }}</span>
</div>
@if ($order->billing_address || $order->shipping_address)
<accordian :title="'{{ __('admin::app.sales.orders.address') }}'" :active="true">
<div slot="body">
<div class="sale">
@if ($order->billing_address)
<div class="sale-section">
<div class="secton-title" >
<span>{{ __('admin::app.sales.orders.billing-address') }}</span>
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->billing_address])
{!! view_render_event('sales.invoice.billing_address.after', ['order' => $order]) !!}
</div>
</div>
@endif
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->billing_address])
@if ($order->shipping_address)
<div class="sale-section">
<div class="secton-title">
<span>{{ __('admin::app.sales.orders.shipping-address') }}</span>
</div>
{!! view_render_event('sales.invoice.billing_address.after', ['order' => $order]) !!}
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->shipping_address])
{!! view_render_event('sales.invoice.shipping_address.after', ['order' => $order]) !!}
</div>
</div>
</div>
@endif
@if ($order->shipping_address)
<div class="sale-section">
<div class="secton-title">
<span>{{ __('admin::app.sales.orders.shipping-address') }}</span>
</div>
<div class="section-content">
@include ('admin::sales.address', ['address' => $order->shipping_address])
{!! view_render_event('sales.invoice.shipping_address.after', ['order' => $order]) !!}
</div>
</div>
@endif
@endif
</div>
</div>
</div>
</accordian>
@endif
</accordian>
@endif
<accordian :title="'{{ __('admin::app.sales.orders.products-ordered') }}'" :active="true">
<div slot="body">
<div class="table">
<div class="table-responsive">
<table>
@ -191,7 +196,6 @@
</thead>
<tbody>
@foreach ($invoice->items as $item)
<tr>
<td>{{ $item->getTypeInstance()->getOrderedItem($item)->sku }}</td>
@ -225,7 +229,6 @@
<td>{{ core()->formatBasePrice($item->base_total + $item->base_tax_amount - $item->base_discount_amount) }}</td>
</tr>
@endforeach
</tbody>
</table>
</div>
@ -264,13 +267,12 @@
<td>{{ core()->formatBasePrice($invoice->base_grand_total) }}</td>
</tr>
</table>
</div>
</accordian>
</div>
</tab>
<tab name="Transactions" :selected="false">
<tab name="{{ __('admin::app.sales.transactions.title') }}" :selected="false">
<div class="sale-container">
@inject('InvoicesTransactionsDatagrid', 'Webkul\Admin\DataGrids\InvoicesTransactionsDatagrid')
{!! $InvoicesTransactionsDatagrid->render() !!}
@ -278,6 +280,41 @@
</tab>
</tabs>
</div>
</div>
<modal id="duplicateInvoiceFormModal" :is-open="modalIds.duplicateInvoiceFormModal">
<h3 slot="header">{{ __('admin::app.sales.invoices.send-duplicate-invoice') }}</h3>
<div slot="body">
<form
method="POST"
action="{{ route('admin.sales.invoices.send-duplicate-invoice', $invoice->id) }}"
@submit.prevent="onSubmit">
@csrf()
<div class="control-group" :class="[errors.has('email') ? 'has-error' : '']">
<label for="email" class="required">{{ __('admin::app.admin.emails.email') }}</label>
<input
class="control"
id="email"
v-validate="'required|email'"
type="email"
name="email"
data-vv-as="&quot;{{ __('admin::app.admin.emails.email') }}&quot;"
value="{{ $invoice->order->customer_email }}">
<span
class="control-error"
v-text="errors.first('email')"
v-if="errors.has('email')">
</span>
</div>
<button type="submit" class="btn btn-lg btn-primary float-right">
{{ __('admin::app.sales.invoices.send') }}
</button>
</form>
</div>
</modal>
@stop

View File

@ -48,6 +48,9 @@ Route::group(['middleware' => ['web', 'admin', 'admin_locale'], 'prefix' => conf
'view' => 'admin::sales.invoices.view',
])->name('admin.sales.invoices.view');
Route::post('/invoices/send-duplicate/{id}', [InvoiceController::class, 'sendDuplicateInvoice'])
->name('admin.sales.invoices.send-duplicate-invoice');
Route::get('/invoices/print/{id}', [InvoiceController::class, 'printInvoice'])->defaults('_config', [
'view' => 'admin::sales.invoices.print',
])->name('admin.sales.invoices.print');

View File

@ -3,15 +3,16 @@
namespace Webkul\Admin\Traits;
use Illuminate\Support\Facades\Mail;
use Webkul\Admin\Mail\CancelOrderAdminNotification;
use Webkul\Admin\Mail\CancelOrderNotification;
use Webkul\Admin\Mail\DuplicateInvoiceNotification;
use Webkul\Admin\Mail\NewAdminNotification;
use Webkul\Admin\Mail\NewInventorySourceNotification;
use Webkul\Admin\Mail\NewInvoiceNotification;
use Webkul\Admin\Mail\NewOrderNotification;
use Webkul\Admin\Mail\NewRefundNotification;
use Webkul\Admin\Mail\NewInvoiceNotification;
use Webkul\Admin\Mail\CancelOrderNotification;
use Webkul\Admin\Mail\NewShipmentNotification;
use Webkul\Admin\Mail\OrderCommentNotification;
use Webkul\Admin\Mail\CancelOrderAdminNotification;
use Webkul\Admin\Mail\NewInventorySourceNotification;
trait Mails
{
@ -26,14 +27,20 @@ trait Mails
$customerLocale = $this->getLocale($order);
try {
/* email to customer */
/**
* Email to customer.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-order';
if (core()->getConfigData($configKey)) {
$this->prepareMail($customerLocale, new NewOrderNotification($order));
}
/* email to admin */
/**
* Email to admin.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-admin';
if (core()->getConfigData($configKey)) {
$this->prepareMail(config('app.locale'), new NewAdminNotification($order));
}
@ -57,8 +64,11 @@ trait Mails
return;
}
/* email to customer */
/**
* Email to customer.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-invoice';
if (core()->getConfigData($configKey)) {
$this->prepareMail($customerLocale, new NewInvoiceNotification($invoice));
}
@ -67,6 +77,31 @@ trait Mails
}
}
/**
* Send duplicate invoice mail to the customer.
*
* @param \Webkul\Sales\Contracts\Invoice $invoice
* @param string $customerEmail
* @return void
*/
public function sendDuplicateInvoiceMail($invoice, $customerEmail)
{
$customerLocale = $this->getLocale($invoice);
try {
/**
* Email to customer.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-invoice';
if (core()->getConfigData($configKey)) {
$this->prepareMail($customerLocale, new DuplicateInvoiceNotification($invoice, $customerEmail));
}
} catch (\Exception $e) {
report($e);
}
}
/**
* Send new refund mail to the customer.
*
@ -78,8 +113,11 @@ trait Mails
$customerLocale = $this->getLocale($refund);
try {
/* email to customer */
/**
* Email to customer.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-refund';
if (core()->getConfigData($configKey)) {
$this->prepareMail($customerLocale, new NewRefundNotification($refund));
}
@ -103,14 +141,20 @@ trait Mails
return;
}
/* email to customer */
/**
* Email to customer.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-shipment';
if (core()->getConfigData($configKey)) {
$this->prepareMail($customerLocale, new NewShipmentNotification($shipment));
}
/* email to admin */
/**
* Email to admin.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-inventory-source';
if (core()->getConfigData($configKey)) {
$this->prepareMail(config('app.locale'), new NewInventorySourceNotification($shipment));
}
@ -130,14 +174,20 @@ trait Mails
$customerLocale = $this->getLocale($order);
try {
/* email to customer */
/**
* Email to customer.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.cancel-order';
if (core()->getConfigData($configKey)) {
$this->prepareMail($customerLocale, new CancelOrderNotification($order));
}
/* email to admin */
/**
* Email to admin.
*/
$configKey = 'emails.general.notifications.emails.general.notifications.new-admin';
if (core()->getConfigData($configKey)) {
$this->prepareMail(config('app.locale'), new CancelOrderAdminNotification($order));
}
@ -161,7 +211,9 @@ trait Mails
}
try {
/* email to customer */
/**
* Email to customer.
*/
$this->prepareMail($customerLocale, new OrderCommentNotification($comment));
} catch (\Exception $e) {
report($e);
@ -181,6 +233,7 @@ trait Mails
}
$objectFirstItem = $object->items->first();
return isset($objectFirstItem->additional['locale']) ? $objectFirstItem->additional['locale'] : 'en';
}
@ -192,6 +245,7 @@ trait Mails
private function prepareMail($locale, $notification)
{
app()->setLocale($locale);
Mail::queue($notification);
}
}