| Server IP : 14.225.204.176 / Your IP : 216.73.216.252 Web Server : nginx/1.24.0 System : Linux nodejs-ybgk 6.8.0-40-generic #40-Ubuntu SMP PREEMPT_DYNAMIC Fri Jul 5 10:34:03 UTC 2024 x86_64 User : root ( 0) PHP Version : 8.1.34 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /var/www/html/php/thanhphuong/app/Http/Controllers/ |
Upload File : |
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Redirect;
use App\Customer;
use App\CustomerGroup;
use App\Warehouse;
use App\Biller;
use App\Brand;
use App\Category;
use App\Product;
use App\Unit;
use App\Tax;
use App\Sale;
use App\Delivery;
use App\PosSetting;
use App\Product_Sale;
use App\Product_Warehouse;
use App\Payment;
use App\Account;
use App\Coupon;
use App\GiftCard;
use App\PaymentWithCheque;
use App\PaymentWithGiftCard;
use App\PaymentWithCreditCard;
use App\PaymentWithPaypal;
use App\User;
use App\Variant;
use App\ProductVariant;
use App\CashRegister;
use App\Returns;
use App\Expense;
use App\ProductPurchase;
use App\Purchase;
use Carbon\Carbon;
use DB;
use App\GeneralSetting;
use Stripe\Stripe;
use NumberToWords\NumberToWords;
use N2W;
use Auth;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
use App\Mail\UserNotification;
use Illuminate\Support\Facades\Mail;
use Srmklive\PayPal\Services\ExpressCheckout;
use Srmklive\PayPal\Services\AdaptivePayments;
use GeniusTS\HijriDate\Date;
use Illuminate\Support\Facades\Validator;
class ReturnController extends Controller
{
public function index(Request $request)
{
$start_date = $request->input('start_date', date('Y-m').'-01');
$end_date = $request->input('end_date', date('Y-m-d'));
$start_date = date('Y-m-d', strtotime(str_replace('/', '-', $start_date)));
$end_date = date('Y-m-d', strtotime(str_replace('/', '-', $end_date)));
$role = Role::find(Auth::user()->role_id);
if($role->hasPermissionTo('returns-index')){
$permissions = Role::findByName($role->name)->permissions;
foreach ($permissions as $permission)
$all_permission[] = $permission->name;
if(empty($all_permission))
$all_permission[] = 'dummy text';
if(Auth::user()->role_id > 2 && config('staff_access') == 'own')
$lims_sale_all = Sale::orderBy('id', 'desc')->where('user_id', Auth::id())->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->get();
else
$lims_sale_all = Sale::orderBy('id', 'desc')->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->get();
$lims_gift_card_list = GiftCard::where("is_active", true)->get();
$lims_pos_setting_data = PosSetting::latest()->first();
$lims_account_list = Account::where('is_active', true)->get();
$date_format = GeneralSetting::select('date_format')->latest()->first();
return view('return.index',compact('start_date', 'end_date', 'lims_sale_all', 'lims_gift_card_list', 'lims_pos_setting_data', 'lims_account_list', 'all_permission', 'date_format'));
}
else
return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
}
public function returnSaleData(Request $request)
{
$start_date = $request->input('start_date', date('Y-m').'-01');
$end_date = $request->input('end_date', date('Y-m-d'));
$start_date = date('Y-m-d', strtotime(str_replace('/', '-', $start_date)));
$end_date = date('Y-m-d', strtotime(str_replace('/', '-', $end_date)));
$columns = array(
1 => 'created_at',
2 => 'inventory_delivery_voucher',
7 => 'grand_total',
8 => 'paid_amount',
);
if(Auth::user()->role_id > 2 && config('staff_access') == 'own')
$totalData = Sale::where('user_id', Auth::id())->where('method', '=', 'return')->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
else
$totalData = Sale::where('method', '=', 'return')->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)->count();
$totalFiltered = $totalData;
if($request->input('length') != -1)
$limit = $request->input('length');
else
$limit = $totalData;
$start = $request->input('start');
$order = $columns[$request->input('order.0.column')];
$dir = $request->input('order.0.dir');
if(empty($request->input('search.value'))){
if(Auth::user()->role_id > 2 && config('staff_access') == 'own')
$sales = Sale::with('biller', 'customer', 'warehouse', 'user')
->where('method', '=', 'return')
->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)
->offset($start)
// ->where('user_id', Auth::id())
->limit($limit)
->orderBy($order, $dir)
->get();
else
$sales = Sale::with('biller', 'customer', 'warehouse', 'user')->offset($start)
->where('method', '=', 'return')
->whereDate('created_at', '>=' , $start_date)->whereDate('created_at', '<=' , $end_date)
->limit($limit)
->orderBy($order, $dir)
->get();
}
else
{
$search = $request->input('search.value');
$arr_created_search = explode('/', $search);
$created_search = "";
if(count($arr_created_search) > 2){
$created_search = $arr_created_search[2] . '-' . $arr_created_search[1] . '-' . $arr_created_search[0];
} else if (count($arr_created_search) > 1) {
$created_search = $arr_created_search[1] . '-' . $arr_created_search[0];
} else {
$created_search = $search;
}
$products = Product::select('products.id')
->where([
['products.name', 'LIKE', "%{$search}%"],
['products.is_active', true]
])
->orWhere([
['products.code', 'LIKE', "%{$search}%"],
['products.is_active', true]
])->get();
$arrProductSearchId = array();
foreach ($products as $key=>$product)
{
$arrProductSearchId[] = $product->id;
}
if(Auth::user()->role_id > 2 && config('staff_access') == 'own') {
$sales = Sale::select('sales.*')
->with('biller', 'customer', 'warehouse', 'user')
->leftJoin('customers', 'sales.customer_id', '=', 'customers.id')
->leftJoin('billers', 'sales.biller_id', '=', 'billers.id')
->where('sales.method', '=', 'return')
->whereDate('sales.created_at', '>=' , $start_date)
->whereDate('sales.created_at', '<=' , $end_date)
->orwhere([
['sales.inventory_delivery_voucher', 'LIKE', "%{$search}%"],
])
->orwhere([
['customers.name', 'LIKE', "%{$search}%"],
])
->orwhere([
['billers.name', 'LIKE', "%{$search}%"],
])
->orwhere('sales.created_at', 'LIKE', "%{$created_search}%")
->distinct()
->offset($start)
->limit($limit)
->orderBy($order,$dir)->get();
$totalFiltered = Sale::
leftJoin('customers', 'sales.customer_id', '=', 'customers.id')
->leftJoin('billers', 'sales.biller_id', '=', 'billers.id')
->where('sales.method', '=', 'return')
->whereDate('sales.created_at', '>=' , $start_date)
->whereDate('sales.created_at', '<=' , $end_date)
->orwhere([
['sales.inventory_delivery_voucher', 'LIKE', "%{$search}%"],
])
->orwhere([
['customers.name', 'LIKE', "%{$search}%"],
])
->orwhere([
['billers.name', 'LIKE', "%{$search}%"],
])
->orwhere('sales.created_at', 'LIKE', "%{$created_search}%")
->distinct()
->count();
}
else {
$sales = Sale::select('sales.*')
->with('biller', 'customer', 'warehouse', 'user')
->leftJoin('customers', 'sales.customer_id', '=', 'customers.id')
->leftJoin('billers', 'sales.biller_id', '=', 'billers.id')
->where('sales.method', '=', 'return')
->whereDate('sales.created_at', '>=' , $start_date)
->whereDate('sales.created_at', '<=' , $end_date)
->orwhere('sales.inventory_delivery_voucher', 'LIKE', "%{$search}%")
->orwhere('billers.name', 'LIKE', "%{$search}%")
->orwhere('customers.name', 'LIKE', "%{$search}%")
->orwhere('sales.created_at', 'LIKE', "%{$created_search}%")
->distinct()
->offset($start)
->limit($limit)
->orderBy($order,$dir)
->get();
$totalFiltered = Sale::
leftJoin('customers', 'sales.customer_id', '=', 'customers.id')
->leftJoin('billers', 'sales.biller_id', '=', 'billers.id')
->where('sales.method', '=', 'return')
->whereDate('sales.created_at', '>=' , $start_date)
->whereDate('sales.created_at', '<=' , $end_date)
->orwhere('sales.created_at', 'LIKE', "%{$created_search}%")
->orwhere('customers.name', 'LIKE', "%{$search}%")
->orwhere('billers.name', 'LIKE', "%{$search}%")
->orwhere('sales.inventory_delivery_voucher', 'LIKE', "%{$search}%")
->distinct()
->count();
}
}
$data = array();
if(!empty($sales))
{
foreach ($sales as $key=>$sale)
{
$nestedData['id'] = $sale->id;
$nestedData['key'] = $key;
$nestedData['date'] = date(config('date_format'), strtotime($sale->created_at->toDateString()));
$nestedData['inventory_delivery_voucher'] = $sale->inventory_delivery_voucher;
$nestedData['warehouse'] = $sale->warehouse->name;
$nestedData['biller'] = $sale->biller ? $sale->biller->name : '';
$nestedData['customer'] = $sale->customer->name;
if($sale->sale_status == 1){
$nestedData['sale_status'] = '<div class="badge badge-success">'.trans('file.Completed').'</div>';
$sale_status = trans('file.Completed');
}
elseif($sale->sale_status == 2){
$nestedData['sale_status'] = '<div class="badge badge-danger">'.trans('file.Pending').'</div>';
$sale_status = trans('file.Pending');
}
else{
$nestedData['sale_status'] = '<div class="badge badge-warning">'.trans('file.Draft').'</div>';
$sale_status = trans('file.Draft');
}
if($sale->payment_status == 1)
$nestedData['payment_status'] = '<div class="badge badge-danger">'.trans('file.Pending').'</div>';
elseif($sale->payment_status == 2)
$nestedData['payment_status'] = '<div class="badge badge-danger">'.trans('file.Due').'</div>';
elseif($sale->payment_status == 3)
$nestedData['payment_status'] = '<div class="badge badge-warning">'.trans('file.Partial').'</div>';
else
$nestedData['payment_status'] = '<div class="badge badge-success">'.trans('file.Paid').'</div>';
$nestedData['grand_total'] = number_format((float)$sale->grand_total, 0, '.', '.');
$nestedData['paid_amount'] = number_format((float)$sale->paid_amount, 0, '.', '.');
$nestedData['due'] = number_format((float)$sale->grand_total - $sale->paid_amount, 0, '.', '.');
$nestedData['options'] = '<div class="btn-group">
<button type="button" class="btn btn-default btn-sm dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">'.trans("file.action").'
<span class="caret"></span>
<span class="sr-only">Toggle Dropdown</span>
</button>
<ul class="dropdown-menu edit-options dropdown-menu-right dropdown-default" user="menu">
<li><a href="'.route('return-sale.invoice', $sale->id).'" class="btn btn-link"><i class="fa fa-copy"></i> '.trans('file.Generate Invoice').'</a></li>
<li>
<button type="button" class="btn btn-link view"><i class="fa fa-eye"></i> '.trans('file.View').'</button>
</li>';
if(in_array("returns-edit", $request['all_permission'])){
if($sale->sale_status != 3)
$nestedData['options'] .= '<li>
<a href="'.route('return-sale.edit', $sale->id).'" class="btn btn-link"><i class="dripicons-document-edit"></i> '.trans('file.edit').'</a>
</li>';
else
$nestedData['options'] .= '<li>
<a href="'.url('return-sale/'.$sale->id.'/create').'" class="btn btn-link"><i class="dripicons-document-edit"></i> '.trans('file.edit').'</a>
</li>';
}
if(in_array("returns-delete", $request['all_permission']))
$nestedData['options'] .= \Form::open(["route" => ["return-sale.destroy", $sale->id], "method" => "DELETE"] ).'
<li>
<button type="submit" class="btn btn-link" onclick="return confirmDelete()"><i class="dripicons-trash"></i> '.trans("file.delete").'</button>
</li>'.\Form::close().'
</ul>
</div>';
// data for sale details by one click
$coupon = Coupon::find($sale->coupon_id);
if($coupon)
$coupon_code = $coupon->code;
else
$coupon_code = null;
$lims_product_sale_data = Product_Sale::where('sale_id', $sale->id)->get();
$nestedData['total_quantity'] = number_format((float)$sale->total_qty, 0, '.', '.');
$nestedData['product_code'] = "";
$nestedData['product_name'] = "";
$nestedData['tr_number'] = "";
$nestedData['serial_number'] = "";
$nestedData['lot_number'] = "";
$nestedData['batch_number'] = "";
$nestedData['oc_number'] = "";
$nestedData['quantity'] = "";
$invoice_number = '';
$invoice_date = '';
foreach ($lims_product_sale_data as $key => $product_sale_data) {
$product = Product::find($product_sale_data->product_id);
if (!empty( $product)) {
if($product_sale_data->variant_id){
$product_variant_code = ProductVariant::FindExactProduct($product_sale_data->product_id, $product_sale_data->variant_id)->first();
$product_variant_code = $product_variant_code ? $product_variant_code->item_code : "";
$variant_name = Variant::find($product_sale_data->variant_id);
$variant_name = $variant_name ? $variant_name->name : "";
$nestedData['product_name'] .= $variant_name . "<br>";
$nestedData['product_code'] .= $product_variant_code . "<br>";
} else {
$nestedData['product_name'] .= $product->name ."<br>";
$nestedData['product_code'] .= $product->code ."<br>";
}
}
$nestedData['tr_number'] .= $product_sale_data->tr_number . "<br>";
$nestedData['serial_number'] .= $product_sale_data->serial_number . "<br>";
$nestedData['lot_number'] .= $product_sale_data->lot_number . "<br>";
$nestedData['batch_number'] .= $product_sale_data->batch_number . "<br>";
$nestedData['quantity'] .= $product_sale_data->qty . "<br>";
$nestedData['oc_number'] .= $product_sale_data->oc_number . "<br>";
if ($product_sale_data->invoice_number) {
$invoice_number = $product_sale_data->invoice_number;
}
if ($product_sale_data->invoice_date) {
$invoice_date = $product_sale_data->invoice_date;
}
}
if($sale->biller) {
$nestedData['sale'] =self::utf8ize(array( '[ "'.date(config('date_format'), strtotime($sale->created_at->toDateString())).'"', ' "'.$sale->reference_no.'"', ' "'.$sale_status.'"', ' "'.$sale->biller->name.'"', ' "'.$sale->biller->company_name.'"', ' "'.$sale->biller->email.'"', ' "'.$sale->biller->phone_number.'"', ' "'.$sale->biller->address.'"', ' "'.$sale->biller->city.'"', ' "'.$sale->customer->name.'"', ' "'.$sale->customer->phone_number.'"', ' "'.$sale->customer->address.'"', ' "'.$sale->customer->city.'"', ' "'.$sale->id.'"', ' "'.$sale->total_tax.'"', ' "'.$sale->total_discount.'"', ' "'.$sale->total_price.'"', ' "'.$sale->order_tax.'"', ' "'.$sale->order_tax_rate.'"', ' "'.$sale->order_discount.'"', ' "'.$sale->shipping_cost.'"', ' "'.$sale->grand_total.'"', ' "'.$sale->paid_amount.'"', ' "'.preg_replace('/\s+/S', " ", $sale->sale_note).'"', ' "'.preg_replace('/\s+/S', " ", $sale->staff_note).'"', ' "'.$sale->user->name.'"', ' "'.$sale->user->email.'"', ' "'.$sale->warehouse->name.'"', ' "'.$coupon_code.'"', ' "'.$sale->coupon_discount.'"', ' "'. $invoice_number .'"' , ' "'. $invoice_date .'" ]'));
} else {
$nestedData['sale'] =self::utf8ize(array( '[ "'.date(config('date_format'), strtotime($sale->created_at->toDateString())).'"', ' "'.$sale->reference_no.'"', ' "'.$sale_status.'"', ' ""', ' ""', ' ""', ' ""', ' ""', ' ""', ' "'.$sale->customer->name.'"', ' "'.$sale->customer->phone_number.'"', ' "'.$sale->customer->address.'"', ' "'.$sale->customer->city.'"', ' "'.$sale->id.'"', ' "'.$sale->total_tax.'"', ' "'.$sale->total_discount.'"', ' "'.$sale->total_price.'"', ' "'.$sale->order_tax.'"', ' "'.$sale->order_tax_rate.'"', ' "'.$sale->order_discount.'"', ' "'.$sale->shipping_cost.'"', ' "'.$sale->grand_total.'"', ' "'.$sale->paid_amount.'"', ' "'.preg_replace('/\s+/S', " ", $sale->sale_note).'"', ' "'.preg_replace('/\s+/S', " ", $sale->staff_note).'"', ' "'.$sale->user->name.'"', ' "'.$sale->user->email.'"', ' "'.$sale->warehouse->name.'"', ' "'.$coupon_code.'"', ' "'.$sale->coupon_discount.'"', ' "'. $invoice_number .'"' , ' "'. $invoice_date .'" ]'));
}
$data[] = $nestedData;
}
}
$json_data = array(
"draw" => intval($request->input('draw')),
"recordsTotal" => intval($totalData),
"recordsFiltered" => intval($totalFiltered),
"data" => $data
);
echo json_encode($json_data);
}
function utf8ize($d) {
if (is_array($d)) {
foreach ($d as $k => $v) {
$d[$k] = self::utf8ize($v);
}
} else if (is_string ($d)) {
return self::convertToUTF8($d);
}
return $d;
}
public function convertToUTF8($text)
{
$out = iconv(mb_detect_encoding($text.'x', mb_detect_order(), false), "UTF-8//TRANSLIT//IGNORE", $text);
return $out;
}
public function create()
{
$role = Role::find(Auth::user()->role_id);
if($role->hasPermissionTo('returns-add')){
$lims_customer_list = Customer::where('is_active', true)->get();
if(Auth::user()->role_id > 2) {
$lims_warehouse_list = Warehouse::where([
['is_active', true],
['id', Auth::user()->warehouse_id]
])->get();
$lims_biller_list = Biller::where([
['is_active', true],
['id', Auth::user()->biller_id]
])->get();
}
else {
$lims_warehouse_list = Warehouse::where('is_active', true)->get();
$lims_biller_list = Biller::where('is_active', true)->get();
}
$lims_tax_list = Tax::where('is_active', true)->get();
$lims_pos_setting_data = PosSetting::latest()->first();
$date_format = GeneralSetting::select('date_format')->latest()->first();
return view('return.create',compact('lims_customer_list', 'lims_warehouse_list', 'lims_biller_list', 'lims_pos_setting_data', 'lims_tax_list', 'date_format'));
}
else
return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
}
public function store(Request $request)
{
$data = $request->all();
$data['user_id'] = Auth::id();
$cash_register_data = CashRegister::where([
['user_id', $data['user_id']],
['warehouse_id', $data['warehouse_id']],
['status', true]
])->first();
$date_format = GeneralSetting::select('date_format')->latest()->first();
$data['updated_at'] = $data['updated_at'] ? Carbon::createFromFormat($date_format->date_format, $data['updated_at']) : null;
$data['created_at'] = $data['updated_at'];
$data['payment_status'] = 4;
if($cash_register_data)
$data['cash_register_id'] = $cash_register_data->id;
if($data['pos']){
$data['reference_no'] = 'posr-' . date("Ymd") . '-'. date("his");
$balance = $data['grand_total'] - $data['paid_amount'];
if($balance > 0 || $balance < 0)
$data['payment_status'] = 2;
else
$data['payment_status'] = 4;
if($data['draft']) {
$lims_sale_data = Sale::find($data['sale_id']);
$lims_product_sale_data = Product_Sale::where('sale_id', $data['sale_id'])->get();
foreach ($lims_product_sale_data as $product_sale_data) {
$product_sale_data->delete();
}
$lims_sale_data->delete();
}
}
else
$data['reference_no'] = 'TH-' . date("Ymd") . '-'. date("his");
$document = $request->document;
if ($document) {
$v = Validator::make(
[
'extension' => strtolower($request->document->getClientOriginalExtension()),
],
[
'extension' => 'in:jpg,jpeg,png,gif,pdf,csv,docx,xlsx,txt',
]
);
if ($v->fails())
return redirect()->back()->withErrors($v->errors());
$documentName = $document->getClientOriginalName();
$document->move('public/sale/documents', $documentName);
$data['document'] = $documentName;
}
if($data['coupon_active']) {
$lims_coupon_data = Coupon::find($data['coupon_id']);
$lims_coupon_data->used += 1;
$lims_coupon_data->save();
}
$data['method'] = "return";
$lims_sale_data = Sale::create($data);
$lims_customer_data = Customer::find($data['customer_id']);
//collecting male data
$mail_data['email'] = $lims_customer_data->email;
$mail_data['reference_no'] = $lims_sale_data->reference_no;
$mail_data['sale_status'] = $lims_sale_data->sale_status;
$mail_data['payment_status'] = $lims_sale_data->payment_status;
$mail_data['total_qty'] = $lims_sale_data->total_qty;
$mail_data['total_price'] = $lims_sale_data->total_price;
$mail_data['order_tax'] = $lims_sale_data->order_tax;
$mail_data['order_tax_rate'] = $lims_sale_data->order_tax_rate;
$mail_data['order_discount'] = $lims_sale_data->order_discount;
$mail_data['shipping_cost'] = $lims_sale_data->shipping_cost;
$mail_data['grand_total'] = $lims_sale_data->grand_total;
$mail_data['paid_amount'] = $lims_sale_data->paid_amount;
$product_id = $data['product_id'];
$product_code = $data['product_code'];
$qty = $data['qty'];
$sale_unit = $data['sale_unit'];
$net_unit_price = $data['net_unit_price'];
$discount = $data['discount'];
$tax_rate = $data['tax_rate'];
$tax = $data['tax'];
$total = $data['subtotal'];
$lot_number = $data['lot_number'];
$serial_number = $data['serial_number'];
$batch_number = $data['batch_number'];
$invoice_number = $data['invoice_number'];
$invoice_date = $data['invoice_date'];
$tr_number = $data['tr_number'];
$oc_number = $data['oc_number'];
$product_sale = [];
foreach ($product_id as $i => $id) {
$lims_product_data = Product::where('id', $id)->first();
$product_sale['variant_id'] = null;
if($lims_product_data->type == 'combo' && $data['sale_status'] == 1){
$product_list = explode(",", $lims_product_data->product_list);
$qty_list = explode(",", $lims_product_data->qty_list);
$price_list = explode(",", $lims_product_data->price_list);
foreach ($product_list as $key=>$child_id) {
$child_data = Product::find($child_id);
$child_warehouse_data = Product_Warehouse::where([
['product_id', $child_id],
['warehouse_id', $data['warehouse_id'] ],
])->first();
$child_data->qty -= $qty[$i] * $qty_list[$key];
$child_warehouse_data->qty -= $qty[$i] * $qty_list[$key];
$child_data->save();
$child_warehouse_data->save();
}
}
if($sale_unit[$i] != 'n/a') {
$lims_sale_unit_data = Unit::where('unit_name', $sale_unit[$i])->first();
$sale_unit_id = $lims_sale_unit_data->id;
if($lims_product_data->is_variant) {
$lims_product_variant_data = ProductVariant::select('id', 'variant_id', 'qty')->FindExactProductWithCode($id, $product_code[$i])->first();
$product_sale['variant_id'] = $lims_product_variant_data->variant_id;
}
if($data['sale_status'] == 1){
if($lims_sale_unit_data->operator == '*')
$quantity = $qty[$i] * $lims_sale_unit_data->operation_value;
elseif($lims_sale_unit_data->operator == '/')
$quantity = $qty[$i] / $lims_sale_unit_data->operation_value;
//deduct quantity
$lims_product_data->qty = $lims_product_data->qty - $quantity;
$lims_product_data->save();
//deduct product variant quantity if exist
if($lims_product_data->is_variant) {
$lims_product_variant_data->qty -= $quantity;
$lims_product_variant_data->save();
$lims_product_warehouse_data = Product_Warehouse::FindProductWithVariant($id, $lims_product_variant_data->variant_id, $data['warehouse_id'])->first();
}
else {
$lims_product_warehouse_data = Product_Warehouse::FindProductWithoutVariant($id, $data['warehouse_id'])->first();
}
//deduct quantity from warehouse
$lims_product_warehouse_data->qty -= $quantity;
$lims_product_warehouse_data->save();
}
}
else
$sale_unit_id = 0;
if($product_sale['variant_id']){
$variant_data = Variant::select('name')->find($product_sale['variant_id']);
$mail_data['products'][$i] = $lims_product_data->name . ' ['. $variant_data->name .']';
}
else
$mail_data['products'][$i] = $lims_product_data->name;
if($lims_product_data->type == 'digital')
$mail_data['file'][$i] = url('/public/product/files').'/'.$lims_product_data->file;
else
$mail_data['file'][$i] = '';
if($sale_unit_id)
$mail_data['unit'][$i] = $lims_sale_unit_data->unit_code;
else
$mail_data['unit'][$i] = '';
$product_sale['sale_id'] = $lims_sale_data->id ;
$product_sale['product_id'] = $id;
$product_sale['qty'] = $mail_data['qty'][$i] = $qty[$i];
$product_sale['sale_unit_id'] = $sale_unit_id;
$product_sale['net_unit_price'] = $net_unit_price[$i];
$product_sale['discount'] = $discount[$i];
$product_sale['tax_rate'] = $tax_rate[$i];
$product_sale['tax'] = $tax[$i];
$product_sale['total'] = $mail_data['total'][$i] = $total[$i];
$product_sale['lot_number'] = $lot_number[$i];
$product_sale['serial_number'] = $serial_number[$i];
$product_sale['batch_number'] = $batch_number[$i];
$product_sale['invoice_number'] = $invoice_number[$i];
$product_sale['invoice_date'] = isset($invoice_date[$i]) ? Carbon::createFromFormat($date_format->date_format, $invoice_date[$i]) : null;
$product_sale['tr_number'] = $tr_number[$i];
$product_sale['oc_number'] = $oc_number[$i];
Product_Sale::create($product_sale);
}
if($data['sale_status'] == 3)
$message = 'Sale successfully added to draft';
else
$message = ' Sale created successfully';
if($mail_data['email'] && $data['sale_status'] == 1) {
try {
Mail::send( 'mail.sale_details', $mail_data, function( $message ) use ($mail_data)
{
$message->to( $mail_data['email'] )->subject( 'Sale Details' );
});
}
catch(\Exception $e){
$message = ' Sale created successfully. Please setup your <a href="setting/mail_setting">mail setting</a> to send mail.';
}
}
if($lims_sale_data->sale_status == '1')
return redirect('return-sale/gen_invoice/' . $lims_sale_data->id)->with('message', $message);
elseif($data['pos'])
return redirect('pos')->with('message', $message);
else
return redirect('return-sale')->with('message', $message);
}
public function sendMail(Request $request)
{
$data = $request->all();
$lims_sale_data = Sale::find($data['sale_id']);
$lims_product_sale_data = Product_Sale::where('sale_id', $data['sale_id'])->get();
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
if($lims_customer_data->email) {
//collecting male data
$mail_data['email'] = $lims_customer_data->email;
$mail_data['reference_no'] = $lims_sale_data->reference_no;
$mail_data['sale_status'] = $lims_sale_data->sale_status;
$mail_data['payment_status'] = $lims_sale_data->payment_status;
$mail_data['total_qty'] = $lims_sale_data->total_qty;
$mail_data['total_price'] = $lims_sale_data->total_price;
$mail_data['order_tax'] = $lims_sale_data->order_tax;
$mail_data['order_tax_rate'] = $lims_sale_data->order_tax_rate;
$mail_data['order_discount'] = $lims_sale_data->order_discount;
$mail_data['shipping_cost'] = $lims_sale_data->shipping_cost;
$mail_data['grand_total'] = $lims_sale_data->grand_total;
$mail_data['paid_amount'] = $lims_sale_data->paid_amount;
foreach ($lims_product_sale_data as $key => $product_sale_data) {
$lims_product_data = Product::find($product_sale_data->product_id);
if($product_sale_data->variant_id) {
$variant_data = Variant::select('name')->find($product_sale_data->variant_id);
$mail_data['products'][$key] = $lims_product_data->name . ' [' . $variant_data->name . ']';
}
else
$mail_data['products'][$key] = $lims_product_data->name;
if($lims_product_data->type == 'digital')
$mail_data['file'][$key] = url('/public/product/files').'/'.$lims_product_data->file;
else
$mail_data['file'][$key] = '';
if($product_sale_data->sale_unit_id){
$lims_unit_data = Unit::find($product_sale_data->sale_unit_id);
$mail_data['unit'][$key] = $lims_unit_data->unit_code;
}
else
$mail_data['unit'][$key] = '';
$mail_data['qty'][$key] = $product_sale_data->qty;
$mail_data['total'][$key] = $product_sale_data->qty;
}
try{
Mail::send( 'mail.sale_details', $mail_data, function( $message ) use ($mail_data)
{
$message->to( $mail_data['email'] )->subject( 'Sale Details' );
});
$message = 'Mail sent successfully';
}
catch(\Exception $e){
$message = 'Please setup your <a href="setting/mail_setting">mail setting</a> to send mail.';
}
}
else
$message = 'Customer doesnt have email!';
return redirect()->back()->with('message', $message);
}
public function paypalSuccess(Request $request)
{
$lims_sale_data = Sale::latest()->first();
$lims_payment_data = Payment::latest()->first();
$lims_product_sale_data = Product_Sale::where('sale_id', $lims_sale_data->id)->get();
$provider = new ExpressCheckout;
$token = $request->token;
$payerID = $request->PayerID;
$paypal_data['items'] = [];
foreach ($lims_product_sale_data as $key => $product_sale_data) {
$lims_product_data = Product::find($product_sale_data->product_id);
$paypal_data['items'][] = [
'name' => $lims_product_data->name,
'price' => ($product_sale_data->total/$product_sale_data->qty),
'qty' => $product_sale_data->qty
];
}
$paypal_data['items'][] = [
'name' => 'order tax',
'price' => $lims_sale_data->order_tax,
'qty' => 1
];
$paypal_data['items'][] = [
'name' => 'order discount',
'price' => $lims_sale_data->order_discount * (-1),
'qty' => 1
];
$paypal_data['items'][] = [
'name' => 'shipping cost',
'price' => $lims_sale_data->shipping_cost,
'qty' => 1
];
if($lims_sale_data->grand_total != $lims_sale_data->paid_amount){
$paypal_data['items'][] = [
'name' => 'Due',
'price' => ($lims_sale_data->grand_total - $lims_sale_data->paid_amount) * (-1),
'qty' => 1
];
}
$paypal_data['invoice_id'] = $lims_payment_data->payment_reference;
$paypal_data['invoice_description'] = "Reference: {$paypal_data['invoice_id']}";
$paypal_data['return_url'] = url('/sale/paypalSuccess');
$paypal_data['cancel_url'] = url('/sale/create');
$total = 0;
foreach($paypal_data['items'] as $item) {
$total += $item['price']*$item['qty'];
}
$paypal_data['total'] = $lims_sale_data->paid_amount;
$response = $provider->getExpressCheckoutDetails($token);
$response = $provider->doExpressCheckoutPayment($paypal_data, $token, $payerID);
$data['payment_id'] = $lims_payment_data->id;
$data['transaction_id'] = $response['PAYMENTINFO_0_TRANSACTIONID'];
PaymentWithPaypal::create($data);
return redirect('sales')->with('message', 'Sales created successfully');
}
public function paypalPaymentSuccess(Request $request, $id)
{
$lims_payment_data = Payment::find($id);
$provider = new ExpressCheckout;
$token = $request->token;
$payerID = $request->PayerID;
$paypal_data['items'] = [];
$paypal_data['items'][] = [
'name' => 'Paid Amount',
'price' => $lims_payment_data->amount,
'qty' => 1
];
$paypal_data['invoice_id'] = $lims_payment_data->payment_reference;
$paypal_data['invoice_description'] = "Reference: {$paypal_data['invoice_id']}";
$paypal_data['return_url'] = url('/sale/paypalPaymentSuccess');
$paypal_data['cancel_url'] = url('/sale');
$total = 0;
foreach($paypal_data['items'] as $item) {
$total += $item['price']*$item['qty'];
}
$paypal_data['total'] = $total;
$response = $provider->getExpressCheckoutDetails($token);
$response = $provider->doExpressCheckoutPayment($paypal_data, $token, $payerID);
$data['payment_id'] = $lims_payment_data->id;
$data['transaction_id'] = $response['PAYMENTINFO_0_TRANSACTIONID'];
PaymentWithPaypal::create($data);
return redirect('sales')->with('message', 'Payment created successfully');
}
public function getProduct($id)
{
$lims_product_warehouse_data = Product::join('product_warehouse', 'products.id', '=', 'product_warehouse.product_id')
->where([
['products.is_active', true],
['product_warehouse.warehouse_id', $id],
//['product_warehouse.qty', '>', 0]
])->whereNull('product_warehouse.variant_id')->select('product_warehouse.*')->get();
$lims_product_with_variant_warehouse_data = Product::join('product_warehouse', 'products.id', '=', 'product_warehouse.product_id')
->where([
['products.is_active', true],
['product_warehouse.warehouse_id', $id],
//['product_warehouse.qty', '>', 0]
])->whereNotNull('product_warehouse.variant_id')->select('product_warehouse.*')->get();
$product_id = [];
$product_code = [];
$product_name = [];
$product_qty = [];
$product_price = [];
$product_data = [];
$product_type = [];
$product_list = [];
$qty_list = [];
//product without variant
foreach ($lims_product_warehouse_data as $product_warehouse)
{
$product_qty[] = $product_warehouse->qty;
$product_price[] = $product_warehouse->price;
$lims_product_data = Product::find($product_warehouse->product_id);
$product_code[] = $lims_product_data->code;
$product_name[] = htmlspecialchars($lims_product_data->name);
$product_type[] = $lims_product_data->type;
$product_id[] = $lims_product_data->id;
$product_list[] = $lims_product_data->product_list;
$qty_list[] = $lims_product_data->qty_list;
}
//product with variant
foreach ($lims_product_with_variant_warehouse_data as $product_warehouse)
{
$lims_product_variant_data = ProductVariant::select('item_code', 'variant_id')->FindExactProduct($product_warehouse->product_id, $product_warehouse->variant_id)->first();
if($lims_product_variant_data){
$product_qty[] = $product_warehouse->qty;
$lims_product_data = Product::find($product_warehouse->product_id);
$variant_data = Variant::find($lims_product_variant_data->variant_id);
$product_code[] = $lims_product_variant_data->item_code;
$product_name[] = htmlspecialchars($variant_data->name ?? "");
$product_type[] = $lims_product_data->type;
$product_id[] = $lims_product_data->id;
$product_list[] = $lims_product_data->product_list;
$qty_list[] = $lims_product_data->qty_list;
}
}
//retrieve product with type of digital and combo
$lims_product_data = Product::whereNotIn('type', ['standard'])->where('is_active', true)->get();
foreach ($lims_product_data as $product)
{
$product_qty[] = $product->qty;
$product_code[] = $product->code;
$product_name[] = $product->name;
$product_type[] = $product->type;
$product_id[] = $product->id;
$product_list[] = $product->product_list;
$qty_list[] = $product->qty_list;
}
$product_data = [$product_code, $product_name, $product_qty, $product_type, $product_id, $product_list, $qty_list, $product_price];
return $product_data;
}
public function posSale()
{
$role = Role::find(Auth::user()->role_id);
if($role->hasPermissionTo('sales-add')){
$permissions = Role::findByName($role->name)->permissions;
foreach ($permissions as $permission)
$all_permission[] = $permission->name;
if(empty($all_permission))
$all_permission[] = 'dummy text';
$lims_customer_list = Customer::where('is_active', true)->get();
$lims_customer_group_all = CustomerGroup::where('is_active', true)->get();
$lims_warehouse_list = Warehouse::where('is_active', true)->get();
$lims_biller_list = Biller::where('is_active', true)->get();
$lims_tax_list = Tax::where('is_active', true)->get();
$lims_product_list = Product::select('id', 'name', 'code', 'image')->ActiveFeatured()->whereNull('is_variant')->get();
foreach ($lims_product_list as $key => $product) {
$images = explode(",", $product->image);
$product->base_image = $images[0];
}
$lims_product_list_with_variant = Product::select('id', 'name', 'code', 'image')->ActiveFeatured()->whereNotNull('is_variant')->get();
foreach ($lims_product_list_with_variant as $product) {
$images = explode(",", $product->image);
$product->base_image = $images[0];
$lims_product_variant_data = $product->variant()->orderBy('position')->get();
$main_name = $product->name;
$temp_arr = [];
foreach ($lims_product_variant_data as $key => $variant) {
$product->name = $main_name.' ['.$variant->name.']';
$product->code = $variant->pivot['item_code'];
$lims_product_list[] = clone($product);
}
}
$product_number = count($lims_product_list);
$lims_pos_setting_data = PosSetting::latest()->first();
$lims_brand_list = Brand::where('is_active',true)->get();
$lims_category_list = Category::where('is_active',true)->get();
if(Auth::user()->role_id > 2 && config('staff_access') == 'own') {
$recent_sale = Sale::where([
['sale_status', 1],
['user_id', Auth::id()]
])->orderBy('id', 'desc')->take(10)->get();
$recent_draft = Sale::where([
['sale_status', 3],
['user_id', Auth::id()]
])->orderBy('id', 'desc')->take(10)->get();
}
else {
$recent_sale = Sale::where('sale_status', 1)->orderBy('id', 'desc')->take(10)->get();
$recent_draft = Sale::where('sale_status', 3)->orderBy('id', 'desc')->take(10)->get();
}
$lims_coupon_list = Coupon::where('is_active',true)->get();
$flag = 0;
return view('sale.pos', compact('all_permission', 'lims_customer_list', 'lims_customer_group_all', 'lims_warehouse_list', 'lims_product_list', 'product_number', 'lims_tax_list', 'lims_biller_list', 'lims_pos_setting_data', 'lims_brand_list', 'lims_category_list', 'recent_sale', 'recent_draft', 'lims_coupon_list', 'flag'));
}
else
return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
}
public function getProductByFilter($category_id, $brand_id)
{
$data = [];
if(($category_id != 0) && ($brand_id != 0)){
$lims_product_list = DB::table('products')
->join('categories', 'products.category_id', '=', 'categories.id')
->where([
['products.is_active', true],
['products.category_id', $category_id],
['brand_id', $brand_id]
])->orWhere([
['categories.parent_id', $category_id],
['products.is_active', true],
['brand_id', $brand_id]
])->select('products.name', 'products.code', 'products.image')->get();
}
elseif(($category_id != 0) && ($brand_id == 0)){
$lims_product_list = DB::table('products')
->join('categories', 'products.category_id', '=', 'categories.id')
->where([
['products.is_active', true],
['products.category_id', $category_id],
])->orWhere([
['categories.parent_id', $category_id],
['products.is_active', true]
])->select('products.id', 'products.name', 'products.code', 'products.image', 'products.is_variant')->get();
}
elseif(($category_id == 0) && ($brand_id != 0)){
$lims_product_list = Product::where([
['brand_id', $brand_id],
['is_active', true]
])
->select('products.id', 'products.name', 'products.code', 'products.image', 'products.is_variant')
->get();
}
else
$lims_product_list = Product::where('is_active', true)->get();
$index = 0;
foreach ($lims_product_list as $product) {
if($product->is_variant) {
$lims_product_data = Product::select('id')->find($product->id);
$lims_product_variant_data = $lims_product_data->variant()->orderBy('position')->get();
foreach ($lims_product_variant_data as $key => $variant) {
$data['name'][$index] = $product->name.' ['.$variant->name.']';
$data['code'][$index] = $variant->pivot['item_code'];
$images = explode(",", $product->image);
$data['image'][$index] = $images[0];
$index++;
}
}
else {
$data['name'][$index] = $product->name;
$data['code'][$index] = $product->code;
$images = explode(",", $product->image);
$data['image'][$index] = $images[0];
$index++;
}
}
return $data;
}
public function getFeatured()
{
$data = [];
$lims_product_list = Product::where([
['is_active', true],
['featured', true]
])->select('products.id', 'products.name', 'products.code', 'products.image', 'products.is_variant')->get();
$index = 0;
foreach ($lims_product_list as $product) {
if($product->is_variant) {
$lims_product_data = Product::select('id')->find($product->id);
$lims_product_variant_data = $lims_product_data->variant()->orderBy('position')->get();
foreach ($lims_product_variant_data as $key => $variant) {
$data['name'][$index] = $product->name.' ['.$variant->name.']';
$data['code'][$index] = $variant->pivot['item_code'];
$images = explode(",", $product->image);
$data['image'][$index] = $images[0];
$index++;
}
}
else {
$data['name'][$index] = $product->name;
$data['code'][$index] = $product->code;
$images = explode(",", $product->image);
$data['image'][$index] = $images[0];
$index++;
}
}
return $data;
}
public function getCustomerGroup($id)
{
$lims_customer_data = Customer::find($id);
$lims_customer_group_data = CustomerGroup::find($lims_customer_data->customer_group_id);
return $lims_customer_group_data->percentage;
}
public function limsProductSearch(Request $request)
{
$todayDate = date('Y-m-d');
$product_code = explode("(", $request['data']);
$product_code[0] = rtrim($product_code[0], " ");
$product_variant_id = null;
$lims_product_data = Product::where('code', $product_code[0])->first();
if(!$lims_product_data) {
$lims_product_data = Product::join('product_variants', 'products.id', 'product_variants.product_id')
->select('products.*', 'product_variants.id as product_variant_id', 'product_variants.item_code', 'product_variants.variant_id', 'product_variants.additional_price')
->where('product_variants.item_code', $product_code[0])
->first();
$product_variant_id = $lims_product_data->product_variant_id;
}
$purchase_product = ProductPurchase::where("product_id", $lims_product_data->id)->first();
if($lims_product_data->is_variant){
$variant_data = Variant::find($lims_product_data->variant_id);
$product[] = $lims_product_data->item_code;
$product[] = $variant_data->name;
$lims_product_data->price += $lims_product_data->additional_price;
}
else{
$product[] = $lims_product_data->code;
$product[] = $lims_product_data->name;
}
if($lims_product_data->promotion && $todayDate <= $lims_product_data->last_date){
$product[] = $lims_product_data->promotion_price;
}
else
$product[] = $lims_product_data->price;
if($lims_product_data->tax_id) {
$lims_tax_data = Tax::find($lims_product_data->tax_id);
$product[] = $lims_tax_data->rate;
$product[] = $lims_tax_data->name;
}
else{
$product[] = 0;
$product[] = 'No Tax';
}
$product[] = $lims_product_data->tax_method;
if($lims_product_data->type == 'standard'){
$units = Unit::where("base_unit", $lims_product_data->unit_id)
->orWhere('id', $lims_product_data->unit_id)
->get();
$unit_name = array();
$unit_operator = array();
$unit_operation_value = array();
foreach ($units as $unit) {
if($lims_product_data->sale_unit_id == $unit->id) {
array_unshift($unit_name, $unit->unit_name);
array_unshift($unit_operator, $unit->operator);
array_unshift($unit_operation_value, $unit->operation_value);
}
else {
$unit_name[] = $unit->unit_name;
$unit_operator[] = $unit->operator;
$unit_operation_value[] = $unit->operation_value;
}
}
$product[] = implode(",",$unit_name) . ',';
$product[] = implode(",",$unit_operator) . ',';
$product[] = implode(",",$unit_operation_value) . ',';
}
else{
$product[] = 'n/a'. ',';
$product[] = 'n/a'. ',';
$product[] = 'n/a'. ',';
}
$product[] = $lims_product_data->id;
$product[] = $product_variant_id;
$product[] = $lims_product_data->promotion;
$product[] = $purchase_product->lot_number;
$product[] = $purchase_product->serial_number;
$product[] = $purchase_product->batch_number;
$product[] = $purchase_product->invoice_number;
$product[] = $purchase_product->tr_number;
return $product;
}
public function getGiftCard()
{
$gift_card = GiftCard::where("is_active", true)->whereDate('expired_date', '>=', date("Y-m-d"))->get(['id', 'card_no', 'amount', 'expense']);
return json_encode($gift_card);
}
public function productReturnData($id)
{
$lims_product_sale_data = Product_Sale::where('sale_id', $id)->get();
foreach ($lims_product_sale_data as $key => $product_sale_data) {
$product = Product::find($product_sale_data->product_id);
if($product_sale_data->variant_id) {
$lims_product_variant_data = ProductVariant::select('item_code')->FindExactProduct($product_sale_data->product_id, $product_sale_data->variant_id)->first();
$variant_name = Variant::find($product_sale_data->variant_id)->name;
$product->code = $lims_product_variant_data->item_code;
$product->name = $variant_name;
}
$unit_data = Unit::find($product_sale_data->sale_unit_id);
if($unit_data){
$unit = $unit_data->unit_code;
}
else
$unit = '';
$product_sale[0][$key] = $product->name;
$product_sale[1][$key] = $product_sale_data->qty;
$product_sale[2][$key] = $unit;
$product_sale[3][$key] = $product_sale_data->tax;
$product_sale[4][$key] = $product_sale_data->tax_rate;
$product_sale[5][$key] = $product_sale_data->discount;
$product_sale[6][$key] = $product_sale_data->total;
$product_sale[7][$key] = $product->code;
$product_sale[8][$key] = $product_sale_data->serial_number;
$product_sale[9][$key] = $product_sale_data->lot_number;
$product_sale[10][$key] = $product_sale_data->batch_number;
$product_sale[11][$key] = $product_sale_data->net_unit_price;
}
return $product_sale;
}
public function saleByCsv()
{
$role = Role::find(Auth::user()->role_id);
if($role->hasPermissionTo('sales-add')){
$lims_customer_list = Customer::where('is_active', true)->get();
$lims_warehouse_list = Warehouse::where('is_active', true)->get();
$lims_biller_list = Biller::where('is_active', true)->get();
$lims_tax_list = Tax::where('is_active', true)->get();
return view('sale.import',compact('lims_customer_list', 'lims_warehouse_list', 'lims_biller_list', 'lims_tax_list'));
}
else
return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
}
public function importSale(Request $request)
{
//get the file
$upload=$request->file('file');
$ext = pathinfo($upload->getClientOriginalName(), PATHINFO_EXTENSION);
//checking if this is a CSV file
if($ext != 'csv')
return redirect()->back()->with('message', 'Please upload a CSV file');
$filePath=$upload->getRealPath();
$file_handle = fopen($filePath, 'r');
$i = 0;
//validate the file
while (!feof($file_handle) ) {
$current_line = fgetcsv($file_handle);
if($current_line && $i > 0){
$product_data[] = Product::where('code', $current_line[0])->first();
if(!$product_data[$i-1])
return redirect()->back()->with('message', 'Product does not exist!');
$unit[] = Unit::where('unit_code', $current_line[2])->first();
if(!$unit[$i-1] && $current_line[2] == 'n/a')
$unit[$i-1] = 'n/a';
elseif(!$unit[$i-1]){
return redirect()->back()->with('message', 'Sale unit does not exist!');
}
if(strtolower($current_line[5]) != "no tax"){
$tax[] = Tax::where('name', $current_line[5])->first();
if(!$tax[$i-1])
return redirect()->back()->with('message', 'Tax name does not exist!');
}
else
$tax[$i-1]['rate'] = 0;
$qty[] = $current_line[1];
$price[] = $current_line[3];
$discount[] = $current_line[4];
}
$i++;
}
//return $unit;
$data = $request->except('document');
$data['reference_no'] = 'sr-' . date("Ymd") . '-'. date("his");
$data['user_id'] = Auth::user()->id;
$document = $request->document;
if ($document) {
$v = Validator::make(
[
'extension' => strtolower($request->document->getClientOriginalExtension()),
],
[
'extension' => 'in:jpg,jpeg,png,gif,pdf,csv,docx,xlsx,txt',
]
);
if ($v->fails())
return redirect()->back()->withErrors($v->errors());
$ext = pathinfo($document->getClientOriginalName(), PATHINFO_EXTENSION);
$documentName = $data['reference_no'] . '.' . $ext;
$document->move('public/return/documents', $documentName);
$data['document'] = $documentName;
}
$item = 0;
$grand_total = $data['shipping_cost'];
Sale::create($data);
$lims_sale_data = Sale::latest()->first();
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
foreach ($product_data as $key => $product) {
if($product['tax_method'] == 1){
$net_unit_price = $price[$key] - $discount[$key];
$product_tax = $net_unit_price * ($tax[$key]['rate'] / 100) * $qty[$key];
$total = ($net_unit_price * $qty[$key]) + $product_tax;
}
elseif($product['tax_method'] == 2){
$net_unit_price = (100 / (100 + $tax[$key]['rate'])) * ($price[$key] - $discount[$key]);
$product_tax = ($price[$key] - $discount[$key] - $net_unit_price) * $qty[$key];
$total = ($price[$key] - $discount[$key]) * $qty[$key];
}
if($data['sale_status'] == 1 && $unit[$key]!='n/a'){
$sale_unit_id = $unit[$key]['id'];
if($unit[$key]['operator'] == '*')
$quantity = $qty[$key] * $unit[$key]['operation_value'];
elseif($unit[$key]['operator'] == '/')
$quantity = $qty[$key] / $unit[$key]['operation_value'];
$product['qty'] -= $quantity;
$product_warehouse = Product_Warehouse::where([
['product_id', $product['id']],
['warehouse_id', $data['warehouse_id']]
])->first();
$product_warehouse->qty -= $quantity;
$product->save();
$product_warehouse->save();
}
else
$sale_unit_id = 0;
//collecting mail data
$mail_data['products'][$key] = $product['name'];
if($product['type'] == 'digital')
$mail_data['file'][$key] = url('/public/product/files').'/'.$product['file'];
else
$mail_data['file'][$key] = '';
if($sale_unit_id)
$mail_data['unit'][$key] = $unit[$key]['unit_code'];
else
$mail_data['unit'][$key] = '';
$product_sale = new Product_Sale();
$product_sale->sale_id = $lims_sale_data->id;
$product_sale->product_id = $product['id'];
$product_sale->qty = $mail_data['qty'][$key] = $qty[$key];
$product_sale->sale_unit_id = $sale_unit_id;
$product_sale->net_unit_price = number_format((float)$net_unit_price, 0, '.', '');
$product_sale->discount = $discount[$key] * $qty[$key];
$product_sale->tax_rate = $tax[$key]['rate'];
$product_sale->tax = number_format((float)$product_tax, 0, '.', '');
$product_sale->total = $mail_data['total'][$key] = number_format((float)$total, 0, '.', '');
$product_sale->save();
$lims_sale_data->total_qty += $qty[$key];
$lims_sale_data->total_discount += $discount[$key] * $qty[$key];
$lims_sale_data->total_tax += number_format((float)$product_tax, 0, '.', '');
$lims_sale_data->total_price += number_format((float)$total, 0, '.', '');
}
$lims_sale_data->item = $key + 1;
$lims_sale_data->order_tax = ($lims_sale_data->total_price - $lims_sale_data->order_discount) * ($data['order_tax_rate'] / 100);
$lims_sale_data->grand_total = ($lims_sale_data->total_price + $lims_sale_data->order_tax + $lims_sale_data->shipping_cost) - $lims_sale_data->order_discount;
$lims_sale_data->save();
$message = 'Sale imported successfully';
if($lims_customer_data->email){
//collecting male data
$mail_data['email'] = $lims_customer_data->email;
$mail_data['reference_no'] = $lims_sale_data->reference_no;
$mail_data['sale_status'] = $lims_sale_data->sale_status;
$mail_data['payment_status'] = $lims_sale_data->payment_status;
$mail_data['total_qty'] = $lims_sale_data->total_qty;
$mail_data['total_price'] = $lims_sale_data->total_price;
$mail_data['order_tax'] = $lims_sale_data->order_tax;
$mail_data['order_tax_rate'] = $lims_sale_data->order_tax_rate;
$mail_data['order_discount'] = $lims_sale_data->order_discount;
$mail_data['shipping_cost'] = $lims_sale_data->shipping_cost;
$mail_data['grand_total'] = $lims_sale_data->grand_total;
$mail_data['paid_amount'] = $lims_sale_data->paid_amount;
if($mail_data['email']){
try{
Mail::send( 'mail.sale_details', $mail_data, function( $message ) use ($mail_data)
{
$message->to( $mail_data['email'] )->subject( 'Sale Details' );
});
}
catch(\Exception $e){
$message = 'Sale imported successfully. Please setup your <a href="setting/mail_setting">mail setting</a> to send mail.';
}
}
}
return redirect('sales')->with('message', $message);
}
public function createSale($id)
{
$role = Role::find(Auth::user()->role_id);
if($role->hasPermissionTo('sales-edit')){
$lims_biller_list = Biller::where('is_active', true)->get();
$lims_customer_list = Customer::where('is_active', true)->get();
$lims_customer_group_all = CustomerGroup::where('is_active', true)->get();
$lims_warehouse_list = Warehouse::where('is_active', true)->get();
$lims_tax_list = Tax::where('is_active', true)->get();
$lims_sale_data = Sale::find($id);
$lims_product_sale_data = Product_Sale::where('sale_id', $id)->get();
$lims_product_list = Product::where([
['featured', 1],
['is_active', true]
])->get();
foreach ($lims_product_list as $key => $product) {
$images = explode(",", $product->image);
$product->base_image = $images[0];
}
$product_number = count($lims_product_list);
$lims_pos_setting_data = PosSetting::latest()->first();
$lims_brand_list = Brand::where('is_active',true)->get();
$lims_category_list = Category::where('is_active',true)->get();
$lims_coupon_list = Coupon::where('is_active',true)->get();
return view('sale.create_sale',compact('lims_biller_list', 'lims_customer_list', 'lims_warehouse_list', 'lims_tax_list', 'lims_sale_data','lims_product_sale_data', 'lims_pos_setting_data', 'lims_brand_list', 'lims_category_list', 'lims_coupon_list', 'lims_product_list', 'product_number', 'lims_customer_group_all'));
}
else
return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
}
public function edit($id)
{
$role = Role::find(Auth::user()->role_id);
if($role->hasPermissionTo('returns-edit')){
$lims_customer_list = Customer::where('is_active', true)->get();
$lims_warehouse_list = Warehouse::where('is_active', true)->get();
$lims_biller_list = Biller::where('is_active', true)->get();
$lims_tax_list = Tax::where('is_active', true)->get();
$lims_sale_data = Sale::find($id);
$lims_product_sale_data = Product_Sale::where('sale_id', $id)->get();
$date_format = GeneralSetting::select('date_format')->latest()->first();
return view('return.edit',compact('lims_customer_list', 'lims_warehouse_list', 'lims_biller_list', 'lims_tax_list', 'lims_sale_data','lims_product_sale_data', 'date_format'));
}
else
return redirect()->back()->with('not_permitted', 'Sorry! You are not allowed to access this module');
}
public function update(Request $request, $id)
{
$data = $request->except('document');
$date_format = GeneralSetting::select('date_format')->latest()->first();
$data['updated_at'] = $data['updated_at'] ? Carbon::createFromFormat($date_format->date_format, $data['updated_at']) : null;
$data['created_at'] = $data['updated_at'];
$document = $request->document;
if ($document) {
$v = Validator::make(
[
'extension' => strtolower($request->document->getClientOriginalExtension()),
],
[
'extension' => 'in:jpg,jpeg,png,gif,pdf,csv,docx,xlsx,txt',
]
);
if ($v->fails())
return redirect()->back()->withErrors($v->errors());
$documentName = $document->getClientOriginalName();
$document->move('public/return/documents', $documentName);
$data['document'] = $documentName;
}
$lims_sale_data = Sale::find($id);
$lims_product_sale_data = Product_Sale::where('sale_id', $id)->get();
$product_id = $data['product_id'];
$product_code = $data['product_code'];
$product_variant_id = $data['product_variant_id'];
$qty = $data['qty'];
$sale_unit = $data['sale_unit'];
$net_unit_price = $data['net_unit_price'];
$discount = $data['discount'];
$tax_rate = $data['tax_rate'];
$lot_number = $data['lot_number'];
$serial_number = $data['serial_number'];
$batch_number = $data['batch_number'];
$invoice_number = $data['invoice_number'];
$tr_number = $data['tr_number'];
$oc_number = $data['oc_number'];
$invoice_date = $data['invoice_date'];
$tax = $data['tax'];
$total = $data['subtotal'];
$created_at = $data['created_at'];
$updated_at = $data['updated_at'];
$old_product_id = [];
$product_sale = [];
foreach ($lims_product_sale_data as $key => $product_sale_data) {
$old_product_id[] = $product_sale_data->product_id;
$old_product_variant_id[] = null;
$lims_product_data = Product::find($product_sale_data->product_id);
if( ($lims_sale_data->sale_status == 1) && ($lims_product_data->type == 'combo') ) {
$product_list = explode(",", $lims_product_data->product_list);
$qty_list = explode(",", $lims_product_data->qty_list);
foreach ($product_list as $index=>$child_id) {
$child_data = Product::find($child_id);
$child_warehouse_data = Product_Warehouse::where([
['product_id', $child_id],
['warehouse_id', $lims_sale_data->warehouse_id ],
])->first();
$child_data->qty += $product_sale_data->qty * $qty_list[$index];
$child_warehouse_data->qty += $product_sale_data->qty * $qty_list[$index];
$child_data->save();
$child_warehouse_data->save();
}
}
elseif( ($lims_sale_data->sale_status == 1) && ($product_sale_data->sale_unit_id != 0)) {
$old_product_qty = $product_sale_data->qty;
$lims_sale_unit_data = Unit::find($product_sale_data->sale_unit_id);
if ($lims_sale_unit_data->operator == '*')
$old_product_qty = $old_product_qty * $lims_sale_unit_data->operation_value;
else
$old_product_qty = $old_product_qty / $lims_sale_unit_data->operation_value;
if($product_sale_data->variant_id) {
$lims_product_variant_data = ProductVariant::select('id', 'qty')->FindExactProduct($product_sale_data->product_id, $product_sale_data->variant_id)->first();
$lims_product_warehouse_data = Product_Warehouse::FindProductWithVariant($product_sale_data->product_id, $product_sale_data->variant_id, $lims_sale_data->warehouse_id)
->first();
$old_product_variant_id[$key] = $lims_product_variant_data->id;
$lims_product_variant_data->qty += $old_product_qty;
$lims_product_variant_data->save();
}
else
$lims_product_warehouse_data = Product_Warehouse::FindProductWithoutVariant($product_sale_data->product_id, $lims_sale_data->warehouse_id)
->first();
$lims_product_data->qty += $old_product_qty;
$lims_product_warehouse_data->qty += $old_product_qty;
$lims_product_data->save();
$lims_product_warehouse_data->save();
}
if($product_sale_data->variant_id && !(in_array($old_product_variant_id[$key], $product_variant_id)) ){
$product_sale_data->delete();
}
elseif( !(in_array($old_product_id[$key], $product_id)) )
$product_sale_data->delete();
}
foreach ($product_id as $key => $pro_id) {
$lims_product_data = Product::find($pro_id);
$product_sale['variant_id'] = null;
if($lims_product_data->type == 'combo' && $data['sale_status'] == 1){
$product_list = explode(",", $lims_product_data->product_list);
$qty_list = explode(",", $lims_product_data->qty_list);
foreach ($product_list as $index=>$child_id) {
$child_data = Product::find($child_id);
$child_warehouse_data = Product_Warehouse::where([
['product_id', $child_id],
['warehouse_id', $data['warehouse_id'] ],
])->first();
$child_data->qty -= $qty[$key] * $qty_list[$index];
$child_warehouse_data->qty -= $qty[$key] * $qty_list[$index];
$child_data->save();
$child_warehouse_data->save();
}
}
if($sale_unit[$key] != 'n/a') {
$lims_sale_unit_data = Unit::where('unit_name', $sale_unit[$key])->first();
$sale_unit_id = $lims_sale_unit_data->id;
if($data['sale_status'] == 1) {
$new_product_qty = $qty[$key];
if ($lims_sale_unit_data->operator == '*') {
$new_product_qty = $new_product_qty * $lims_sale_unit_data->operation_value;
} else {
$new_product_qty = $new_product_qty / $lims_sale_unit_data->operation_value;
}
if($lims_product_data->is_variant) {
$lims_product_variant_data = ProductVariant::select('id', 'variant_id', 'qty')->FindExactProductWithCode($pro_id, $product_code[$key])->first();
$lims_product_warehouse_data = Product_Warehouse::FindProductWithVariant($pro_id, $lims_product_variant_data->variant_id, $data['warehouse_id'])
->first();
$product_sale['variant_id'] = $lims_product_variant_data->variant_id;
$lims_product_variant_data->qty -= $new_product_qty;
$lims_product_variant_data->save();
}
else {
$lims_product_warehouse_data = Product_Warehouse::FindProductWithoutVariant($pro_id, $data['warehouse_id'])
->first();
}
$lims_product_data->qty -= $new_product_qty;
$lims_product_warehouse_data->qty -= $new_product_qty;
$lims_product_data->save();
$lims_product_warehouse_data->save();
}
}
else
$sale_unit_id = 0;
//collecting mail data
if($product_sale['variant_id']) {
$variant_data = Variant::select('name')->find($product_sale['variant_id']);
$mail_data['products'][$key] = $lims_product_data->name . ' [' . $variant_data->name . ']';
}
else
$mail_data['products'][$key] = $lims_product_data->name;
if($lims_product_data->type == 'digital')
$mail_data['file'][$key] = url('/public/product/files').'/'.$lims_product_data->file;
else
$mail_data['file'][$key] = '';
if($sale_unit_id)
$mail_data['unit'][$key] = $lims_sale_unit_data->unit_code;
else
$mail_data['unit'][$key] = '';
$product_sale['sale_id'] = $id ;
$product_sale['product_id'] = $pro_id;
$product_sale['qty'] = $mail_data['qty'][$key] = $qty[$key];
$product_sale['sale_unit_id'] = $sale_unit_id;
$product_sale['net_unit_price'] = $net_unit_price[$key];
$product_sale['discount'] = $discount[$key];
$product_sale['serial_number'] = $serial_number[$key];
$product_sale['batch_number'] = $batch_number[$key];
$product_sale['invoice_number'] = $invoice_number[$key];
$product_sale['tr_number'] = $tr_number[$key];
$product_sale['oc_number'] = $oc_number[$key];
$product_sale['invoice_date'] = isset($invoice_date[$key]) ? Carbon::createFromFormat($date_format->date_format, $invoice_date[$key]) : null;
$product_sale['tax_rate'] = $tax_rate[$key];
$product_sale['tax'] = $tax[$key];
$product_sale['total'] = $mail_data['total'][$key] = $total[$key];
$product_sale['created_at'] = $created_at;
$product_sale['updated_at'] = $updated_at;
if($product_sale['variant_id'] && in_array($product_variant_id[$key], $old_product_variant_id)) {
Product_Sale::where([
['product_id', $pro_id],
['variant_id', $product_sale['variant_id']],
['sale_id', $id]
])->update($product_sale);
}
elseif( $product_sale['variant_id'] === null && (in_array($pro_id, $old_product_id)) ) {
Product_Sale::where([
['sale_id', $id],
['product_id', $pro_id]
])->update($product_sale);
}
else
Product_Sale::create($product_sale);
}
$lims_sale_data->update($data);
$lims_customer_data = Customer::find($data['customer_id']);
$message = 'Sale updated successfully';
//collecting mail data
if($lims_customer_data->email){
$mail_data['email'] = $lims_customer_data->email;
$mail_data['reference_no'] = $lims_sale_data->reference_no;
$mail_data['sale_status'] = $lims_sale_data->sale_status;
$mail_data['payment_status'] = $lims_sale_data->payment_status;
$mail_data['total_qty'] = $lims_sale_data->total_qty;
$mail_data['total_price'] = $lims_sale_data->total_price;
$mail_data['order_tax'] = $lims_sale_data->order_tax;
$mail_data['order_tax_rate'] = $lims_sale_data->order_tax_rate;
$mail_data['order_discount'] = $lims_sale_data->order_discount;
$mail_data['shipping_cost'] = $lims_sale_data->shipping_cost;
$mail_data['grand_total'] = $lims_sale_data->grand_total;
$mail_data['paid_amount'] = $lims_sale_data->paid_amount;
if($mail_data['email']){
try{
Mail::send( 'mail.sale_details', $mail_data, function( $message ) use ($mail_data)
{
$message->to( $mail_data['email'] )->subject( 'Sale Details' );
});
}
catch(\Exception $e){
$message = 'Sale updated successfully. Please setup your <a href="setting/mail_setting">mail setting</a> to send mail.';
}
}
}
return redirect('return-sale')->with('message', $message);
}
public function printLastReciept()
{
$sale = Sale::where('sale_status', 1)->latest()->first();
return redirect()->route('sale.invoice', $sale->id);
}
public function genInvoice($id)
{
$lims_sale_data = Sale::find($id);
$lims_product_sale_data = Product_Sale::where('sale_id', $id)->get();
$lims_biller_data = Biller::find($lims_sale_data->biller_id);
$lims_warehouse_data = Warehouse::find($lims_sale_data->warehouse_id);
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
$lims_payment_data = Payment::where('sale_id', $id)->get();
$numberInWords = N2W::toWords($lims_sale_data->grand_total);
$limit_code = [];
foreach($lims_product_sale_data as $product_sale_data){
$lims_product_data = Product::find($product_sale_data->product_id);
if($product_sale_data->variant_id) {
$variant_data = Variant::find($product_sale_data->variant_id);
$lims_product_data->name = $variant_data->name;
}
$string_code = $lims_product_data->name.' [Số lượng: '.$product_sale_data->qty.']';
array_push($limit_code, $string_code);
}
return view('return.invoice', compact('lims_sale_data', 'lims_product_sale_data', 'lims_biller_data', 'lims_warehouse_data', 'lims_customer_data', 'lims_payment_data', 'numberInWords', 'limit_code'));
}
public function addPayment(Request $request)
{
$data = $request->all();
if(!$data['amount'])
$data['amount'] = 0;
$lims_sale_data = Sale::find($data['sale_id']);
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
$lims_sale_data->paid_amount += $data['amount'];
$balance = $lims_sale_data->grand_total - $lims_sale_data->paid_amount;
if($balance > 0 || $balance < 0)
$lims_sale_data->payment_status = 2;
elseif ($balance == 0)
$lims_sale_data->payment_status = 4;
if($data['paid_by_id'] == 1)
$paying_method = 'Cash';
elseif ($data['paid_by_id'] == 2)
$paying_method = 'Gift Card';
elseif ($data['paid_by_id'] == 3)
$paying_method = 'Credit Card';
elseif($data['paid_by_id'] == 4)
$paying_method = 'Cheque';
elseif($data['paid_by_id'] == 5)
$paying_method = 'Paypal';
else
$paying_method = 'Deposit';
$cash_register_data = CashRegister::where([
['user_id', Auth::id()],
['warehouse_id', $lims_sale_data->warehouse_id],
['status', true]
])->first();
$lims_payment_data = new Payment();
$lims_payment_data->user_id = Auth::id();
$lims_payment_data->sale_id = $lims_sale_data->id;
if($cash_register_data)
$lims_payment_data->cash_register_id = $cash_register_data->id;
$lims_payment_data->account_id = $data['account_id'];
$data['payment_reference'] = 'spr-' . date("Ymd") . '-'. date("his");
$lims_payment_data->payment_reference = $data['payment_reference'];
$lims_payment_data->amount = $data['amount'];
$lims_payment_data->change = $data['paying_amount'] - $data['amount'];
$lims_payment_data->paying_method = $paying_method;
$lims_payment_data->payment_note = $data['payment_note'];
$lims_payment_data->save();
$lims_sale_data->save();
$lims_payment_data = Payment::latest()->first();
$data['payment_id'] = $lims_payment_data->id;
if($paying_method == 'Gift Card'){
$lims_gift_card_data = GiftCard::find($data['gift_card_id']);
$lims_gift_card_data->expense += $data['amount'];
$lims_gift_card_data->save();
PaymentWithGiftCard::create($data);
}
elseif($paying_method == 'Credit Card'){
$lims_pos_setting_data = PosSetting::latest()->first();
Stripe::setApiKey($lims_pos_setting_data->stripe_secret_key);
$token = $data['stripeToken'];
$amount = $data['amount'];
$lims_payment_with_credit_card_data = PaymentWithCreditCard::where('customer_id', $lims_sale_data->customer_id)->first();
if(!$lims_payment_with_credit_card_data) {
// Create a Customer:
$customer = \Stripe\Customer::create([
'source' => $token
]);
// Charge the Customer instead of the card:
$charge = \Stripe\Charge::create([
'amount' => $amount * 100,
'currency' => 'usd',
'customer' => $customer->id,
]);
$data['customer_stripe_id'] = $customer->id;
}
else {
$customer_id =
$lims_payment_with_credit_card_data->customer_stripe_id;
$charge = \Stripe\Charge::create([
'amount' => $amount * 100,
'currency' => 'usd',
'customer' => $customer_id, // Previously stored, then retrieved
]);
$data['customer_stripe_id'] = $customer_id;
}
$data['customer_id'] = $lims_sale_data->customer_id;
$data['charge_id'] = $charge->id;
PaymentWithCreditCard::create($data);
}
elseif ($paying_method == 'Cheque') {
PaymentWithCheque::create($data);
}
elseif ($paying_method == 'Paypal') {
$provider = new ExpressCheckout;
$paypal_data['items'] = [];
$paypal_data['items'][] = [
'name' => 'Paid Amount',
'price' => $data['amount'],
'qty' => 1
];
$paypal_data['invoice_id'] = $lims_payment_data->payment_reference;
$paypal_data['invoice_description'] = "Reference: {$paypal_data['invoice_id']}";
$paypal_data['return_url'] = url('/sale/paypalPaymentSuccess/'.$lims_payment_data->id);
$paypal_data['cancel_url'] = url('/sale');
$total = 0;
foreach($paypal_data['items'] as $item) {
$total += $item['price']*$item['qty'];
}
$paypal_data['total'] = $total;
$response = $provider->setExpressCheckout($paypal_data);
return redirect($response['paypal_link']);
}
elseif ($paying_method == 'Deposit') {
$lims_customer_data->expense += $data['amount'];
$lims_customer_data->save();
}
$message = 'Payment created successfully';
if($lims_customer_data->email){
$mail_data['email'] = $lims_customer_data->email;
$mail_data['sale_reference'] = $lims_sale_data->reference_no;
$mail_data['payment_reference'] = $lims_payment_data->payment_reference;
$mail_data['payment_method'] = $lims_payment_data->paying_method;
$mail_data['grand_total'] = $lims_sale_data->grand_total;
$mail_data['paid_amount'] = $lims_payment_data->amount;
try{
Mail::send( 'mail.payment_details', $mail_data, function( $message ) use ($mail_data)
{
$message->to( $mail_data['email'] )->subject( 'Payment Details' );
});
}
catch(\Exception $e){
$message = 'Payment created successfully. Please setup your <a href="setting/mail_setting">mail setting</a> to send mail.';
}
}
return redirect('sales')->with('message', $message);
}
public function getPayment($id)
{
$lims_payment_list = Payment::where('sale_id', $id)->get();
$date = [];
$payment_reference = [];
$paid_amount = [];
$paying_method = [];
$payment_id = [];
$payment_note = [];
$gift_card_id = [];
$cheque_no = [];
$change = [];
$paying_amount = [];
$account_name = [];
$account_id = [];
foreach ($lims_payment_list as $payment) {
$date[] = date(config('date_format'), strtotime($payment->created_at->toDateString())) . ' '. $payment->created_at->toTimeString();
$payment_reference[] = $payment->payment_reference;
$paid_amount[] = $payment->amount;
$change[] = $payment->change;
$paying_method[] = $payment->paying_method;
$paying_amount[] = $payment->amount + $payment->change;
if($payment->paying_method == 'Gift Card'){
$lims_payment_gift_card_data = PaymentWithGiftCard::where('payment_id',$payment->id)->first();
$gift_card_id[] = $lims_payment_gift_card_data->gift_card_id;
}
elseif($payment->paying_method == 'Cheque'){
$lims_payment_cheque_data = PaymentWithCheque::where('payment_id',$payment->id)->first();
$cheque_no[] = $lims_payment_cheque_data->cheque_no;
}
else{
$cheque_no[] = $gift_card_id[] = null;
}
$payment_id[] = $payment->id;
$payment_note[] = $payment->payment_note;
$lims_account_data = Account::find($payment->account_id);
$account_name[] = $lims_account_data->name;
$account_id[] = $lims_account_data->id;
}
$payments[] = $date;
$payments[] = $payment_reference;
$payments[] = $paid_amount;
$payments[] = $paying_method;
$payments[] = $payment_id;
$payments[] = $payment_note;
$payments[] = $cheque_no;
$payments[] = $gift_card_id;
$payments[] = $change;
$payments[] = $paying_amount;
$payments[] = $account_name;
$payments[] = $account_id;
return $payments;
}
public function updatePayment(Request $request)
{
$data = $request->all();
$lims_payment_data = Payment::find($data['payment_id']);
$lims_sale_data = Sale::find($lims_payment_data->sale_id);
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
//updating sale table
$amount_dif = $lims_payment_data->amount - $data['edit_amount'];
$lims_sale_data->paid_amount = $lims_sale_data->paid_amount - $amount_dif;
$balance = $lims_sale_data->grand_total - $lims_sale_data->paid_amount;
if($balance > 0 || $balance < 0)
$lims_sale_data->payment_status = 2;
elseif ($balance == 0)
$lims_sale_data->payment_status = 4;
$lims_sale_data->save();
if($lims_payment_data->paying_method == 'Deposit'){
$lims_customer_data->expense -= $lims_payment_data->amount;
$lims_customer_data->save();
}
if($data['edit_paid_by_id'] == 1)
$lims_payment_data->paying_method = 'Cash';
elseif ($data['edit_paid_by_id'] == 2){
if($lims_payment_data->paying_method == 'Gift Card'){
$lims_payment_gift_card_data = PaymentWithGiftCard::where('payment_id', $data['payment_id'])->first();
$lims_gift_card_data = GiftCard::find($lims_payment_gift_card_data->gift_card_id);
$lims_gift_card_data->expense -= $lims_payment_data->amount;
$lims_gift_card_data->save();
$lims_gift_card_data = GiftCard::find($data['gift_card_id']);
$lims_gift_card_data->expense += $data['edit_amount'];
$lims_gift_card_data->save();
$lims_payment_gift_card_data->gift_card_id = $data['gift_card_id'];
$lims_payment_gift_card_data->save();
}
else{
$lims_payment_data->paying_method = 'Gift Card';
$lims_gift_card_data = GiftCard::find($data['gift_card_id']);
$lims_gift_card_data->expense += $data['edit_amount'];
$lims_gift_card_data->save();
PaymentWithGiftCard::create($data);
}
}
elseif ($data['edit_paid_by_id'] == 3){
$lims_pos_setting_data = PosSetting::latest()->first();
Stripe::setApiKey($lims_pos_setting_data->stripe_secret_key);
if($lims_payment_data->paying_method == 'Credit Card'){
$lims_payment_with_credit_card_data = PaymentWithCreditCard::where('payment_id', $lims_payment_data->id)->first();
\Stripe\Refund::create(array(
"charge" => $lims_payment_with_credit_card_data->charge_id,
));
$customer_id =
$lims_payment_with_credit_card_data->customer_stripe_id;
$charge = \Stripe\Charge::create([
'amount' => $data['edit_amount'] * 100,
'currency' => 'usd',
'customer' => $customer_id
]);
$lims_payment_with_credit_card_data->charge_id = $charge->id;
$lims_payment_with_credit_card_data->save();
}
else{
$token = $data['stripeToken'];
$amount = $data['edit_amount'];
$lims_payment_with_credit_card_data = PaymentWithCreditCard::where('customer_id', $lims_sale_data->customer_id)->first();
if(!$lims_payment_with_credit_card_data) {
$customer = \Stripe\Customer::create([
'source' => $token
]);
$charge = \Stripe\Charge::create([
'amount' => $amount * 100,
'currency' => 'usd',
'customer' => $customer->id,
]);
$data['customer_stripe_id'] = $customer->id;
}
else {
$customer_id =
$lims_payment_with_credit_card_data->customer_stripe_id;
$charge = \Stripe\Charge::create([
'amount' => $amount * 100,
'currency' => 'usd',
'customer' => $customer_id
]);
$data['customer_stripe_id'] = $customer_id;
}
$data['customer_id'] = $lims_sale_data->customer_id;
$data['charge_id'] = $charge->id;
PaymentWithCreditCard::create($data);
}
$lims_payment_data->paying_method = 'Credit Card';
}
elseif($data['edit_paid_by_id'] == 4){
if($lims_payment_data->paying_method == 'Cheque'){
$lims_payment_cheque_data = PaymentWithCheque::where('payment_id', $data['payment_id'])->first();
$lims_payment_cheque_data->cheque_no = $data['edit_cheque_no'];
$lims_payment_cheque_data->save();
}
else{
$lims_payment_data->paying_method = 'Cheque';
$data['cheque_no'] = $data['edit_cheque_no'];
PaymentWithCheque::create($data);
}
}
elseif($data['edit_paid_by_id'] == 5){
//updating payment data
$lims_payment_data->amount = $data['edit_amount'];
$lims_payment_data->paying_method = 'Paypal';
$lims_payment_data->payment_note = $data['edit_payment_note'];
$lims_payment_data->save();
$provider = new ExpressCheckout;
$paypal_data['items'] = [];
$paypal_data['items'][] = [
'name' => 'Paid Amount',
'price' => $data['edit_amount'],
'qty' => 1
];
$paypal_data['invoice_id'] = $lims_payment_data->payment_reference;
$paypal_data['invoice_description'] = "Reference: {$paypal_data['invoice_id']}";
$paypal_data['return_url'] = url('/sale/paypalPaymentSuccess/'.$lims_payment_data->id);
$paypal_data['cancel_url'] = url('/sale');
$total = 0;
foreach($paypal_data['items'] as $item) {
$total += $item['price']*$item['qty'];
}
$paypal_data['total'] = $total;
$response = $provider->setExpressCheckout($paypal_data);
return redirect($response['paypal_link']);
}
else{
$lims_payment_data->paying_method = 'Deposit';
$lims_customer_data->expense += $data['edit_amount'];
$lims_customer_data->save();
}
//updating payment data
$lims_payment_data->account_id = $data['account_id'];
$lims_payment_data->amount = $data['edit_amount'];
$lims_payment_data->change = $data['edit_paying_amount'] - $data['edit_amount'];
$lims_payment_data->payment_note = $data['edit_payment_note'];
$lims_payment_data->save();
$message = 'Payment updated successfully';
//collecting male data
if($lims_customer_data->email){
$mail_data['email'] = $lims_customer_data->email;
$mail_data['sale_reference'] = $lims_sale_data->reference_no;
$mail_data['payment_reference'] = $lims_payment_data->payment_reference;
$mail_data['payment_method'] = $lims_payment_data->paying_method;
$mail_data['grand_total'] = $lims_sale_data->grand_total;
$mail_data['paid_amount'] = $lims_payment_data->amount;
try{
Mail::send( 'mail.payment_details', $mail_data, function( $message ) use ($mail_data)
{
$message->to( $mail_data['email'] )->subject( 'Payment Details' );
});
}
catch(\Exception $e){
$message = 'Payment updated successfully. Please setup your <a href="setting/mail_setting">mail setting</a> to send mail.';
}
}
return redirect('sales')->with('message', $message);
}
public function deletePayment(Request $request)
{
$lims_payment_data = Payment::find($request['id']);
$lims_sale_data = Sale::where('id', $lims_payment_data->sale_id)->first();
$lims_sale_data->paid_amount -= $lims_payment_data->amount;
$balance = $lims_sale_data->grand_total - $lims_sale_data->paid_amount;
if($balance > 0 || $balance < 0)
$lims_sale_data->payment_status = 2;
elseif ($balance == 0)
$lims_sale_data->payment_status = 4;
$lims_sale_data->save();
if ($lims_payment_data->paying_method == 'Gift Card') {
$lims_payment_gift_card_data = PaymentWithGiftCard::where('payment_id', $request['id'])->first();
$lims_gift_card_data = GiftCard::find($lims_payment_gift_card_data->gift_card_id);
$lims_gift_card_data->expense -= $lims_payment_data->amount;
$lims_gift_card_data->save();
$lims_payment_gift_card_data->delete();
}
elseif($lims_payment_data->paying_method == 'Credit Card'){
$lims_payment_with_credit_card_data = PaymentWithCreditCard::where('payment_id', $request['id'])->first();
$lims_pos_setting_data = PosSetting::latest()->first();
Stripe::setApiKey($lims_pos_setting_data->stripe_secret_key);
\Stripe\Refund::create(array(
"charge" => $lims_payment_with_credit_card_data->charge_id,
));
$lims_payment_with_credit_card_data->delete();
}
elseif ($lims_payment_data->paying_method == 'Cheque') {
$lims_payment_cheque_data = PaymentWithCheque::where('payment_id', $request['id'])->first();
$lims_payment_cheque_data->delete();
}
elseif ($lims_payment_data->paying_method == 'Paypal') {
$lims_payment_paypal_data = PaymentWithPaypal::where('payment_id', $request['id'])->first();
if($lims_payment_paypal_data){
$provider = new ExpressCheckout;
$response = $provider->refundTransaction($lims_payment_paypal_data->transaction_id);
$lims_payment_paypal_data->delete();
}
}
elseif ($lims_payment_data->paying_method == 'Deposit'){
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
$lims_customer_data->expense -= $lims_payment_data->amount;
$lims_customer_data->save();
}
$lims_payment_data->delete();
return redirect('sales')->with('not_permitted', 'Payment deleted successfully');
}
public function todaySale()
{
$data['total_sale_amount'] = Sale::whereDate('created_at', date("Y-m-d"))->sum('grand_total');
$data['total_payment'] = Payment::whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['cash_payment'] = Payment::where([
['paying_method', 'Cash']
])->whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['credit_card_payment'] = Payment::where([
['paying_method', 'Credit Card']
])->whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['gift_card_payment'] = Payment::where([
['paying_method', 'Gift Card']
])->whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['cheque_payment'] = Payment::where([
['paying_method', 'Cheque']
])->whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['paypal_payment'] = Payment::where([
['paying_method', 'Paypal']
])->whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['total_sale_return'] = Returns::whereDate('created_at', date("Y-m-d"))->sum('grand_total');
$data['total_expense'] = Expense::whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['total_cash'] = $data['total_payment'] - ($data['total_sale_return'] + $data['total_expense']);
return $data;
}
public function todayProfit($warehouse_id)
{
if($warehouse_id == 0)
$product_sale_data = Product_Sale::select(DB::raw('product_id, sum(qty) as sold_qty, sum(total) as sold_amount'))->whereDate('created_at', date("Y-m-d"))->groupBy('product_id')->get();
else
$product_sale_data = Sale::join('product_sales', 'sales.id', '=', 'product_sales.sale_id')
->select(DB::raw('product_sales.product_id, sum(product_sales.qty) as sold_qty, sum(product_sales.total) as sold_amount'))
->where('sales.warehouse_id', $warehouse_id)->whereDate('sales.created_at', date("Y-m-d"))
->groupBy('product_sales.product_id')->get();
$product_revenue = 0;
$product_cost = 0;
$profit = 0;
foreach ($product_sale_data as $key => $product_sale) {
if($warehouse_id == 0)
$product_purchase_data = ProductPurchase::where('product_id', $product_sale->product_id)->get();
else
$product_purchase_data = Purchase::join('product_purchases', 'purchases.id', '=', 'product_purchases.purchase_id')
->where([
['product_purchases.product_id', $product_sale->product_id],
['purchases.warehouse_id', $warehouse_id]
])->select('product_purchases.*')->get();
$purchased_qty = 0;
$purchased_amount = 0;
$sold_qty = $product_sale->sold_qty;
$product_revenue += $product_sale->sold_amount;
foreach ($product_purchase_data as $key => $product_purchase) {
$purchased_qty += $product_purchase->qty;
$purchased_amount += $product_purchase->total;
if($purchased_qty >= $sold_qty) {
$qty_diff = $purchased_qty - $sold_qty;
$unit_cost = $product_purchase->total / $product_purchase->qty;
$purchased_amount -= ($qty_diff * $unit_cost);
break;
}
}
$product_cost += $purchased_amount;
$profit += $product_sale->sold_amount - $purchased_amount;
}
$data['product_revenue'] = $product_revenue;
$data['product_cost'] = $product_cost;
if($warehouse_id == 0)
$data['expense_amount'] = Expense::whereDate('created_at', date("Y-m-d"))->sum('amount');
else
$data['expense_amount'] = Expense::where('warehouse_id', $warehouse_id)->whereDate('created_at', date("Y-m-d"))->sum('amount');
$data['profit'] = $profit - $data['expense_amount'];
return $data;
}
public function deleteBySelection(Request $request)
{
$sale_id = $request['saleIdArray'];
foreach ($sale_id as $id) {
$lims_sale_data = Sale::find($id);
$lims_product_sale_data = Product_Sale::where('sale_id', $id)->get();
$lims_delivery_data = Delivery::where('sale_id',$id)->first();
if($lims_sale_data->sale_status == 3)
$message = 'Draft deleted successfully';
else
$message = 'Sale deleted successfully';
foreach ($lims_product_sale_data as $product_sale) {
$lims_product_data = Product::find($product_sale->product_id);
//adjust product quantity
if( ($lims_sale_data->sale_status == 1) && ($lims_product_data->type == 'combo') ){
$product_list = explode(",", $lims_product_data->product_list);
$qty_list = explode(",", $lims_product_data->qty_list);
foreach ($product_list as $index=>$child_id) {
$child_data = Product::find($child_id);
$child_warehouse_data = Product_Warehouse::where([
['product_id', $child_id],
['warehouse_id', $lims_sale_data->warehouse_id ],
])->first();
$child_data->qty += $product_sale->qty * $qty_list[$index];
$child_warehouse_data->qty += $product_sale->qty * $qty_list[$index];
$child_data->save();
$child_warehouse_data->save();
}
}
elseif(($lims_sale_data->sale_status == 1) && ($product_sale->sale_unit_id != 0)){
$lims_sale_unit_data = Unit::find($product_sale->sale_unit_id);
if ($lims_sale_unit_data->operator == '*')
$product_sale->qty = $product_sale->qty * $lims_sale_unit_data->operation_value;
else
$product_sale->qty = $product_sale->qty / $lims_sale_unit_data->operation_value;
if($product_sale->variant_id) {
$lims_product_variant_data = ProductVariant::select('id', 'qty')->FindExactProduct($lims_product_data->id, $product_sale->variant_id)->first();
$lims_product_warehouse_data = Product_Warehouse::FindProductWithVariant($lims_product_data->id, $product_sale->variant_id, $lims_sale_data->warehouse_id)->first();
$lims_product_variant_data->qty += $product_sale->qty;
$lims_product_variant_data->save();
}
else {
$lims_product_warehouse_data = Product_Warehouse::FindProductWithoutVariant($lims_product_data->id, $lims_sale_data->warehouse_id)->first();
}
$lims_product_data->qty += $product_sale->qty;
$lims_product_warehouse_data->qty += $product_sale->qty;
$lims_product_data->save();
$lims_product_warehouse_data->save();
}
$product_sale->delete();
}
$lims_payment_data = Payment::where('sale_id', $id)->get();
foreach ($lims_payment_data as $payment) {
if($payment->paying_method == 'Gift Card'){
$lims_payment_with_gift_card_data = PaymentWithGiftCard::where('payment_id', $payment->id)->first();
$lims_gift_card_data = GiftCard::find($lims_payment_with_gift_card_data->gift_card_id);
$lims_gift_card_data->expense -= $payment->amount;
$lims_gift_card_data->save();
$lims_payment_with_gift_card_data->delete();
}
elseif($payment->paying_method == 'Cheque'){
$lims_payment_cheque_data = PaymentWithCheque::where('payment_id', $payment->id)->first();
$lims_payment_cheque_data->delete();
}
elseif($payment->paying_method == 'Credit Card'){
$lims_payment_with_credit_card_data = PaymentWithCreditCard::where('payment_id', $payment->id)->first();
$lims_payment_with_credit_card_data->delete();
}
elseif($payment->paying_method == 'Paypal'){
$lims_payment_paypal_data = PaymentWithPaypal::where('payment_id', $payment->id)->first();
if($lims_payment_paypal_data)
$lims_payment_paypal_data->delete();
}
elseif($payment->paying_method == 'Deposit'){
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
$lims_customer_data->expense -= $payment->amount;
$lims_customer_data->save();
}
$payment->delete();
}
if($lims_delivery_data)
$lims_delivery_data->delete();
if($lims_sale_data->coupon_id) {
$lims_coupon_data = Coupon::find($lims_sale_data->coupon_id);
$lims_coupon_data->used -= 1;
$lims_coupon_data->save();
}
$lims_sale_data->delete();
}
return 'Sale deleted successfully!';
}
public function destroy($id)
{
$url = url()->previous();
$lims_sale_data = Sale::find($id);
$lims_product_sale_data = Product_Sale::where('sale_id', $id)->get();
$lims_delivery_data = Delivery::where('sale_id',$id)->first();
if($lims_sale_data->sale_status == 3)
$message = 'Draft deleted successfully';
else
$message = 'Sale deleted successfully';
foreach ($lims_product_sale_data as $product_sale) {
$lims_product_data = Product::find($product_sale->product_id);
//adjust product quantity
if( ($lims_sale_data->sale_status == 1) && ($lims_product_data->type == 'combo') ){
$product_list = explode(",", $lims_product_data->product_list);
$qty_list = explode(",", $lims_product_data->qty_list);
foreach ($product_list as $index=>$child_id) {
$child_data = Product::find($child_id);
$child_warehouse_data = Product_Warehouse::where([
['product_id', $child_id],
['warehouse_id', $lims_sale_data->warehouse_id ],
])->first();
$child_data->qty += $product_sale->qty * $qty_list[$index];
$child_warehouse_data->qty += $product_sale->qty * $qty_list[$index];
$child_data->save();
$child_warehouse_data->save();
}
}
elseif(($lims_sale_data->sale_status == 1) && ($product_sale->sale_unit_id != 0)){
$lims_sale_unit_data = Unit::find($product_sale->sale_unit_id);
if ($lims_sale_unit_data->operator == '*')
$product_sale->qty = $product_sale->qty * $lims_sale_unit_data->operation_value;
else
$product_sale->qty = $product_sale->qty / $lims_sale_unit_data->operation_value;
if($product_sale->variant_id) {
$lims_product_variant_data = ProductVariant::select('id', 'qty')->FindExactProduct($lims_product_data->id, $product_sale->variant_id)->first();
$lims_product_warehouse_data = Product_Warehouse::FindProductWithVariant($lims_product_data->id, $product_sale->variant_id, $lims_sale_data->warehouse_id)->first();
$lims_product_variant_data->qty += $product_sale->qty;
$lims_product_variant_data->save();
}
else {
$lims_product_warehouse_data = Product_Warehouse::FindProductWithoutVariant($lims_product_data->id, $lims_sale_data->warehouse_id)->first();
}
$lims_product_data->qty += $product_sale->qty;
$lims_product_warehouse_data->qty += $product_sale->qty;
$lims_product_data->save();
$lims_product_warehouse_data->save();
}
$product_sale->delete();
}
$lims_payment_data = Payment::where('sale_id', $id)->get();
foreach ($lims_payment_data as $payment) {
if($payment->paying_method == 'Gift Card'){
$lims_payment_with_gift_card_data = PaymentWithGiftCard::where('payment_id', $payment->id)->first();
$lims_gift_card_data = GiftCard::find($lims_payment_with_gift_card_data->gift_card_id);
$lims_gift_card_data->expense -= $payment->amount;
$lims_gift_card_data->save();
$lims_payment_with_gift_card_data->delete();
}
elseif($payment->paying_method == 'Cheque'){
$lims_payment_cheque_data = PaymentWithCheque::where('payment_id', $payment->id)->first();
$lims_payment_cheque_data->delete();
}
elseif($payment->paying_method == 'Credit Card'){
$lims_payment_with_credit_card_data = PaymentWithCreditCard::where('payment_id', $payment->id)->first();
$lims_payment_with_credit_card_data->delete();
}
elseif($payment->paying_method == 'Paypal'){
$lims_payment_paypal_data = PaymentWithPaypal::where('payment_id', $payment->id)->first();
if($lims_payment_paypal_data)
$lims_payment_paypal_data->delete();
}
elseif($payment->paying_method == 'Deposit'){
$lims_customer_data = Customer::find($lims_sale_data->customer_id);
$lims_customer_data->expense -= $payment->amount;
$lims_customer_data->save();
}
$payment->delete();
}
if($lims_delivery_data)
$lims_delivery_data->delete();
if($lims_sale_data->coupon_id) {
$lims_coupon_data = Coupon::find($lims_sale_data->coupon_id);
$lims_coupon_data->used -= 1;
$lims_coupon_data->save();
}
$lims_sale_data->delete();
return Redirect::to($url)->with('not_permitted', $message);
}
}