Файл: src/app/Http/Controllers/InvoicesController.php
Строк: 684
<?php
namespace AppHttpControllers;
use AppHttpControllersController;
use AppModelsCompanies;
use AppModelsProducts;
use AppModelsItems;
use AppModelsInvoices;
use AppModelsSettings;
use IlluminateSupportFacadesInput;
use Validator;
use Storage;
use Mail;
use KaankilicPortableInvoiceLibsInvoice;
use DB;
class InvoicesController extends Controller{
public function getLatestAI(){
$AutoIncrementStarts = 10000000;
$Invoices = Invoices::select("InvoiceID")->max("InvoiceID")+1;
return response()->json(["AutoIncrement"=>$AutoIncrementStarts+$Invoices],200);
}
public function getInvoices(){
$Inputs = Input::only("Date","Status","Order","Page","Search");
$Settings = Settings::findOrFail(1);
$Invoices = Invoices::with(['company','currency'])->where("CurrencyID",$Settings->CurrencyID);
if ($Inputs["Date"]) {
if ($Inputs["Date"]=="Today") {
$Invoices = $Invoices->whereDate("CreatedAt","=",CarbonCarbon::today()->toDateString());
}else if($Inputs["Date"]=="Yesterday"){
$Invoices = $Invoices->whereDate("CreatedAt",">=",CarbonCarbon::today()->subDays(1)->toDateString());
}else if($Inputs["Date"]=="Week"){
$Invoices = $Invoices->whereDate("CreatedAt",">=",CarbonCarbon::today()->subDays(7)->toDateString());
}else if($Inputs["Date"]=="Month"){
$Invoices = $Invoices->whereDate("CreatedAt",">=",CarbonCarbon::today()->subDays(30)->toDateString());
}else if($Inputs["Date"]=="Year"){
$Invoices = $Invoices->whereDate("CreatedAt",">=",CarbonCarbon::today()->subDays(365)->toDateString());
}
}
if ($Inputs["Status"]) {
$Invoices = $Invoices->where("Status",$Inputs["Status"]);
}
if($Inputs["Order"]=="ASC"){
$Invoices = $Invoices->orderBy("CreatedAt","ASC")->orderBy("InvoiceID","ASC");
}else{
$Invoices = $Invoices->orderBy("CreatedAt","DESC")->orderBy("InvoiceID","DESC");
}
$Invo = $Invoices->paginate(Config::get('constants.paginate_org_index'));
$Invoices = $Invo->groupBy(function($date) {
return CarbonCarbon::parse($date->CreatedAt)->format("M'y");
});
//dd($Invoices);
return view('invoices.index',compact('Invoices','Invo'));
}
public function getInvoice($InvoiceID){
$Invoice = Invoices::with(['company'])->findOrFail($InvoiceID);
return view('invoices.view',compact('Invoice'));
}
public function getAdd(){
$BillingFrom = Companies::lists("Title","CompanyID");
$BillingTo = Companies::all();
$Products = Products::lists("Title","ProductID");
return view('invoices.add',compact('BillingFrom','BillingTo','Products'));
}
public function postAdd(){
$Inputs = Input::only(
'CompanyID',
'ReferenceID',
'Discount',
'DiscountPercentage',
'DiscountMethod',
'Tax',
'DueDate',
'CustomerNotification',
'Status',
'Content',
'Product'
);
$Validator = Validator::make($Inputs,array(
"CompanyID" => "required|exists:Companies,CompanyID",
"Discount" => "numeric|between:0,99.99",
"Tax" => "numeric|between:0,99.99",
"DueDate" => "required|date",
"Status" => "required",
"ReferenceID" => "required|unique:Invoices,ReferenceID",
"CustomerNotification" => "required|between:0,1",
"Product.*.ProductID" => 'exists:Products,ProductID|required',
"Product.*.ProductAmount" => 'numeric|required',
"Product.*.ProductPrice" => 'numeric|required',
"Product.*.ProductTax" => 'numeric',
"Product.*.ProductDiscount" => 'numeric'
));
if ($Validator->fails()) {
return redirect()->route('invoices::add')
->withInput(Input::except('Product'))
->withErrors($Validator)
->with("ErrorMessage",trans('messages.invoices_create_failure'))
->with('ProductList', Input::get('Product'));
}
if(count($Inputs['Product'])==0){
return redirect()->route('invoices::add')->withInput()->with("ErrorMessage",trans("messages.invoices_create_failure"));
}
$Items = array();
$Inputs['Total'] = 0;
$Inputs['TaxAmount'] = 0;
$Inputs['Subtotal'] = 0;
foreach ($Inputs['Product'] as $Key => $Value) {
if (isset($Value["ProductAmount"]) || isset($Value['ProductPrice'])) {
$ProductPrice = abs($Value['ProductPrice']);
$ProductAmount = abs($Value['ProductAmount']);
$Product = $ProductPrice*$ProductAmount;
if ($Value['ProductTax']>0) {
$Product = $Product+($Product*($Value['ProductTax']/100));
}
$DiscountAmount = 0;
if ($Value['ProductDiscount']>0) {
$Product = $Product-$Value['ProductDiscount'];
}
$Items[] = new Items([
"ProductID" => $Value['ProductID'],
"Amount" => $Value['ProductAmount'],
"Price" => $Value['ProductPrice'],
"Discount" => $Value['ProductDiscount'],
"Tax" => $Value['ProductTax'],
"Total" => $Product
]);
$Inputs['Subtotal'] += $Product;
}
}
if ($Inputs['Tax']>0) {
$Inputs["TaxAmount"] = ($Inputs['Subtotal']*($Inputs['Tax']/100));
$Inputs['Total'] = $Inputs['Subtotal']+$Inputs["TaxAmount"];
}else{
$Inputs["Total"] = $Inputs["Subtotal"];
}
if ($Inputs['DiscountMethod']==0) {
$Inputs['Discount'] = $Inputs['Total']*($Inputs['DiscountPercentage']/100);
$Inputs['Total'] = $Inputs['Total']-$Inputs['Discount'];
}else{
$Inputs['DiscountPercentage'] = $Inputs['Total']/(100*$Inputs['Total']);
$Inputs['Total'] = ($Inputs['Total']-$Inputs['Discount']);
}
$Inputs["CurrencyID"] = Settings::orderBy("SettingID","DESC")->limit(1)->first()->CurrencyID;
$invoice = Invoices::create($Inputs);
$invoice->items()->saveMany($Items);
if (Input::get('CustomerNotification')==1) {
$Company = Companies::findOrFail($invoice->CompanyID);
$InvoicePath = $this->saveInvoice($invoice->InvoiceID);
Mail::send('emails.invoice_sender', [], function ($m) use ($Company,$InvoicePath) {
$m->from($Settings->Email, 'Cup Invoice');
$m->to($Company->Email, $Company->Title)->subject('Invoice Details');
$m->attach($InvoicePath);
});
}
return redirect()->route('invoices::view',$invoice->InvoiceID)->with("SuccessMessage",trans('messages.invoices_create_success'));
}
public function getDuplicate($InvoiceID){
$BillingFrom = Companies::lists("Title","CompanyID");
$BillingTo = Companies::all();
$Products = Products::lists("Title","ProductID");
$Invoice = Invoices::findOrFail($InvoiceID);
return view('invoices.duplicate',compact('BillingFrom','BillingTo','Products','Invoice'));
}
public function getEdit($InvoiceID){
$BillingFrom = Companies::lists("Title","CompanyID");
$BillingTo = Companies::all();
$Products = Products::lists("Title","ProductID");
$Invoice = Invoices::findOrFail($InvoiceID);
return view('invoices.edit',compact('BillingFrom','BillingTo','Products','Invoice'));
}
public function postEdit($InvoiceID){
$invoice = Invoices::findOrFail($InvoiceID);
$Inputs = Input::only(
'CompanyID',
'CompanyID',
'ReferenceID',
'Discount',
'DiscountPercentage',
'DiscountMethod',
'Tax',
'DueDate',
'CustomerNotification',
'Status',
'Content',
'Product'
);
$Validator = Validator::make($Inputs,array(
"CompanyID" => "required|exists:Companies,CompanyID",
"Discount" => "numeric|between:0,99.99",
"Tax" => "numeric|between:0,99.99",
"DueDate" => "required|date",
"Status" => "required",
"ReferenceID" => "required|unique:Invoices,ReferenceID,".$invoice->ReferenceID.",ReferenceID",
"CustomerNotification" => "between:0,1",
"Product.*.ProductID" => 'exists:Products,ProductID|required',
"Product.*.ProductAmount" => 'numeric|required',
"Product.*.ProductPrice" => 'numeric|required',
"Product.*.ProductTax" => 'numeric',
"Product.*.ProductDiscount" => 'numeric'
));
if ($Validator->fails()) {
return redirect()->route('invoices::edit',$InvoiceID)
->withInput(Input::except('Product'))
->withErrors($Validator)
->with("ErrorMessage",trans('messages.invoices_create_failure'))
->with('ProductList', Input::get('Product'));
}
if(count($Inputs['Product'])==0){
return redirect()->route('invoices::edit',$InvoiceID)->withInput()->with("ErrorMessage",trans("messages.invoices_create_failure"));
}
$Items = array();
$Inputs['Total'] = 0;
$Inputs['TaxAmount'] = 0;
$Inputs['Subtotal'] = 0;
foreach ($Inputs['Product'] as $Key => $Value) {
if (isset($Value["ProductAmount"]) || isset($Value['ProductPrice'])) {
$ProductPrice = abs($Value['ProductPrice']);
$ProductAmount = abs($Value['ProductAmount']);
$Product = $ProductPrice*$ProductAmount;
if ($Value['ProductTax']>0) {
$Product = $Product+($Product*($Value['ProductTax']/100));
}
$DiscountAmount = 0;
if ($Value['ProductDiscount']>0) {
$Product = $Product-$Value['ProductDiscount'];
}
$Items[] = new Items([
"ProductID" => $Value['ProductID'],
"Amount" => $Value['ProductAmount'],
"Price" => $Value['ProductPrice'],
"Discount" => $Value['ProductDiscount'],
"Tax" => $Value['ProductTax'],
"Total" => $Product
]);
$Inputs['Subtotal'] += $Product;
}
}
if ($Inputs['Tax']>0) {
$Inputs["TaxAmount"] = ($Inputs['Subtotal']*($Inputs['Tax']/100));
$Inputs['Total'] = $Inputs['Subtotal']+$Inputs["TaxAmount"];
}else{
$Inputs["Total"] = $Inputs["Subtotal"];
}
if ($Inputs['DiscountMethod']==0) {
$Inputs['Discount'] = $Inputs['Total']*($Inputs['DiscountPercentage']/100);
$Inputs['Total'] = $Inputs['Total']-$Inputs['Discount'];
}else{
$Inputs['DiscountPercentage'] = $Inputs['Total']/(100*$Inputs['Total']);
$Inputs['Total'] = ($Inputs['Total']-$Inputs['Discount']);
}
$Inputs["CurrencyID"] = Settings::orderBy("SettingID","DESC")->limit(1)->first()->CurrencyID;
$invoice->update($Inputs);
$invoice->items()->delete();
$invoice->items()->saveMany($Items);
if (Input::get('CustomerNotification')==1) {
$Company = Companies::findOrFail($invoice->CompanyID);
$InvoicePath = $this->saveInvoice($invoice->InvoiceID);
Mail::send('emails.invoice_sender', [], function ($m) use ($Company,$InvoicePath) {
$m->from($Settings->Email, 'Cup Invoice');
$m->to($Company->Email, $Company->Title)->subject('Invoice Details');
$m->attach($InvoicePath);
});
}
return redirect()->route('invoices::view',$invoice->InvoiceID)->with("SuccessMessage",trans('messages.invoices_update_success'));
}
public function saveInvoice($InvoiceID){
$Invoices = Invoices::findOrFail($InvoiceID);
$Settings = Settings::findOrFail(1);
$invoice = new Invoice("A4",'€');
/* Header Settings */
$invoice->setLogo(asset('/uploads/'.$Settings->Logo));
$invoice->setColor($Settings->ColorPalette);
$invoice->setType("Invoice");
$invoice->setReference("#".$Invoices->ReferenceID);
$invoice->setDate($Invoices->CreatedAt->format("d/m/Y"));
$invoice->setDue($Invoices->DueDate->format("d/m/Y"));
$Company = Companies::where("isOwn","=",1)->first();
$invoice->setFrom(
array($Company->Title,
$Company->Address1,
$Company->Address2,
$Company->City." , ".$Company->ZipCode,
$Company->Country->Name
));
$invoice->setTo(array(
$Invoices->Company->Title,
$Invoices->Company->Address1,
$Invoices->Company->Address2,
$Invoices->Company->City.' , '.$Invoices->Company->ZipCode,
$Invoices->Company->Country->Name));
/* Adding Items in table */
foreach($Invoices->Items as $Item){
$invoice->addItem($Item->Product->Title,$Item->Product->Description,$Item->Amount,$Item->Tax,html_entity_decode($Item->Price),$Item->Discount,$Item->Total);
}
/* Add totals */
$invoice->addTotal(trans('portable_invoice.subtotal'),$Invoices->Subtotal);
$invoice->addTotal(trans('portable_invoice.vat')." (".$Invoices->Tax."%)",$Invoices->TaxAmount);
$invoice->addTotal(trans('portable_invoice.grand_total'),$Invoices->Total,true);
/* Set badge */
$invoice->addBadge($Invoices->Status);
/* Add title */
$invoice->addTitle(trans('portable_invoice.footer_message'));
/* Add Paragraph */
$invoice->addParagraph($Item->Content);
/* Set footer note */
$invoice->setFooternote($Company->Title);
/* Render */
$invoice->render(storage_path()."/app/invoices/".$Invoices->ReferenceID.'.pdf','F'); /* I => Display on browser, D => Force Download, F => local path save, S => return document path */
return storage_path()."/app/invoices/".$Invoices->ReferenceID.'.pdf';
}
public function getDownload($InvoiceID,$Method="D"){
$Invoices = Invoices::findOrFail($InvoiceID);
$Settings = Settings::findOrFail(1);
$invoice = new Invoice("A4",$Settings->Currency->Symbol);
/* Header Settings */
$invoice->setLogo(asset('/uploads/'.$Settings->Logo));
$invoice->setColor($Settings->ColorPalette);
$invoice->setType("Invoice");
$invoice->setReference("#".$Invoices->ReferenceID);
$invoice->setDate($Invoices->CreatedAt->format("d/m/Y"));
$invoice->setDue($Invoices->DueDate->format("d/m/Y"));
$Company = Companies::where("isOwn","=",1)->first();
$invoice->setFrom(
array($Company->Title,
$Company->Address1,
$Company->Address2,
$Company->City." , ".$Company->ZipCode,
$Company->Country->Name
));
$invoice->setTo(array(
$Invoices->Company->Title,
$Invoices->Company->Address1,
$Invoices->Company->Address2,
$Invoices->Company->City.' , '.$Invoices->Company->ZipCode,
$Invoices->Company->Country->Name));
/* Adding Items in table */
foreach($Invoices->Items as $Item){
$invoice->addItem($Item->Product->Title,$Item->Product->Description,$Item->Amount,$Item->Tax,html_entity_decode($Item->Price),$Item->Discount,$Item->Total);
}
/* Add totals */
$invoice->addTotal(trans('portable_invoice.subtotal'),$Invoices->Subtotal);
$invoice->addTotal(trans('portable_invoice.vat')." (".$Invoices->Tax."%)",$Invoices->TaxAmount);
$invoice->addTotal(trans('portable_invoice.grand_total'),$Invoices->Total,true);
/* Set badge */
$invoice->addBadge($Invoices->Status);
/* Add title */
$invoice->addTitle(trans('portable_invoice.footer_message'));
/* Add Paragraph */
$invoice->addParagraph($Item->Content);
/* Set footer note */
$invoice->setFooternote($Company->Title);
/* Render */
if ($Method=="D") {
$invoice->render($Invoices->ReferenceID.'.pdf','D'); /* I => Display on browser, D => Force Download, F => local path save, S => return document path */
}else{
$invoice->render($Invoices->ReferenceID.'.pdf','S');
//Storage::disk('invoices')->put($Invoices->ReferenceID.'.pdf',null);
}
}
public function getDelete($InvoiceID){
$Invoice = Invoices::findOrFail($InvoiceID);
$Invoice->delete();
return redirect()->route("invoices::list")->with("SuccessMessage",trans('messages.invoices_delete_success'));
}
}
?>