301 lines
13 KiB
PHP
301 lines
13 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use Yard;
|
|
use App\User;
|
|
use Carbon\Carbon;
|
|
use App\Models\Product;
|
|
use App\Models\UserAbo;
|
|
use App\Models\UserAboItem;
|
|
use App\Models\ShoppingUser;
|
|
use App\Models\UserAboOrder;
|
|
use App\Models\ShoppingOrder;
|
|
use App\Models\ShippingCountry;
|
|
use App\Models\ShoppingPayment;
|
|
|
|
class AboOrderCart
|
|
{
|
|
private static $user_abo;
|
|
private static $is_for;
|
|
private static $customer_detail;
|
|
|
|
|
|
public static function initYard($user_abo)
|
|
{
|
|
|
|
// WICHTIG: Statische Variablen zurücksetzen, um sicherzustellen, dass keine Daten
|
|
// aus vorherigen Abos verwendet werden
|
|
self::$user_abo = $user_abo;
|
|
self::$is_for = null;
|
|
self::$customer_detail = null;
|
|
|
|
// Yard komplett leeren - wichtig für Batch-Verarbeitung mehrerer Abos
|
|
$yard = Yard::instance('shopping');
|
|
$itemsBeforeDestroy = $yard->content()->count();
|
|
$yard->destroy();
|
|
|
|
\Log::info('AboOrderCart::initYard: Yard geleert', [
|
|
'abo_id' => $user_abo->id,
|
|
'items_vor_destroy' => $itemsBeforeDestroy
|
|
]);
|
|
$itemsAfterDestroy = $yard->content()->count();
|
|
\Log::info('AboOrderCart::initYard: Yard geleert', [
|
|
'abo_id' => $user_abo->id,
|
|
'items_after_destroy' => $itemsAfterDestroy
|
|
]);
|
|
|
|
self::$customer_detail = self::makeCustomerDetail($user_abo);
|
|
if ($user_abo->is_for === 'me') {
|
|
self::$is_for = 'abo-me';
|
|
if ($user_abo->user && $user_abo->user->account->same_as_billing) {
|
|
$country_id = $user_abo->user->account->country_id;
|
|
} else {
|
|
$country_id = $user_abo->user->account->shipping_country_id;
|
|
}
|
|
if ($country_id && $shipping_country = ShippingCountry::whereCountryId($country_id)->first()) {
|
|
if ($shipping_country->shipping && $shipping_country->shipping->active) {
|
|
UserService::initUserYard($user_abo->user, $shipping_country->id, 'abo-me');
|
|
return true;
|
|
}
|
|
}
|
|
abort(403, 'Fehler: Versandland nicht gefunden');
|
|
}
|
|
if ($user_abo->is_for === 'ot') {
|
|
self::$is_for = 'abo-ot-customer';
|
|
UserService::initCustomerYard(self::$customer_detail, 'abo-ot-customer');
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static function makeOrderYard($user_abo)
|
|
{
|
|
// WICHTIG: Statische Variablen explizit setzen für dieses Abo
|
|
self::$user_abo = $user_abo;
|
|
if ($user_abo->is_for === 'ot') {
|
|
self::$is_for = 'abo-ot-customer';
|
|
}
|
|
if ($user_abo->is_for === 'me') {
|
|
self::$is_for = 'abo-me';
|
|
}
|
|
|
|
// WICHTIG: Yard IMMER leeren, um sicherzustellen, dass keine Produkte aus vorherigen Aufrufen vorhanden sind
|
|
// Dies ist besonders wichtig bei wiederholten Aufrufen der detail-Funktion (z.B. durch AJAX-Requests)
|
|
$yard = Yard::instance('shopping');
|
|
$itemsBefore = $yard->content()->count();
|
|
$yard->destroy();
|
|
|
|
if ($itemsBefore > 0) {
|
|
\Log::warning('AboOrderCart::makeOrderYard: Yard war nicht leer vor makeOrderYard und wurde geleert', [
|
|
'abo_id' => $user_abo->id,
|
|
'items_before' => $itemsBefore
|
|
]);
|
|
}
|
|
|
|
// Sicherstellen, dass die Items für dieses spezifische Abo geladen werden
|
|
// Verwende fresh() um sicherzustellen, dass wir die aktuellen Daten haben
|
|
$abo_items = $user_abo->user_abo_items()->get();
|
|
\Log::info('AboOrderCart::makeOrderYard: Füge Produkte zum Cart hinzu', [
|
|
'abo_id' => $user_abo->id,
|
|
'item_count' => $abo_items->count(),
|
|
'items' => $abo_items->map(function ($item) {
|
|
return [
|
|
'id' => $item->id,
|
|
'product_id' => $item->product_id,
|
|
'qty' => $item->qty,
|
|
'comp' => $item->comp
|
|
];
|
|
})->toArray()
|
|
]);
|
|
|
|
foreach ($abo_items as $abo_item) {
|
|
self::addProductToCart($abo_item);
|
|
}
|
|
Yard::instance('shopping')->reCalculateShippingPrice();
|
|
|
|
$user_abo->amount = Yard::instance('shopping')->totalWithShipping(2, '.', '') * 100;
|
|
$user_abo->save();
|
|
}
|
|
|
|
private static function addProductToCart($item)
|
|
{
|
|
|
|
$product = Product::find($item->product_id);
|
|
$tax_free = Yard::instance('shopping')->getUserTaxFree();
|
|
$user_country = Yard::instance('shopping')->getUserCountry();
|
|
|
|
if ($product) {
|
|
if ($item->comp) {
|
|
$cartItem = Yard::instance('shopping')->add(
|
|
$product->id,
|
|
$product->getLang('name'),
|
|
1,
|
|
0,
|
|
false,
|
|
false,
|
|
[
|
|
'image' => '',
|
|
'slug' => $product->slug,
|
|
'weight' => 0,
|
|
'points' => 0,
|
|
'comp' => $item->comp,
|
|
'product_id' => $product->id
|
|
]
|
|
);
|
|
Yard::setTax($cartItem->rowId, 0);
|
|
return true;
|
|
}
|
|
if (self::$is_for === 'ot-customer' || self::$is_for === 'abo-ot-customer') {
|
|
$cartItem = Yard::instance('shopping')
|
|
->add(
|
|
$product->id,
|
|
$product->getLang('name'),
|
|
$item->qty,
|
|
round($product->getPriceWith($tax_free, false, $user_country, false, self::$user_abo->user), 1),
|
|
false,
|
|
false,
|
|
['image' => '', 'slug' => $product->slug, 'weight' => $product->weight, 'points' => $product->points, 'no_commission' => $product->no_commission, 'show_on' => $product->show_on]
|
|
);
|
|
} else {
|
|
$cartItem = Yard::instance('shopping')
|
|
->add(
|
|
$product->id,
|
|
$product->getLang('name'),
|
|
$item->qty,
|
|
$product->getPriceWith($tax_free, true, $user_country, false, self::$user_abo->user),
|
|
false,
|
|
false,
|
|
['image' => '', 'slug' => $product->slug, 'weight' => $product->weight, 'points' => $product->points, 'no_commission' => $product->no_commission, 'show_on' => $product->show_on]
|
|
);
|
|
}
|
|
if ($tax_free) {
|
|
Yard::setTax($cartItem->rowId, 0);
|
|
} else {
|
|
Yard::setTax($cartItem->rowId, $product->getTaxWith($user_country));
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function checkNumOfCompProducts($user_abo)
|
|
{
|
|
|
|
if ($user_abo->is_for === 'me') {
|
|
$needNumComp = Yard::instance('shopping')->getNumComp();
|
|
if ($needNumComp > 0) {
|
|
$UserAboItems = UserAboItem::where('user_abo_id', $user_abo->id)->where('comp', '>', 0)->get();
|
|
if (count($UserAboItems) === $needNumComp) {
|
|
return true;
|
|
}
|
|
|
|
//need to add
|
|
if (count($UserAboItems) < $needNumComp) {
|
|
$product = Product::whereActive(true)->where('shipping_addon', true)->whereJsonContains('show_on', '12')->orderBy('pos', 'DESC')->first();
|
|
for ($i = count($UserAboItems); $i <= $needNumComp; $i++) {
|
|
$UserAboItem = UserAboItem::create([
|
|
'user_abo_id' => $user_abo->id,
|
|
'product_id' => $product->id,
|
|
'comp' => $i + 1,
|
|
'qty' => 1,
|
|
'status' => 1,
|
|
]);
|
|
self::addProductToCart($UserAboItem);
|
|
}
|
|
}
|
|
//need to remove
|
|
if (count($UserAboItems) > $needNumComp) {
|
|
foreach ($UserAboItems as $UserAboItem) {
|
|
if ($UserAboItem->comp > $needNumComp) {
|
|
$UserAboItem->delete();
|
|
}
|
|
}
|
|
foreach (Yard::instance('shopping')->content() as $row) {
|
|
if ($row->options->comp > $needNumComp) {
|
|
Yard::instance('shopping')->remove($row->rowId);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function getCustomerDetail()
|
|
{
|
|
return self::$customer_detail;
|
|
}
|
|
|
|
/* Need this, can change the address */
|
|
public static function makeCustomerDetail($user_abo)
|
|
{
|
|
|
|
if ($user_abo->is_for === 'me') {
|
|
//only on Abo!
|
|
$user = $user_abo->user;
|
|
|
|
// WICHTIG: Wenn bereits ein shopping_user existiert, diesen replizieren um alle Felder zu behalten
|
|
// Ansonsten neues Objekt erstellen
|
|
if ($user_abo->shopping_user) {
|
|
$shopping_user = $user_abo->shopping_user->replicate();
|
|
\Log::info('AboOrderCart::makeCustomerDetail: ShoppingUser repliziert für Abo ID: ' . $user_abo->id, [
|
|
'abo_id' => $user_abo->id,
|
|
'original_shopping_user_id' => $user_abo->shopping_user->id
|
|
]);
|
|
} else {
|
|
$shopping_user = new ShoppingUser();
|
|
\Log::info('AboOrderCart::makeCustomerDetail: Neuer ShoppingUser erstellt für Abo ID: ' . $user_abo->id);
|
|
}
|
|
|
|
// Account-Daten überschreiben/aktualisieren
|
|
$shopping_user->billing_salutation = $user->account->salutation;
|
|
$shopping_user->billing_company = $user->account->company;
|
|
$shopping_user->billing_firstname = $user->account->first_name;
|
|
$shopping_user->billing_lastname = $user->account->last_name;
|
|
$shopping_user->billing_address = $user->account->address;
|
|
$shopping_user->billing_address_2 = $user->account->address_2;
|
|
$shopping_user->billing_zipcode = $user->account->zipcode;
|
|
$shopping_user->billing_city = $user->account->city;
|
|
$shopping_user->billing_country_id = $user->account->country_id;
|
|
$shopping_user->billing_phone = $user->account->phone;
|
|
$shopping_user->billing_email = $user->email ?? null;
|
|
|
|
// Auth User ID setzen falls noch nicht gesetzt
|
|
if (!$shopping_user->auth_user_id) {
|
|
$shopping_user->auth_user_id = $user->id;
|
|
}
|
|
if ($user->account->same_as_billing) {
|
|
$shopping_user->shipping_salutation = $user->account->salutation;
|
|
$shopping_user->shipping_company = $user->account->company;
|
|
$shopping_user->shipping_firstname = $user->account->first_name;
|
|
$shopping_user->shipping_lastname = $user->account->last_name;
|
|
$shopping_user->shipping_address = $user->account->address;
|
|
$shopping_user->shipping_address_2 = $user->account->address_2;
|
|
$shopping_user->shipping_zipcode = $user->account->zipcode;
|
|
$shopping_user->shipping_city = $user->account->city;
|
|
$shopping_user->shipping_country_id = $user->account->country_id;
|
|
$shopping_user->shipping_phone = $user->account->phone;
|
|
$shopping_user->shipping_postnumber = $user->account->shipping_postnumber;
|
|
$shopping_user->same_as_billing = 1;
|
|
} else {
|
|
$shopping_user->shipping_salutation = $user->account->shipping_salutation;
|
|
$shopping_user->shipping_company = $user->account->shipping_company;
|
|
$shopping_user->shipping_firstname = $user->account->shipping_firstname;
|
|
$shopping_user->shipping_lastname = $user->account->shipping_lastname;
|
|
$shopping_user->shipping_address = $user->account->shipping_address;
|
|
$shopping_user->shipping_address_2 = $user->account->shipping_address_2;
|
|
$shopping_user->shipping_zipcode = $user->account->shipping_zipcode;
|
|
$shopping_user->shipping_city = $user->account->shipping_city;
|
|
$shopping_user->shipping_country_id = $user->account->shipping_country_id;
|
|
$shopping_user->shipping_phone = $user->account->shipping_phone;
|
|
$shopping_user->shipping_postnumber = $user->account->shipping_postnumber;
|
|
$shopping_user->same_as_billing = 0;
|
|
}
|
|
}
|
|
|
|
if ($user_abo->is_for === 'ot') {
|
|
//look for the primary user of this abo
|
|
$shopping_user = $user_abo->shopping_user->replicate();
|
|
}
|
|
return $shopping_user;
|
|
}
|
|
}
|