/home/awneajlw/.trash/app.2/Http/Controllers/SubAdmin/SaleController.php
<?php
namespace App\Http\Controllers\SubAdmin;
use Carbon\Carbon;
use App\Models\Sale;
use App\Models\User;
use App\Models\SaleItem;
use App\Models\Inventory;
use Illuminate\Http\Request;
use Barryvdh\DomPDF\Facade\Pdf;
use App\Http\Controllers\Controller;
use App\Models\UserDetail;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\RoundBlockSizeMode;
use Endroid\QrCode\Writer\PngWriter;
class SaleController extends Controller
{
public function index()
{
$user = Auth::user();
$inventories = Inventory::where('branch_id', $user->branch_id)->get();
return view('admin.subAdmin.index', compact('inventories', 'user'));
}
public function store(Request $request)
{
$request->validate([
'buyer_name' => 'required|string|max:255',
'inventory_ids' => 'required|array',
'quantities' => 'required|array',
'prices' => 'required|array',
]);
$user = Auth::user();
$vatdetail = UserDetail::where('branch_id', Auth::user()->branch_id)->first();
if (!$vatdetail) {
return back()->with('error', 'VAT details not found for this branch');
}
$original_total_price = 0;
$total_vat = 0;
foreach ($request->quantities as $index => $quantity) {
$price = $request->prices[$index];
$subtotal = $quantity * $price;
$vat = $subtotal * 0.15;
$original_total_price += $subtotal;
$total_vat += $vat;
}
$total_price_with_vat = $original_total_price + $total_vat;
$vat_no_final = $request->vat_no ?? $vatdetail->vat_no;
try {
// Generate KSA e-invoice QR code data
$sellerName = $vatdetail->brand_name;
$vatNumber = $vat_no_final;
$timestamp = now()->format('Y-m-d\TH:i:s\Z');
$invoiceTotal = number_format($total_price_with_vat, 2, '.', '');
$vatTotal = number_format($total_vat, 2, '.', '');
// Create TLV format for KSA e-invoice QR code
$tlvData = $this->generateTLV([
1 => $sellerName,
2 => $vatNumber,
3 => $timestamp,
4 => $invoiceTotal,
5 => $vatTotal
]);
// Generate QR code using Builder
$result = Builder::create()
->data($tlvData)
->encoding(new Encoding('UTF-8'))
->errorCorrectionLevel(ErrorCorrectionLevel::High)
->size(300)
->margin(10)
->roundBlockSizeMode(RoundBlockSizeMode::Margin)
->writer(new PngWriter())
->build();
// Generate unique filename
$qrFileName = 'ksa_qr_' . time() . '.png';
$qrPath = 'qr_codes/' . $qrFileName;
// Ensure directory exists
if (!file_exists(public_path('qr_codes'))) {
mkdir(public_path('qr_codes'), 0777, true);
}
// Save QR code image
$result->saveToFile(public_path($qrPath));
// Create sale record with QR code path
$saleId = Sale::insertGetId([
'vat_no' => $vat_no_final,
'buyer_name' => $request->buyer_name,
'branch_id' => $user->branch_id,
'price' => $original_total_price,
'total_price' => $total_price_with_vat,
'direction' => $request->direction,
'language' => $request->language,
'qr_ksa' => $qrPath,
'created_at' => now(),
]);
foreach ($request->inventory_ids as $index => $inventory_id) {
$quantity_sold = $request->quantities[$index];
$price = $request->prices[$index];
$subtotal = $quantity_sold * $price;
$vat = $subtotal * 0.15;
SaleItem::insertGetId([
'sale_id' => $saleId,
'inventory_id' => $inventory_id,
'quantity_sold' => $quantity_sold,
'price' => $price,
'vat' => $vat,
'created_at' => now(),
]);
// Update inventory
$inventory = Inventory::find($inventory_id);
$inventory->quantity -= $quantity_sold;
$inventory->save();
}
return redirect()->route('invoice.show', $saleId);
} catch (\Exception $e) {
dd($e);
}
}
/**
* Generate TLV (Tag-Length-Value) format for KSA e-invoice QR code
*/
private function generateTLV(array $data): string
{
try {
$result = '';
foreach ($data as $tag => $value) {
$valueBytes = mb_convert_encoding($value, 'UTF-8');
$length = strlen($valueBytes);
$result .= pack('C', $tag) . pack('C', $length) . $valueBytes;
}
return base64_encode($result);
} catch (\Exception $e) {
dd($e);
}
}
public function show($id)
{
$userDetail = UserDetail::where('branch_id', Auth::user()->branch_id)->first();
$sale = Sale::with('saleItems.inventory', 'branch', 'user')->findOrFail($id);
// dd($sale->user->name);
return view('admin.subAdmin.show', compact('sale', 'userDetail'));
// $pdf = Pdf::setOption(['isHtmlParserEnabled' => true,'isRemoteEnabled'=>true,'defaultFont' => 'sans-serif'])->loadView('admin.subAdmin.show', compact('sale'))->setPaper('A4', 'landscape');
// return $pdf->stream("pdfcard.pdf");
// return view('admin.subAdmin.show', compact('sale'));
}
}