gruene-seele/app/Http/Controllers/Stats/SalesController.php
Kevin Adametz ef19dc2ced Absatzstatistik: Summen aus Bestellpositionen, Kompensationsprodukte ausgewiesen, Extern-Bestellungen nachgefüllt
- Stats\Sales: alle Summenzeilen (Angezeigt/Ausgeblendet/Gesamt/Rabatte/Netto)
  aus price_net × qty der Positionen statt aus subtotal_full/discount des
  Bestellkopfs; WooCommerce-Importe (txaction extern) hatten dort NULL und
  zählten seit 06/2026 mit 0 € (Aug 2026: 449 € statt 3.318 € angezeigt)
- Kompensationsprodukte (comp > 0) bleiben in der Menge, neue Spalten
  „davon Kompensation“ (aktuell + Vorjahr) und Summenzeile 9993
- Gelöschte Produkte bleiben im Umsatz sichtbar (withTrashed, „(gelöscht)“)
- WP-Import setzt subtotal_full und discount jetzt wie der Checkout
- Migration füllt subtotal_full/discount bestehender Extern-Bestellungen nach
- Excel-Export um die beiden Kompensationsspalten erweitert
- Test tests/Feature/StatsSalesVolumeTest.php (Konsistenz, Filter, Jahr)

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 08:15:30 +00:00

182 lines
6.6 KiB
PHP
Executable file

<?php
namespace App\Http\Controllers\Stats;
use App\Exports\ExcelExport;
use App\Http\Controllers\Controller;
use App\Models\ShoppingOrder;
use App\Models\ShoppingOrderItem;
use App\Services\HTMLHelper;
use App\Services\Stats\Sales;
use Carbon\Carbon;
use Faker\Core\Number;
use Maatwebsite\Excel\Facades\Excel;
use Request;
class SalesController extends Controller
{
private $serviceSales;
public function __construct(Sales $serviceSales)
{
$this->middleware('admin');
$this->serviceSales = $serviceSales;
}
public function index()
{
$this->setFilterVars();
$data = [
'filter_months' => HTMLHelper::getTransMonths(true),
'filter_years' => HTMLHelper::getYearRange(2020),
'filter_products' => $this->serviceSales->setFilterProducts(),
];
return view('admin.stats.salesvolume', $data);
}
public function download()
{
$this->setFilterVars();
if (Request::get('action') === 'filter') {
// $data = Request::all();
return back();
}
if (Request::get('action') === 'export') {
$objects = $this->serviceSales->getObjects();
$columns = [];
$filename = 'gs-absatzmengen-'.session('product_sales_vol_filter_month').'_'.session('product_sales_vol_filter_year').'-export';
$headers = [
'#',
'Produkt',
'Artikelnummer',
'Menge',
'davon Kompensation',
'Gesamt Netto in EURO',
'Vorjahr Menge',
'Vorjahr davon Kompensation',
'Vorjahr Gesamt Netto in EURO',
'Einzelrabatt',
'Einzelrabatt %',
'VP Einzelrabatt %',
];
if ($objects) {
foreach ($objects as $key => $obj) {
$columns[] = [
'id' => $key,
'name' => $obj['name'],
'number' => $obj['number'],
'qty' => $obj['qty'],
'comp_qty' => $obj['comp_qty'],
'total' => $obj['total'],
'pre_qty' => $obj['pre_qty'],
'pre_comp_qty' => $obj['pre_comp_qty'],
'pre_total' => $obj['pre_total'],
'single_commission' => $obj['single_commission'],
'value_commission' => $obj['value_commission'],
'partner_commission' => $obj['partner_commission'],
];
}
}
return Excel::download(new ExcelExport($columns, $headers), $filename.'.xls');
}
}
private function setFilterVars()
{
if (! session('product_sales_vol_filter_month')) {
session(['product_sales_vol_filter_month' => intval(date('m'))]);
}
if (! session('product_sales_vol_filter_year')) {
session(['product_sales_vol_filter_year' => intval(date('Y'))]);
}
if (! session('product_sales_vol_filter_products')) {
session(['product_sales_vol_filter_products' => []]);
}
if (Request::get('product_sales_vol_filter_month')) {
session(['product_sales_vol_filter_month' => Request::get('product_sales_vol_filter_month')]);
}
if (Request::get('product_sales_vol_filter_year')) {
session(['product_sales_vol_filter_year' => Request::get('product_sales_vol_filter_year')]);
}
if (Request::get('product_sales_vol_filter_products')) {
session(['product_sales_vol_filter_products' => Request::get('product_sales_vol_filter_products')]);
}
$this->serviceSales->setFilterVars(
session('product_sales_vol_filter_month'),
session('product_sales_vol_filter_year'),
session('product_sales_vol_filter_products')
);
}
public function datatable()
{
$this->setFilterVars();
$collection = $this->serviceSales->getCollection();
/* $collect = collect([
['id' => 1, 'name' => 'John', 'number'=>92012, 'value'=>123],
['id' => 2, 'name' => 'Jane', 'number'=>92012, 'value'=>123],
['id' => 3, 'name' => 'James', 'number'=>92012, 'value'=>123],
]);
*/
return \DataTables::of($collection)->toJson();
}
/*private function testCheckFunction(){
//$date_start = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->format('Y-m-d');
//$date_end = Carbon::parse('01.'.session('product_sales_vol_filter_month').'.'.session('product_sales_vol_filter_year'))->endOfMonth()->format('Y-m-d');
$date_start = Carbon::parse('01.01.2024')->format('Y-m-d H:i:s');
$date_end = Carbon::parse('01.01.2024')->endOfMonth()->format('Y-m-d H:i:s');
dump($date_start);
dump($date_end);
$ShoppingOrders = ShoppingOrder::where('mode', 'live')->whereBetween('created_at', [$date_start, $date_end])->get();
$objects = [];
$counter = 0;
foreach($ShoppingOrders as $ShoppingOrder){
foreach($ShoppingOrder->shopping_order_items as $shopping_order_item){
if($shopping_order_item->product){
if($shopping_order_item->product->id === 122){
//dump($shopping_order_item->qty);
//$counter += $shopping_order_item->qty;
if(isset($objects[$shopping_order_item->product->id])){
$value = intval($objects[$shopping_order_item->product->id]['value'] + $shopping_order_item->qty);
$objects[$shopping_order_item->product->id]['value'] = $value;
}else{
$objects[$shopping_order_item->product->id] = [
'name' => $shopping_order_item->product->name,
'number' => $shopping_order_item->product->number,
'value' => $shopping_order_item->qty
];
}
}
}
}
}
$ShoppingOrderItems = ShoppingOrderItem::whereProductId(122)->whereBetween('created_at', [$date_start, $date_end])->get();
$counter = 0;
foreach($ShoppingOrderItems as $ShoppingOrderItem){
$counter += $ShoppingOrderItem->qty;
dump($ShoppingOrderItem->id);
}
// dump($objects);
dump($counter);
dd("OKAY");
}*/
}