mivita/dev/app-bak/Repositories/CreditRepository.php
2025-10-20 17:42:08 +02:00

369 lines
No EOL
15 KiB
PHP

<?php
namespace App\Repositories;
use PDF;
use Storage;
use App\User;
use App\Services\Credit;
use App\Models\UserCredit;
use Response;
use App\Libraries\MyPDFMerger;
use App\Models\UserCreditItem;
use App\Models\UserSalesVolume;
use App\Libraries\CreditDetailsPDF;
use App\Services\BusinessPlan\TreeCalcBot;
class CreditRepository extends BaseRepository {
private $user_credit;
public function __construct(User $model)
{
$this->model = $model;
}
public function create($request = [])
{
//need invoice $data
$number = Credit::getCreditNumber();
$credit_date = isset($request['credit_date']) ? $request['credit_date'] : \Carbon::now()->format("d.m.Y");
$credit_send_mail = isset($request['credit_send_mail']) ? true: false;
$credit_number = Credit::createCreditNumber($number, $credit_date);
$this->user_credit = new UserCredit();
$user_credit_items = $this->makeUserCredit();
if(!count($user_credit_items)){
return false;
}
$data = [
'user' => $this->model,
'credit_date' => $credit_date,
'credit_number' => $credit_number,
'user_credits' => $this->user_credit,
'user_credit_items' => $user_credit_items,
];
$pdf = PDF::loadView('pdf.credit', $data);
$pdf->setPaper('A4', 'portrait');
$dir = Credit::getCreditStorageDir($credit_date);
if(!Storage::disk('public')->exists( $dir )){
Storage::disk('public')->makeDirectory($dir); //creates directory
}
$path = Storage::disk('public')->path('');
$filename = Credit::makeCreditFilename($credit_number);
$pdf->save($path.$dir.$filename);
$pdfMerger = new MyPDFMerger();
$pdfMerger->addPDF($path.$dir.$filename);
$file = $pdfMerger->myMerge('string', $filename, 'template_invoice_de');
Storage::disk('public')->put($dir.$filename, $file);
$this->user_credit->user_id = $this->model->id;
$this->user_credit->year = \Carbon::parse($credit_date)->format('Y');
$this->user_credit->month = \Carbon::parse($credit_date)->format('n');
$this->user_credit->date = $credit_date;
$this->user_credit->filename = $filename;
$this->user_credit->dir = $dir;
$this->user_credit->disk = 'public';
$this->user_credit->number = $number;
$this->user_credit->full_number = $credit_number;
$this->user_credit->save();
if($credit_send_mail){
Credit::sendCreditMail($this->user_credit);
}
$this->finishUserCredit($this->user_credit->id, $user_credit_items);
return true;
}
private function finishUserCredit($user_credit_id, $user_credit_items){
//next credits
Credit::makeNextCreditNumber();
//mark as payed
//$UserCreditItems = UserCreditItem::where('user_id', $this->model->id)->wherePaid(false)->get();
foreach($user_credit_items as $user_credit_item){
$user_credit_item->paid = true;
$user_credit_item->user_credit_id = $user_credit_id;
$user_credit_item->save();
}
}
private function makeUserCredit(){
$this->user_credit->net = 0;
$this->user_credit->infos = [];
$infos = [];
$user_credit_items = [];
$UserCreditItems = UserCreditItem::where('user_id', $this->model->id)->wherePaid(false)->get();
foreach($UserCreditItems as $userCreditItem){
$user_credit_items[] = $userCreditItem;
$infos[] = ['id' => $userCreditItem->id, 'credit' => $userCreditItem->credit];
$this->user_credit->net += $userCreditItem->credit;
}
/* taxable_sales //user tax
1 //umsatzsteuerpflichtig / DE
2 // nicht umsatzsteuerpflichtig /DE
3 // nicht umsatzsteuerpflichtig / Ausland
*/
if($this->model->account){
$this->user_credit->taxable = $this->model->account->taxable_sales;
if($this->model->account->country_id !== 1){
$this->user_credit->taxable = 3;
}
if($this->user_credit->taxable === 1){
$this->user_credit->tax_rate = config('app.main_tax_rate');
$this->user_credit->total = round($this->user_credit->net * config('app.main_tax'), 2);
$this->user_credit->tax = $this->user_credit->total - $this->user_credit->net;
}else{
$this->user_credit->tax_rate = 0;
$this->user_credit->total = $this->user_credit->net;
$this->user_credit->tax = 0;
}
}
$this->user_credit->infos = $infos;
return $user_credit_items;
}
/*
Erstellt einen detalierten Report zur Gutschrift
Alle Postionen werden einzeln aufgelistet
//$do ?= html, pdf
*/
public function create_report(UserCredit $user_credit, $do = 'html')
{
//collect all data
$collection = new \stdClass();
$collection->calc_bot = [];
$collection->commission_shop = [];
$collection->commission_payline = [];
$collection->commission_growth_bonus = [];
$collection->own_order = [];
$collection->commission_registration = [];
$collection->commission_credit = [];
$dates = [];
/* für jede Postion aus der Gutschrift nach Status */
foreach($user_credit->user_credit_items as $user_credit_item){
$date = $user_credit_item->from_month.'-'.$user_credit_item->from_year;
if(!isset($dates[$date])){
$dates[$date] = ['year' => $user_credit_item->from_year, 'month' => $user_credit_item->from_month];
}
/*
//calc bot for the month year
*/
if(!isset($collection->calc_bot[$date])){
$TreeCalcBot = new TreeCalcBot($user_credit_item->from_month, $user_credit_item->from_year, 'admin');
$TreeCalcBot->initBusinesslUserDetail($user_credit->user);
$TreeCalcBot->initStructureUser($user_credit->user->id);
$collection->calc_bot[$date] = $TreeCalcBot;
}
/*
status === 1 commission_shop
Auswertung der Shopbestellungen vom User für einen Monat / Jahr
Auslistung der Positonen / Gesamter Umsatz / Marge / Provision
*/
if($user_credit_item->status === 1){
$user_sales_volumes = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $user_credit_item->from_month)
->where('year', $user_credit_item->from_year)
->where('status', 2) //'shoporder', //hinzugefügt aus
->orderBy('id', 'ASC')->get();
$user_sales_volumes_total = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $user_credit_item->from_month)
->where('year', $user_credit_item->from_year)
->where('status', 2) //'shoporder', //hinzugefügt aus
->orderBy('id', 'DESC')->first();
$obj = new \stdClass();
$obj->user_sales_volumes = $user_sales_volumes;
$obj->user_sales_volumes_total = $user_sales_volumes_total;
$obj->user_credit_item = $user_credit_item;
$collection->commission_shop[$date] = $obj;
/*
UserSalesVolume::status
4 => 'credit', //hinzugefügt aus //VE == status_turnover 2 shop verrechnung
Listen der hinzufegügten Gutschriften vom User für einen Monat / Jahr
*/
$user_sales_volumes_credit = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $user_credit_item->from_month)
->where('year', $user_credit_item->from_year)
->where('status', 4) //'credit', //hinzugefügt aus
->where('status_turnover', 2) //VE shop
->orderBy('id', 'ASC')->get();
$collection->commission_credit[$date] = $user_sales_volumes_credit;
}
/*
status === 2 commission_payline
Auswertung der Payline nach der Struktur vom User für einen Monat / Jahr
Auslistung aller Berater mit Gesamter Umsatz / Provision / rang
*/
/*
status === 5 commission_growth_bonus
Auswertung der Payline nach der Struktur vom User für einen Monat / Jahr
Auslistung aller Berater mit Gesamter Umsatz / Provision / rang
*/
}
/*
nicht enhalten in der Gutschrift
für alle Monate / Jahr die in der Gutschrift enthalten sind
*/
foreach($dates as $date => $dateObj){
/*
UserSalesVolume::status
1 => 'advisor_order', own_order //hinzugefügt aus
Listen der Beraterbestellungen vom User für einen Monat / Jahr
*/
$user_sales_volumes = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $dateObj['month'])
->where('year', $dateObj['year'])
->where('status', 1) //'own_order', //hinzugefügt aus
->orderBy('id', 'ASC')->get();
$credit_total_net = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $dateObj['month'])
->where('year', $dateObj['year'])
->where('status', 1) //'own_order', //hinzugefügt aus
->sum('total_net'); //sum('total_net');
$credit_total_points = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $dateObj['month'])
->where('year', $dateObj['year'])
->where('status', 1) //'own_order', //hinzugefügt aus
->sum('points'); //sum('points');
if($user_sales_volumes->count() > 0){
$obj = new \stdClass();
$obj->user_sales_volumes = $user_sales_volumes;
$obj->credit_total_net = $credit_total_net;
$obj->credit_total_points = $credit_total_points;
$collection->own_order[$date] = $obj;
}
/*
UserSalesVolume::status
5 => 'registration', //hinzugefügt aus
Listen der Gutschriften aus Reg vom User für einen Monat / Jahr
Enthält nur Punkte wird separat aufgeführt
turnover = immer E / 1 verrechnung mit Eigenem Umsatz
*/
$user_sales_volumes = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $dateObj['month'])
->where('year', $dateObj['year'])
->where('status', 5) //'registration', //hinzugefügt aus
->orderBy('id', 'ASC')->get();
$credit_total_net = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $dateObj['month'])
->where('year', $dateObj['year'])
->where('status', 5) //'registration', //hinzugefügt aus
->sum('total_net'); //sum('total_net');
$credit_total_points = UserSalesVolume::where('user_id', $user_credit_item->user_id)
->where('month', $dateObj['month'])
->where('year', $dateObj['year'])
->where('status', 5) //'registration', //hinzugefügt aus
->sum('points'); //sum('points');
if($user_sales_volumes->count() > 0){
$obj = new \stdClass();
$obj->user_sales_volumes = $user_sales_volumes;
$obj->credit_total_net = $credit_total_net;
$obj->credit_total_points = $credit_total_points;
$collection->commission_registration[$date] = $obj;
}
}
/*
//need this?
$user_credit_item->status = 3; //credit_added
$user_credit_item->status = 4; //commission
*/
$data = [
'dates' => $dates,
'user_credit' => $user_credit,
'collection' => $collection,
];
if($do === 'html'){
return view('admin.payment.credit_detail', $data);
}
if($do === 'pdf'){
$dir = Credit::getCreditDetailStorageDir($user_credit->date);
if(!Storage::disk('public')->exists( $dir )){
Storage::disk('public')->makeDirectory($dir); //creates directory
}
$path = Storage::disk('public')->path('');
$filename = Credit::makeCreditDetailFilename($user_credit->full_number);
$pdf = new CreditDetailsPDF('pdf.credit_details');
//return $pdf->create($data, 'credit_details.pdf', 'stream');
$pdf->create($data, $filename, 'save', $path.$dir);
/*$pdf = PDF::loadView('pdf.credit', $data);
$pdf->setPaper('A4', 'portrait');
$pdf->save($path.$dir.$filename);*/
$pdfMerger = new MyPDFMerger();
$pdfMerger->addPDF($path.$dir.$filename);
$file = $pdfMerger->myMerge('string', $filename, 'template_report_de');
Storage::disk('public')->put($dir.$filename, $file);
$path = $dir.$filename;
//$file = Storage::disk('public')->get($path);
$mime = Storage::disk('public')->mimeType($path);
return Response::make($file, 200)
->header("Content-Type", $mime)
->header('Content-disposition','inline; filename="'.$filename.'"');
//return $dir.$filename;
/*
$dir = Credit::getCreditStorageDir($credit_date);
if(!Storage::disk('public')->exists( $dir )){
Storage::disk('public')->makeDirectory($dir); //creates directory
}
$path = Storage::disk('public')->path('');
$filename = Credit::makeCreditFilename($credit_number);
$pdf->save($path.$dir.$filename);
$pdfMerger = new MyPDFMerger();
$pdfMerger->addPDF($path.$dir.$filename);
$file = $pdfMerger->myMerge('string', $filename, 'template_invoice_de');
Storage::disk('public')->put($dir.$filename, $file);
*/
}
}
}