<?php

namespace App\Http\Controllers;
use App\CashBook;
use App\CostofGoodsSoldAccounts;
use App\CustomerAccounts;
use App\CustomerProfile;
use App\Inventory;
use App\ProductPriceList;
use App\SalesAccounts;
use App\SalesDetails;
use App\SalesDiscountAccount;
use App\SalesOrder;
use App\sales_temtable;
use App\VatAccounts;
use Auth;
use DateTime;
use DateTimezone;
use DB;
use Illuminate\Http\Request;
use Session;

class SalesController extends Controller {

	public function index() {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_add')) {
			$crud              = new \App\Library\Crud;
			$CustomerAccounts  = $crud->Getvalue('CustomerAccounts');
			$customer_category = $crud->Getvalue('CustomerCategory');
			$payments          = $crud->Getvalue('TransactionTerm');
			//return dump($customer_category);
			$pre_order_no = SalesOrder::select('order_id')->where('order_type', '=', 'preorder')->orderBy('id', 'DESC')->first();
			$customers    = CustomerProfile::get();

			$available_items = DB::table('inventories')
			->join('product_profiles', 'inventories.product_id', 'product_profiles.id')
			->where('available', '>', 0)->get();
			$products = DB::table('product_profiles')
			->join('inventories', 'inventories.product_id', '=', 'product_profiles.id')
			->select('product_profiles.id', 'product_profiles.name')
			->orderBy('allocated', 'DESC')
			->limit(20)
			->get();
			$sales_temtable = sales_temtable::where('employee_id', Auth::user()->id)->get();

			//dump($products);
			exit();
			return view('sales.index', compact('customers', 'payments', 'pre_order_no', 'sales_temtable', 'available_items', 'customer_category', 'CustomerAccounts'));
		} else {
			return "Sorry you don't have access to this action";
		}
	}

	//Customer search for sales
	public function customer_for_sales(Request $request) {
		$customers = CustomerProfile::select('id', 'name')->get();
		return json_encode($customers);
	}

	public function search() {

		$search_result = DB::table('product_price_lists')
		->join('inventories', 'inventories.product_id', '=', 'product_price_lists.product_id')
		->where('inventories.available', '>', 0)
		->where('product_price_lists.status', 1)
		->groupBy('product_price_lists.product_id')
		->get();
		echo json_encode($search_result);
	}

	public function fetch_product(Request $request) {

		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_add')) {

			$price_info_array     = array();
			$product_pricelist_id = array();
			$available_product    = Inventory::where('product_id', $request->id)->first();
			if (!empty($available_product)) {

				if ($available_product->available >= $request->quantity) {

					$price_info = ProductPriceList::where('product_id', $request->id)->where('status', 1)->where('qty', '>', 0)->orderBy('order_id', 'ASC')->first();

					/*//product save into sales tem table
					$sales_temtable                = new sales_temtable();
					$sales_temtable->order_id      = $price_info->order_id;
					$sales_temtable->product_id    = $price_info->product_id;
					$sales_temtable->barcode       = $price_info->barcode;
					$sales_temtable->name          = $price_info->name;
					$sales_temtable->qty           = $request->quantity;
					$sales_temtable->cost_price    = $price_info->cost_price;
					$sales_temtable->sales_price   = $price_info->sales_price;
					$sales_temtable->vat_rate      = $price_info->vat_rate;
					$sales_temtable->discount_rate = $price_info->discount_rate;
					$sales_temtable->employee_id   = Auth::user()->id;
					$sales_temtable->save();*/

					//update Inventory table when add product in sales form
					$Inventory          = new Inventory();
					$previous_allocated = Inventory::where('product_id', '=', $request->id)->first();
					if (!empty($previous_allocated)) {
						//$allocate_adjustment = $previous_allocated->allocated + $request->quantity;
						$available_adjustment = $previous_allocated->available-$request->quantity;
						//$previous_allocated->allocated = $allocate_adjustment;
						$previous_allocated->available = $available_adjustment;
						$previous_allocated->save();
					} else {
						return "not found";
					}

					array_push($price_info_array, $price_info);
					$available_quantity = $price_info->qty;
					do {
						array_push($product_pricelist_id, $price_info->id);
						if ($available_quantity < $request->quantity) {
							$price_info_two = ProductPriceList::where('product_id', $request->id)->whereNotIn('id', $product_pricelist_id)->where('status', 1)->where('qty', '>', 0)->orderBy('order_id', 'ASC')->first();
							array_push($price_info_array, $price_info_two);
							array_push($product_pricelist_id, $price_info_two->id);
							$available_quantity = $available_quantity+$price_info_two->qty;
						}
					} while ($available_quantity < $request->quantity);

				} else {
					$restOfProduct = Inventory::where('product_id', $request->id)->first();
					return json_encode(['no', $restOfProduct->available]);
				}
			}
			if (count($price_info_array) > 0) {
				$quantity_per_row       = 0;
				$quantity_per_row_check = 0;
				for ($i = 0; $i < count($price_info_array); $i++) {
					$quantity_per_row = $quantity_per_row+$price_info_array[$i]->qty;
					if ($quantity_per_row <= $request->quantity) {
						$applicable_quantity = $price_info_array[$i]->qty;

					} else {
						$applicable_quantity = ($request->quantity+$price_info_array[$i]->qty)-$quantity_per_row;

					}
					$id        = $price_info_array[$i]->id;
					$pricelist = ProductPriceList::where('id', $id)->first();
					if (!empty($pricelist)) {
						if ($applicable_quantity == $pricelist->qty) {
							$pricelist->qty    = 0;
							$pricelist->status = 0;
						} else {
							$pricelist->qty = (float) ($pricelist->qty-$applicable_quantity);
						}
						$pricelist->save();
					}

				}
			}

			/* for ($i=0; $i <count($price_info_array) ; $i++) { 
			 	//product save into sales tem table
					$sales_temtable                = new sales_temtable();
					$sales_temtable->order_id      = $price_info_array->order_id[$i];
					$sales_temtable->product_id    = $price_info->product_id;
					$sales_temtable->barcode       = $price_info_array->barcode[$i];
					$sales_temtable->name          = $price_info->name;
					$sales_temtable->qty           = $price_info_array->qty[$i];
					$sales_temtable->cost_price    = $price_info->cost_price;
					$sales_temtable->sales_price   = $price_info_array->sales_price[$i];
					$sales_temtable->vat_rate      = $price_info_array->vat_rate[$i];
					$sales_temtable->discount_rate = $price_info_array->discount_rate[$i];
					$sales_temtable->employee_id   = Auth::user()->id;
					$sales_temtable->save();
			 }*/


			return json_encode($price_info_array);
		} else {
			return "Sorry you don't have access to this action";
		}
	}

	public function update_inventory(Request $request) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_edit')) {
			$product_id = $request->product_id;
			$quantity   = $request->quantity;
			$order_id   = $request->order_id;

			//update Inventory table when add product in sales form
			$Inventory          = new Inventory();
			$previous_allocated = Inventory::where('product_id', '=', $product_id)->first();
			if (!empty($previous_allocated)) {
				//$allocate_adjustment = $previous_allocated->allocated - $quantity;
				$available_adjustment = $previous_allocated->available+$quantity;
				//$previous_allocated->allocated = $allocate_adjustment;
				$previous_allocated->available = $available_adjustment;
				$previous_allocated->save();
			}

			$ProductPriceList = ProductPriceList::where('product_id', $product_id)->where('order_id', '=', $order_id)->first();
			if (!empty($ProductPriceList)) {
				$applicable_quantity      = $ProductPriceList->qty+$quantity;
				$ProductPriceList->qty    = $applicable_quantity;
				$ProductPriceList->status = 1;
				$ProductPriceList->save();
			}

			$sales_temtable = new sales_temtable();
			$sales_temtable = sales_temtable::where('order_id', $order_id)->where('product_id', $product_id)->where('employee_id', Auth::user()->id)->delete();
		} else {
			return "Sorry you don't have access to this action";
		}

	}

	public function fetch_product_with_barcode(Request $request) {

		$price_info = ProductPriceList::where('status', 1);
		$price_info = $price_info->where('barcode', $request->barcode);
		$price_info = $price_info->where('qty', '>', 0)->orderBy('order_id', 'ASC')->first();

		return json_encode($price_info);
	}

	public function sales_process(Request $request) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_add')) {

			$request->all();

			if ($request->gross_total == null && $request->gross_total == '') {
				return redirect('sales');
			}

			if ($request->customer_id == null) {
				$customer     = 0;
				$payment_type = 1;
			} else {
				$customer     = $request->customer_id;
				$payment_type = 2;
			}
			$dt   = new DateTime('now', new DateTimezone('Asia/Dhaka'));
			$date = $dt->format('Y-m-d H:i:s');
			//Sales data insert to sales Order table
			if ($request->net_total < $request->receive_amount_from_custome) {
				$initial_received = $request->net_total;
			} else {
				$initial_received = $request->receive_amount_from_custome;
			}

			$crud       = new \App\Library\Crud;
			$collection = $library->remove_element($request, ['order_id', 'customer_Id', 'employee_id', 'order_type', 'pre_order_status', 'gross_total', 'discount_total', 'vat_total']);
			$collection = $library->add_element($collection, ['order_id' => md5($date), 'customer_Id' => $customer, 'employee_id' => Auth::user()->id, 'order_type' => 'sales', 'pre_order_status' => 0, 'order_date' => $date, 'gross_amount' => $request->gross_total, 'gross_discount' => $request->discount_total, 'gross_vat_amount' => $request->vat_total, 'payment_amount' => $request->net_total, 'transection_type' => $payment_type, 'initial_received' => $initial_received]);
			//return dump($collection);

			$crud_result = $crud->InsertValue('SalesOrder', $collection);
			if (!empty($crud_result)) {
				$order_id = $crud_result;
			} else {
				return 'something wrong';
			}

			//insert all information to Sales Details Table
			if ($request->product_id != null) {
				for ($i = 0; $i < count($request->product_id); $i++) {
					$SalesDetails             = new SalesDetails();
					$SalesDetails->order_id   = $order_id;
					$SalesDetails->product_id = $request->product_id[$i];
					if ($request->has('barcode')) {
						$SalesDetails->unique_barcode = $request->barcode[$i];
					}
					$SalesDetails->qty           = $request->qty[$i];
					$SalesDetails->lot_no        = $request->product_lot_no[$i];
					$SalesDetails->sales_price   = $request->sales_price[$i];
					$SalesDetails->vat_rate      = $request->vat_rate[$i];
					$SalesDetails->discount_rate = $request->discount_rate[$i];
					$SalesDetails->line_total    = $request->sales_price_line_total[$i];
					$SalesDetails->note          = $request->note[$i];
					$SalesDetails->save();
					//update Inventory table when add product in sales form
					$Inventory          = new Inventory();
					$previous_allocated = Inventory::where('product_id', '=', $request->product_id[$i])->first();
					if (!empty($previous_allocated)) {
						$allocate_adjustment = $previous_allocated->allocated+$request->qty[$i];
						//$available_adjustment = $previous_allocated->available - $request->quantity;
						$previous_allocated->allocated = $allocate_adjustment;
						//$previous_allocated->available = $available_adjustment;
						$previous_allocated->save();
					} else {
						return "not found";
					}

					//empty from sales temtable after confirm sales

					$sales_temtable = new sales_temtable();
					$sales_temtable = sales_temtable::where('product_id', $request->product_id[$i])->where('employee_id', Auth::user()->id)->delete();
				}
			}
			//product price list table qty update maintaining FIFO of LIFO
			//we are maintain FIFO method for inventory
			//Old purchase product sales first and it we ensure using order_id in product_price_list table
			//inventory table update
			if ($request->product_lot_no != null) {

				for ($i = 0; $i < count($request->product_lot_no); $i++) {
					$ProductPriceList = new ProductPriceList();
					$previous_list    = ProductPriceList::where('product_id', '=', $request->product_id[$i])->where('order_id', '=', $request->product_lot_no[$i])->first();

					if (!empty($previous_list)) {

						$list_adjustment    = $previous_list->qty-$request->qty[$i];
						$previous_list->qty = $list_adjustment;
						if ($previous_list->qty == 0) {
							$previous_list->status = 0;
						}
						$previous_list->save();
					}

				}
			}

			//if receved amount  not empty then data insert onto Cash Book Accoutns table
			if ($request->receive_amount_from_custome != null && $request->receive_amount_from_custome > 0) {
				$CashBook                   = new CashBook();
				//$CashBook->account_no       = $customer;
				$CashBook->account_no = $request->cash_book ?? 1;
				$CashBook->own_account_no = $customer;
				$CashBook->refeance_no      = $order_id;
				$CashBook->transection_date = $date;
				if ($request->net_total == $request->receive_amount_from_custome) {
					$CashBook->debit = $request->receive_amount_from_custome;
				} elseif ($request->net_total > $request->receive_amount_from_custome) {
					$CashBook->debit = $request->receive_amount_from_custome;
				} elseif ($request->net_total < $request->receive_amount_from_custome) {
					$CashBook->debit = $request->net_total;
				}
				$CashBook->description = $request->common_notes;
				$CashBook->person_type = 'customer';
				$CashBook->created_by  = Auth::user()->id;
				$CashBook->save();
			}

			//Data insert into Cost of Goods Sold Table
			if ($request->product_id != null) {
				for ($i = 0; $i < count($request->product_id); $i++) {
					$CostofGoodsSoldAccounts                   = new CostofGoodsSoldAccounts();
					$CostofGoodsSoldAccounts->order_id         = $order_id;
					$CostofGoodsSoldAccounts->account_no       = $request->product_id[$i];
					$CostofGoodsSoldAccounts->transection_date = $date;
					$CostofGoodsSoldAccounts->debit            = $request->cost_price_line_total[$i];
					$CostofGoodsSoldAccounts->note             = $request->notes[$i];
					$CostofGoodsSoldAccounts->created_by       = Auth::user()->id;
					$CostofGoodsSoldAccounts->save();
				}
			}

			//data insert into sales Accounts
			if ($order_id != null) {
				$SalesAccounts                   = new SalesAccounts();
				$SalesAccounts->order_id         = $order_id;
				$SalesAccounts->account_no       = $customer;
				$SalesAccounts->transection_date = $date;
				$SalesAccounts->credit           = $request->net_total;
				$SalesAccounts->note             = $request->common_notes;
				$SalesAccounts->created_by       = Auth::user()->id;
				$SalesAccounts->save();

			}

			//Data insert into Customers Accounts Table
			if ($order_id != null) {
				$CustomerAccounts                   = new CustomerAccounts();
				$CustomerAccounts->account_no       = $customer;
				$CustomerAccounts->transection_no   = $order_id;
				$CustomerAccounts->transection_date = $date;
				$CustomerAccounts->debit            = $request->net_total;
				if ($request->receive_amount_from_custome != null && $request->receive_amount_from_custome > 0) {
					if ($request->net_total == $request->receive_amount_from_custome) {
						$CustomerAccounts->credit = $request->receive_amount_from_custome;
					} elseif ($request->net_total > $request->receive_amount_from_custome) {
						$CustomerAccounts->credit = $request->receive_amount_from_custome;
					} elseif ($request->net_total < $request->receive_amount_from_custome) {
						$CustomerAccounts->credit = $request->net_total;
					}
				}
				$CustomerAccounts->created_by = Auth::user()->id;
				$CustomerAccounts->save();
			}

			//if sales discount paid then data insert into Sales Discount
			if ($request->discount_line_total != null && $request->discount_line_total > 0) {
				for ($i = 0; $i < count($request->discount_line_total); $i++) {
					$SalesDiscountAccount                   = new SalesDiscountAccount();
					$SalesDiscountAccount->order_id         = $order_id;
					$SalesDiscountAccount->account_no       = $request->product_id[$i];
					$SalesDiscountAccount->transection_date = $date;
					$SalesDiscountAccount->debit            = $request->discount_line_total[$i];
					$SalesDiscountAccount->note             = $request->notes[$i];
					$SalesDiscountAccount->created_by       = Auth::user()->id;
					$SalesDiscountAccount->save();
				}
			}

			//if vat Amount Received from Customer then data insert into Vat Accounts Table
			if ($request->vat_line_total != null && $request->vat_line_total > 0) {
				for ($i = 0; $i < count($request->vat_line_total); $i++) {
					$VatAccounts                   = new VatAccounts();
					$VatAccounts->order_id         = $order_id;
					$VatAccounts->account_no       = $request->product_id[$i];
					$VatAccounts->transection_date = $request->date;
					$VatAccounts->credit           = $request->vat_line_total[$i];
					$VatAccounts->note             = $request->notes[$i];
					$VatAccounts->created_by       = Auth::user()->id;
					$VatAccounts->save();
				}
			}

			/*$sales_order = new \App\SalesOrder();
			$info = $sales_order->GetSalesOrder($request->order_id);
			 */
			return ['done' => $order_id];
		} else {
			return "Sorry you don't have access to this action";
		}

	}

	//park sales function
	public function park_sales_process(Request $request) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_add')) {

			if ($request->customer_id == null) {
				$customer     = 0;
				$payment_type = 1;
			} else {
				$customer     = $request->customer_id;
				$payment_type = 2;
			}

			if ($request->net_total == 0.00) {
				return "no product";
			}
			$dt   = new DateTime('now', new DateTimezone('Asia/Dhaka'));
			$date = $dt->format('Y-m-d H:i:s');

			$crud       = new \App\Library\Crud;
			$collection = $library->remove_element($request, ['order_id', 'customer_Id', 'employee_id', 'order_type', 'pre_order_status', 'gross_total', 'discount_total', 'vat_total']);
			$collection = $library->add_element($collection, ['order_id' => md5($date), 'customer_Id' => $customer, 'employee_id' => Auth::user()->id, 'order_type' => 'park_sales', 'pre_order_status' => 1, 'order_date' => $date, 'gross_amount' => $request->gross_total, 'gross_discount' => $request->discount_total, 'gross_vat_amount' => $request->vat_total, 'payment_amount' => $request->net_total, 'transection_type' => $payment_type]);
			//return dump($collection);

			$crud_result = $crud->InsertValue('SalesOrder', $collection);
			if (!empty($crud_result)) {
				$order_id = $crud_result;
			} else {
				return 'something wrong';
			}

			//insert all information to Sales Details Table
			if ($request->product_id != null) {
				for ($i = 0; $i < count($request->product_id); $i++) {
					$SalesDetails                 = new SalesDetails();
					$SalesDetails->order_id       = $order_id;
					$SalesDetails->product_id     = $request->product_id[$i];
					$SalesDetails->unique_barcode = $request->barcode[$i];
					$SalesDetails->qty            = $request->qty[$i];
					$SalesDetails->sales_price    = $request->sales_price[$i];
					$SalesDetails->vat_rate       = $request->vat_rate[$i];
					$SalesDetails->discount_rate  = $request->discount_rate[$i];
					$SalesDetails->line_total     = $request->sales_price_line_total[$i];
					$SalesDetails->lot_no         = $request->product_lot_no[$i];
					$SalesDetails->note           = $request->note[$i];
					$SalesDetails->save();

					//update Inventory table when add product in sales form
					$Inventory          = new Inventory();
					$previous_allocated = Inventory::where('product_id', '=', $request->product_id[$i])->first();
					if (!empty($previous_allocated)) {
						$on_order_adjustment = $previous_allocated->on_order+$request->qty[$i];
						//$available_adjustment = $previous_allocated->available - $request->quantity;
						$previous_allocated->on_order = $on_order_adjustment;
						//$previous_allocated->available = $available_adjustment;
						$previous_allocated->save();
					} else {
						return "not found";
					}

					//empty from sales temtable after confirm sales
					$sales_temtable = new sales_temtable();
					$sales_temtable = sales_temtable::where('product_id', $request->product_id[$i])->where('employee_id', Auth::user()->id)->delete();
				}
			}

			//product price list table qty update maintaining FIFO of LIFO
			//we are maintain FIFO method for inventory
			//Old purchase product sales first and it we ensure using order_id in product_price_list table
			//inventory table update
			if ($request->product_lot_no != null) {

				for ($i = 0; $i < count($request->product_lot_no); $i++) {
					$ProductPriceList = new ProductPriceList();
					$previous_list    = ProductPriceList::where('product_id', '=', $request->product_id[$i])->where('order_id', '=', $request->product_lot_no[$i])->first();

					if (!empty($previous_list)) {

						$list_adjustment    = $previous_list->qty-$request->qty[$i];
						$previous_list->qty = $list_adjustment;
						if ($previous_list->qty == 0) {
							$previous_list->status = 0;
						}
						$previous_list->save();
					}

				}

			}

			return ['done' => $order_id];
		} else {
			return "Sorry you don't have access to this action";
		}

	}

	public function empty_temp_table(Request $request) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_add')) {
			$sales_temtable = new sales_temtable();
			$sales_temtable = sales_temtable::where('employee_id', Auth::user()->id)->delete();
			return 'delete';
		} else {
			return "Sorry you don't have access to this action";
		}
	}

	public function preorder_details(Request $request, $id) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_add')) {
			$id = $request->id;
			if ($id != '') {
				$sales_orders = DB::table('sales_orders')->where('id', $id)->where('order_type', '=', 'park_sales')->first();
				if (!empty($sales_orders)) {
					$sales_details    = DB::table('sales_details')->where('order_id', $id)->get();
					$product_profiles = DB::table('product_profiles')->get();
					$customerInfo     = DB::table('customer_profiles')->where('id', $sales_orders->customer_Id)->first();
					return view('sales.preorder-details', compact('sales_orders', 'customerInfo', 'sales_details', 'product_profiles'));
				} else {
					Session::flash('message', 'Please Check Pre Order Sales Invoice List !');
					return view('sales.preorder-details');
				}

			}
		} else {
			return "Sorry you don't have access to this action";
		}

	}

	public function preorderSalesConfirm(Request $request) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_add')) {

			$SalesOrder = new SalesOrder();
			$SalesOrder = SalesOrder::where('id', $request->order_id)->where('order_type', 'park_sales')->first();
			if (!empty($SalesOrder)) {
				$previousReceive_amount = $SalesOrder->receive_amount_from_custome;
				$currentReceivedAmount  = $previousReceive_amount+$request->receive_amount_from_custome;
				//update sales order table
				$SalesOrder->receive_amount_from_custome = $currentReceivedAmount;
				$SalesOrder->receive_amount_from_custome = $currentReceivedAmount;
				$SalesOrder->due_amount                  = $request->due_amount;
				if ($request->payment_amount < $currentReceivedAmount) {
					$returnAmount              = $currentReceivedAmount-$request->payment_amount;
					$SalesOrder->return_amount = $returnAmount;
				}
				$SalesOrder->order_type       = 'sales';
				$SalesOrder->pre_order_status = 0;
				$SalesOrder->employee_id      = Auth::user()->id;
				$SalesOrder->save();

				//data insert into customer Accounts
				$dt   = new DateTime('now', new DateTimezone('Asia/Dhaka'));
				$date = $dt->format('Y-m-d H:i:s');

				$CustomerAccounts                   = new CustomerAccounts();
				$CustomerAccounts->account_no       = $request->customer_id;
				$CustomerAccounts->transection_no   = $request->order_id;
				$CustomerAccounts->transection_date = $date;
				$CustomerAccounts->debit            = $request->payment_amount;
				if ($request->receive_amount_from_custome != null && $request->receive_amount_from_custome > 0) {
					if ($request->payment_amount == $request->receive_amount_from_custome) {
						$CustomerAccounts->credit = $request->receive_amount_from_custome;
					} elseif ($request->payment_amount > $request->receive_amount_from_custome) {
						$CustomerAccounts->credit = $request->receive_amount_from_custome;
					} elseif ($request->payment_amount < $request->receive_amount_from_custome) {
						$CustomerAccounts->credit = $request->payment_amount;
					}
				}
				$CustomerAccounts->created_by = Auth::user()->id;
				$CustomerAccounts->save();

				//if sales discount paid then data insert into Sales Discount
				if ($request->discount_line_total != null && $request->discount_line_total > 0) {
					for ($i = 0; $i < count($request->discount_line_total); $i++) {
						$SalesDiscountAccount                   = new SalesDiscountAccount();
						$SalesDiscountAccount->order_id         = $request->order_id;
						$SalesDiscountAccount->account_no       = $request->product_id[$i];
						$SalesDiscountAccount->transection_date = $date;
						$SalesDiscountAccount->debit            = $request->discount_line_total[$i];
						$SalesDiscountAccount->note             = $request->notes[$i];
						$SalesDiscountAccount->created_by       = Auth::user()->id;
						$SalesDiscountAccount->save();
					}
				}

				//if vat Amount Received from Customer then data insert into Vat Accounts Table
				if ($request->vat_line_total != null && $request->vat_line_total > 0) {
					for ($i = 0; $i < count($request->vat_line_total); $i++) {
						$VatAccounts                   = new VatAccounts();
						$VatAccounts->order_id         = $request->order_id;
						$VatAccounts->account_no       = $request->product_id[$i];
						$VatAccounts->transection_date = $date;
						$VatAccounts->credit           = $request->vat_line_total[$i];
						$VatAccounts->note             = $request->notes[$i];
						$VatAccounts->created_by       = Auth::user()->id;
						$VatAccounts->save();
					}
				}

				//data insert into cost of goods sold
				if ($request->product_id != null) {
					for ($i = 0; $i < count($request->product_id); $i++) {
						$cost_price = DB::table('product_price_lists')->where('order_id', $request->lot_no)->where('product_id', $request->product_id[$i])->first();
						if (!empty($cost_price)) {
							$cost_price_line_total                     = $cost_price->cost_price*$request->qty[$i];
							$CostofGoodsSoldAccounts                   = new CostofGoodsSoldAccounts();
							$CostofGoodsSoldAccounts->order_id         = $request->order_id;
							$CostofGoodsSoldAccounts->account_no       = $request->product_id[$i];
							$CostofGoodsSoldAccounts->transection_date = $date;
							$CostofGoodsSoldAccounts->debit            = $cost_price_line_total;
							$CostofGoodsSoldAccounts->note             = $request->notes[$i];
							$CostofGoodsSoldAccounts->created_by       = Auth::user()->id;
							$CostofGoodsSoldAccounts->save();
						}

						//update Inventory table when add product in sales form
						$Inventory          = new Inventory();
						$previous_allocated = Inventory::where('product_id', '=', $request->product_id[$i])->first();
						if (!empty($previous_allocated)) {
							$allocate_adjustment           = $previous_allocated->allocated+$request->qty[$i];
							$on_order_adjustment           = $previous_allocated->on_order-$request->qty[$i];
							$previous_allocated->allocated = $allocate_adjustment;
							$previous_allocated->on_order  = $on_order_adjustment;
							$previous_allocated->save();
						} else {
							return "not found";
						}

					}
				}

				//if receved amount  not empty then data insert onto Cash Book Accoutns table
				if ($request->receive_amount_from_custome != null && $request->receive_amount_from_custome > 0) {

					$CashBook                   = new CashBook();
					
					$CashBook->account_no = $request->cash_book ?? 1;
					$CashBook->own_account_no =$request->customer_id;
					$CashBook->refeance_no      = $request->order_id;
					$CashBook->transection_date = $date;
					if ($request->payment_amount == $request->receive_amount_from_custome) {
						$CashBook->debit = $request->receive_amount_from_custome;
					} elseif ($request->payment_amount > $request->receive_amount_from_custome) {
						$CashBook->debit = $request->receive_amount_from_custome;
					} elseif ($request->payment_amount < $request->receive_amount_from_custome) {
						$CashBook->debit = $request->payment_amount;
					}
					$CashBook->description = $request->common_notes;
					$CashBook->person_type = 'customer';
					$CashBook->created_by  = Auth::user()->id;

					$CashBook->save();

				}
				//data insert into sales Accounts
				if ($request->order_id != null) {
					$SalesAccounts                   = new SalesAccounts();
					$SalesAccounts->order_id         = $request->order_id;
					$SalesAccounts->account_no       = $request->customer_id;
					$SalesAccounts->transection_date = $date;
					$SalesAccounts->credit           = $request->payment_amount;
					$SalesAccounts->note             = $request->common_notes;
					$SalesAccounts->created_by       = Auth::user()->id;
					$SalesAccounts->save();

				}

			}

			return redirect('sales-preorder-invoice');
		} else {
			return "Sorry you don't have access to this action";
		}

	}

	//load Sales return page
	public function sales_return() {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_view')) {
			return view('sales.return');
		} else {
			return "Sorry you don't have access to this action";
		}
	}
	//find out invoice number wise sales invoice details load
	public function findReturnInvoice(Request $request) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_view')) {
			$id = $request->searchInvoice;
			if ($id != '') {

				$returnCheck = DB::table('sales_retrun_orders')->where('return_return_ref', '=', $id)->first();
				if (!empty($returnCheck)) {
					Session::flash('message', 'You Can not Return Product More Then One Time !');
					return redirect('sales-return');

				} else {
					$sales_orders = DB::table('sales_orders')->where('id', $id)->where('order_type', '=', 'sales')->first();
				}

			}

			if ($sales_orders != null) {

				$sales_details = DB::table('sales_details')->where('order_id', $id)->get();
				/*echo "<pre>";
				print_r($sales_orders);
				 */

				$product_profiles = DB::table('product_profiles')->get();
				$customerInfo     = CustomerProfile::where('id', $sales_orders->customer_Id)->first();
				$TransactionTerm  = DB::table('transaction_terms')->where('id', '=', $sales_orders->transection_type)->first();

				$costPriceD = array();
				foreach ($sales_details as $value) {
					$costInfo = ProductPriceList::where('order_id', '=', $value->lot_no)->where('product_id', '=', $value->product_id)->first();
					array_push($costPriceD, $costInfo);

				}
				return view('sales.return-details', compact('sales_orders', 'customerInfo', 'sales_details', 'product_profiles', 'costPriceD', 'TransactionTerm'));

			} else {
				Session::flash('message', 'Please Search with valid Invoice Number !');
				return redirect()->back();
			}
		} else {
			return "Sorry you don't have access to this action";
		}

	}

	public function salesReturnConfirm(Request $request) {
		$library = new \App\Library\Library;
		if ($library->check_user_access('sales_edit')) {

			
			$dt   = new DateTime('now', new DateTimezone('Asia/Dhaka'));
			$date = $dt->format('Y-m-d H:i:s');
			if ($request->payment_amount == null) {
				$request->payment_amount = 0;
			}

			$crud       = new \App\Library\Crud;
			$collection = $library->remove_element($request, ['return_order_id', 'return_customer_Id', 'return_order_date', 'return_gross_amount', 'return_return_amount', 'return_amount_paid_customer', 'return_gross_discount', 'return_return_ref', 'return_transection_type', 'return_order_type', 'return_order_type', 'return_employee_id', 'return_gross_vat_amount', 'return_employee_id', 'return_purchase_return', 'return_note', 'status']);
			$collection = $library->add_element($collection, ['return_order_id' => md5($date), 'return_customer_Id' => $request->customer, 'return_employee_id' => Auth::user()->id, 'order_type' => 'sales_return', 'return_pre_order_status' => 2, 'return_order_date' => $date, 'return_gross_amount' => $request->gross_amount, 'return_gross_discount' => $request->gross_discount, 'return_gross_vat_amount' => $request->gross_vat_amount, 'return_return_amount' => $request->net_amount, 'return_amount_paid_customer' => $request->payment_amount, 'return_return_ref' => $request->preorder_ref, 'return_transection_type' => 1, 'return_note' => $request->note]);
			//return dump($collection);

			$crud_result = $crud->InsertValue('SalesRetrunOrder', $collection);
			if (!empty($crud_result)) {
				$order_id   = $crud_result;
				$SalesOrder = new SalesOrder;
				$SalesOrder = SalesOrder::where('id', '=', $request->preorder_ref)->first();
				if (!empty($SalesOrder)) {
					$SalesOrder->return_ref = $order_id;
					$SalesOrder->save();
				}

			} else {
				return 'something wrong';
			}

			//insert all information to Sales Details Table
			if ($request->product_id != null) {
				for ($i = 0; $i < count($request->product_id); $i++) {
					$SalesDetails                 = new SalesDetails();
					$SalesDetails->order_id       = $order_id;
					$SalesDetails->product_id     = $request->product_id[$i];
					$SalesDetails->unique_barcode = $request->barcode[$i];
					$SalesDetails->qty            = $request->qty[$i];
					$SalesDetails->sales_price    = $request->sales_price[$i];
					$SalesDetails->vat_rate       = $request->vat_rate[$i];
					$SalesDetails->discount_rate  = $request->discount_rate[$i];
					$SalesDetails->line_total     = $request->sales_price_line_total[$i];
					$SalesDetails->lot_no         = $request->product_lot_no[$i];
					$SalesDetails->status         = 0;
					$SalesDetails->save();

					//update Inventory table when add product in sales form
					$Inventory          = new Inventory();
					$previous_allocated = Inventory::where('product_id', '=', $request->product_id[$i])->first();
					if (!empty($previous_allocated)) {
						$on_order_adjustment              = $previous_allocated->on_order-$request->qty[$i];
						$available_adjustment             = $previous_allocated->available+$request->quantity;
						$sales_return_adjustment          = $previous_allocated->sales_return+$request->quantity;
						$previous_allocated->on_order     = $on_order_adjustment;
						$previous_allocated->available    = $available_adjustment;
						$previous_allocated->sales_return = $sales_return_adjustment;
						$previous_allocated->save();
					} else {
						return "Inventory table not updated";
					}

					$CostofGoodsSoldAccounts                   = new CostofGoodsSoldAccounts();
					$CostofGoodsSoldAccounts->order_id         = $order_id;
					$CostofGoodsSoldAccounts->account_no       = $request->product_id[$i];
					$CostofGoodsSoldAccounts->transection_date = $date;
					$CostofGoodsSoldAccounts->credit           = $request->cost_price_line_total[$i];
					$CostofGoodsSoldAccounts->created_by       = Auth::user()->id;
					$CostofGoodsSoldAccounts->save();

				}
			}


			//product price list table qty update maintaining FIFO of LIFO
			//we are maintain FIFO method for inventory
			//Old purchase product sales first and it we ensure using order_id in product_price_list table
			//inventory table update
			if ($request->product_lot_no != null) {
				for ($i = 0; $i < count($request->product_lot_no); $i++) {

					$ProductPriceList = new ProductPriceList();
					$previous_list    = ProductPriceList::where('product_id', '=', $request->product_id[$i])->where('order_id', '=', $request->product_lot_no[$i])->first();
					
					if (!empty($previous_list)) {
						$list_adjustment       = $previous_list->qty+$request->qty[$i];
						$previous_list->qty    = $list_adjustment;
						$previous_list->status = 1;
						$previous_list->save();
					}

				}

			}

			//if sales discount paid then data insert into Sales Discount
			if ($request->discount_line_total != null && $request->discount_line_total > 0) {
				for ($i = 0; $i < count($request->discount_line_total); $i++) {
					$SalesDiscountAccount                   = new SalesDiscountAccount();
					$SalesDiscountAccount->order_id         = $order_id;
					$SalesDiscountAccount->account_no       = $request->product_id[$i];
					$SalesDiscountAccount->transection_date = $date;
					$SalesDiscountAccount->credit           = $request->discount_line_total[$i];
					$SalesDiscountAccount->created_by       = Auth::user()->id;
					$SalesDiscountAccount->save();
				}
			}

			//if vat Amount Received from Customer then data insert into Vat Accounts Table
			if ($request->vat_line_total != null && $request->vat_line_total > 0) {
				for ($i = 0; $i < count($request->vat_line_total); $i++) {
					$VatAccounts                   = new VatAccounts();
					$VatAccounts->order_id         = $order_id;
					$VatAccounts->account_no       = $request->product_id[$i];
					$VatAccounts->transection_date = $date;
					$VatAccounts->debit            = $request->vat_line_total[$i];
					$VatAccounts->created_by       = Auth::user()->id;
					$VatAccounts->save();
				}
			}

			//if receved amount  not empty then data insert onto Cash Book Accoutns table
			if ($request->payment_amount != null && $request->payment_amount > 0) {

				$CashBook                   = new CashBook();
				//$CashBook->account_no       = $request->customer;
				$CashBook->account_no = $request->cash_book ?? 1;
				$CashBook->own_account_no = $request->customer;
				$CashBook->refeance_no      = $order_id;
				$CashBook->transection_date = $date;
				if ($request->net_amount == $request->payment_amount) {
					$CashBook->credit = $request->payment_amount;
				} elseif ($request->net_amount > $request->payment_amount) {
					$CashBook->credit = $request->payment_amount;
				} elseif ($request->net_amount < $request->payment_amount) {
					$CashBook->credit = $request->net_amount;
				}
				$CashBook->description = $request->note;
				$CashBook->person_type = 'customer';
				$CashBook->created_by  = Auth::user()->id;

				$CashBook->save();

			}
			//data insert into sales Accounts
			if ($request->order_id != null) {
				$SalesAccounts                   = new SalesAccounts();
				$SalesAccounts->order_id         = $order_id;
				$SalesAccounts->account_no       = $request->customer;
				$SalesAccounts->transection_date = $date;
				$SalesAccounts->debit            = $request->net_amount;
				$SalesAccounts->note             = $request->note;
				$SalesAccounts->created_by       = Auth::user()->id;
				$SalesAccounts->save();

			}

			return redirect('return-list');
		} else {
			return "Sorry you don't have access to this action";
		}

	}

}
