mivita/app/Services/AboOrderCart.php
2025-04-01 10:36:47 +02:00

201 lines
No EOL
8.8 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){
self::$user_abo = $user_abo;
Yard::instance('shopping')->destroy();
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)
{
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';
}
foreach($user_abo->user_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;
$shopping_user = new ShoppingUser();
$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;
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;
}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;
}
}
if($user_abo->is_for === 'ot'){
//look for the primary user of this abo
$shopping_user = $user_abo->shopping_user->replicate();
}
return $shopping_user;
}
}