mein-sterntours/app/Models/Booking.php
2020-04-15 12:11:42 +02:00

712 lines
23 KiB
PHP

<?php
/**
* Created by Reliese Model.
*/
namespace App\Models;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
/**
* Class Booking
*
* @property int $id
* @property Carbon $booking_date
* @property int $customer_id
* @property int $lead_id
* @property bool $new_drafts
* @property int $sf_guard_user_id
* @property int $branch_id
* @property float $service_fee
* @property int $travel_country_id
* @property int $travel_category_id
* @property int $pax
* @property int $coupon_id
* @property Carbon $created_at
* @property Carbon $updated_at
* @property string $title
* @property Carbon $start_date
* @property Carbon $end_date
* @property int $website_id
* @property string $travel_number
* @property string $participant_name
* @property string $participant_firstname
* @property Carbon $participant_birthdate
* @property int $participant_salutation_id
* @property string $ev_number
* @property string $merlin_knr
* @property string $merlin_order_number
* @property int $travel_company_id
* @property bool $travel_documents
* @property float $price
* @property float $price_total
* @property float $deposit_total
* @property float $final_payment
* @property Carbon $final_payment_date
* @property int $travelagenda_id
* @property Branch $branch
* @property Coupon $coupon
* @property Customer $customer
* @property Lead $lead
* @property SfGuardUser $sf_guard_user
* @property TravelCategory $travel_category
* @property TravelCompany $travel_company
* @property TravelCountry $travel_country
* @property TravelAgenda $travel_agenda
* @property Collection|Arrangement[] $arrangements
* @property Collection|ArrangementType[] $arrangement_types
* @property Collection|BookingApplication[] $booking_applications
* @property Collection|BookingConfirmation[] $booking_confirmations
* @property Collection|BookingDraftItem[] $booking_draft_items
* @property Collection|BookingInvoice[] $booking_invoices
* @property Collection|BookingServiceItem[] $booking_service_items
* @property Collection|BookingVoucher[] $booking_vouchers
* @property Collection|Coupon[] $coupons
* @property Collection|InsuranceCertificate[] $insurance_certificates
* @property Collection|Participant[] $participants
* @property Collection|ServiceProviderEntry[] $service_provider_entries
* @property Collection|TravelInsurance[] $travel_insurances
* @package App\Models
* @property-read int|null $arrangement_types_count
* @property-read int|null $arrangements_count
* @property-read int|null $booking_draft_items_count
* @property-read int|null $booking_service_items_count
* @property-read int|null $coupons_count
* @property-read int|null $insurance_certificates_count
* @property-read int|null $participants_count
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking query()
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereBookingDate($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereBranchId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereCouponId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereCustomerId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereDepositTotal($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereEndDate($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereEvNumber($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereFinalPayment($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereFinalPaymentDate($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereLeadId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereMerlinKnr($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereMerlinOrderNumber($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereNewDrafts($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereParticipantBirthdate($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereParticipantFirstname($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereParticipantName($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereParticipantSalutationId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking wherePax($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking wherePrice($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking wherePriceTotal($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereServiceFee($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereSfGuardUserId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereStartDate($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereTitle($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereTravelCategoryId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereTravelCompanyId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereTravelCountryId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereTravelDocuments($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereTravelNumber($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereTravelagendaId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereWebsiteId($value)
* @mixin \Eloquent
* @property-read int|null $service_provider_entries_count
* @property float|null $canceled
* @property float|null $price_canceled
* @property int|null $paying_out
* @property int|null $paying_out_status
* @property int|null $airline_id
* @property int|null $refund
* @property \Illuminate\Support\Carbon|null $refund_date
* @property int|null $hold
* @property int|null $xx_tkt
* @property string|null $xx_tkt_date
* @property string|null $filekey
* @property-read \App\Models\Airline|null $airline
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\CustomerMail[] $customer_mails
* @property-read int|null $customer_mails_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\CustomerMail[] $customer_mails_sent_at
* @property-read int|null $customer_mails_sent_at_count
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereAirlineId($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereCanceled($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereFilekey($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereHold($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking wherePayingOut($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking wherePayingOutStatus($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking wherePriceCanceled($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereRefund($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereRefundDate($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereXxTkt($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereXxTktDate($value)
* @property int|null $is_rail_fly
* @property string|null $notice
* @property-read \App\Models\CustomerMail $customer_mail_last
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereIsRailFly($value)
* @method static \Illuminate\Database\Eloquent\Builder|\App\Models\Booking whereNotice($value)
* @property-read int|null $booking_applications_count
* @property-read int|null $booking_confirmations_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\BookingStorno[] $booking_stornos
* @property-read int|null $booking_stornos_count
* @property-read int|null $booking_vouchers_count
* @property-read int|null $travel_insurances_count
*/
class Booking extends Model
{
protected $connection = 'mysql';
protected $table = 'booking';
protected $casts = [
'customer_id' => 'int',
'lead_id' => 'int',
'new_drafts' => 'bool',
'sf_guard_user_id' => 'int',
'branch_id' => 'int',
'service_fee' => 'float',
'travel_country_id' => 'int',
'travel_category_id' => 'int',
'pax' => 'int',
'coupon_id' => 'int',
'website_id' => 'int',
'participant_salutation_id' => 'int',
'travel_company_id' => 'int',
'travel_documents' => 'bool',
'price' => 'float',
'price_total' => 'float',
'deposit_total' => 'float',
'final_payment' => 'float',
'travelagenda_id' => 'int',
'paying_out' => 'int',
'hold' => 'int',
'airline_id' => 'int',
'refund' => 'int',
'xx_tkt' => 'int',
];
protected $dates = [
'booking_date',
'start_date',
'end_date',
'participant_birthdate',
'final_payment_date',
'refund_date'
];
protected $fillable = [
'booking_date',
'customer_id',
'lead_id',
'new_drafts',
'sf_guard_user_id',
'branch_id',
'service_fee',
'travel_country_id',
'travel_category_id',
'pax',
'coupon_id',
'title',
'start_date',
'end_date',
'website_id',
'travel_number',
'participant_name',
'participant_firstname',
'participant_birthdate',
'participant_salutation_id',
'ev_number',
'merlin_knr',
'merlin_order_number',
'travel_company_id',
'travel_documents',
'price',
'price_total',
'deposit_total',
'final_payment',
'final_payment_date',
'travelagenda_id',
'paying_out',
'paying_out_status',
'airline_id',
'hold',
'refund',
'refund_date',
'xx_tkt',
'xx_tkt_date',
];
public static $paying_out_types = [
0 => '-',
1 => 'Gutschein',
2 => 'Auszahlung',
3 => 'Umbuchung',
4 => 'AZ + GS',
5 => 'AZ o. FP',
];
public static $refund_types = [
0 => '-',
1 => 'eingereicht',
2 => 'erledigt',
];
public static $xx_tkt_types = [
0 => '-',
1 => 'offen',
2 => 'erledigt',
];
public static $paying_out_status_types = [
0 => '-',
1 => 'offen',
2 => 'erledigt',
];
public static $customer_mail_dirs = [
0 => ['name' => 'Reisender', 'icon'=>'ion-ios-filing'],
1 => ['name' => 'Agentur', 'icon'=>'ion-ios-folder-open'],
2 => ['name' => 'Flug', 'icon'=>'ion-ios-airplane'],
3 => ['name' => 'Versicherung', 'icon'=>'ion-ios-help-buoy'],
11 => ['name' => 'Entwürfe', 'icon'=>'ion-md-create'],
12 => ['name' => 'Papierkorb', 'icon'=>'ion-md-trash'],
];
protected $paying_out_colors = [
0 => '',
1 => 'info',
2 => 'dark',
3 => 'warning',
4 => 'warning',
5 => 'warning',
];
protected $refund_colors = [
0 => '',
1 => 'warning',
2 => 'success',
];
protected $xx_tkt_colors = [
0 => '',
1 => 'danger',
2 => 'success',
];
protected $paying_out_status_colors = [
0 => '',
1 => 'danger',
2 => 'success',
];
/*
*
* <ul class="tabscontrol flatlist clearfix" id="tabscontrol">
<li class="tab"><a href="#customer" class="active"><?php echo __('Kunde') ?></a></li>
<?php if ($booking->relatedExists('Application')): ?>
<li class="tab"><a href="#application" class="active"><?php echo __('Reiseanmeldung') ?></a></li>
<?php endif; ?>
<?php if ($booking->relatedExists('Confirmation')): ?>
<li class="tab"><a href="#confirmation" class="active"><?php echo __('Reisebestätigung') ?></a></li>
<?php endif; ?>
<?php if ($booking->relatedExists('Invoice')): ?>
<li class="tab"><a href="#invoice" class="active"><?php echo __('Rechnung') ?></a></li>
<?php endif; ?>
<?php if ($booking->relatedExists('Storno')): ?>
<li class="tab"><a href="#storno" class="active"><?php echo __('Storno') ?></a></li>
<?php endif; ?>
<?php if ($booking->relatedExists('TravelInsurance')): ?>
<li class="tab"><a href="#travelinsurance" class="active"><?php echo __('Versicherung') ?></a></li>
<?php endif; ?>
<?php if ($booking->relatedExists('InsuranceCertificate')): ?>
<li class="tab"><a href="#insurance" class="active"><?php echo __('Sicherungsschein') ?></a></li>
<?php endif; ?>
<?php if ($booking->relatedExists('Voucher')): ?>
<li class="tab"><a href="#voucher" class="active"><?php echo __('Voucher') ?></a></li>
<?php endif; ?>
<?php if ($booking->relatedExists('Coupon')): ?>
<li class="tab"><a href="#coupon" class="active"><?php echo __('Gutscheine') ?></a></li>
<?php endif; ?>
*/
/*public function branch()
{
return $this->belongsTo(Branch::class);
}*/
public function coupon()
{
return $this->belongsTo(Coupon::class);
}
public function customer()
{
return $this->belongsTo(Customer::class);
}
public function lead()
{
return $this->belongsTo(Lead::class);
}
public function sf_guard_user()
{
return $this->belongsTo(SfGuardUser::class);
}
public function travel_category()
{
return $this->belongsTo(TravelCategory::class);
}
public function travel_company()
{
return $this->belongsTo(TravelCompany::class);
}
/* public function travel_country()
{
return $this->belongsTo(TravelCountry::class, 'travel_country_id', 'crm_id');
}*/
public function travel_country()
{
return $this->belongsTo(\App\Models\Sym\TravelCountry::class, 'travel_country_id', 'id');
}
public function travel_agenda()
{
return $this->belongsTo(TravelAgenda::class, 'travelagenda_id');
}
public function airline()
{
return $this->belongsTo(Airline::class, 'airline_id');
}
public function arrangements()
{
return $this->hasMany(Arrangement::class);
}
public function arrangement_types()
{
return $this->hasMany(ArrangementType::class);
}
public function booking_draft_items()
{
return $this->hasMany(BookingDraftItem::class)->orderBy('pos', 'ASC');
}
public function booking_service_items()
{
return $this->hasMany(BookingServiceItem::class);
}
public function coupons()
{
return $this->hasMany(Coupon::class);
}
public function insurance_certificates()
{
return $this->hasMany(InsuranceCertificate::class);
}
public function participants()
{
return $this->hasMany(Participant::class);
}
public function service_provider_entries()
{
return $this->hasMany(ServiceProviderEntry::class);
}
public function customer_mails()
{
return $this->hasMany(CustomerMail::class, 'booking_id', 'id');
}
public function customer_mails_sent_at()
{
return $this->hasMany(CustomerMail::class, 'booking_id')->orderBy('sent_at', 'ASC');
}
public function customer_mail_last()
{
return $this->hasOne(CustomerMail::class, 'booking_id')->latest();
}
public function booking_applications()
{
return $this->hasMany(BookingApplication::class);
}
public function booking_confirmations()
{
return $this->hasMany(BookingConfirmation::class);
}
public function booking_stornos()
{
return $this->hasMany(BookingStorno::class);
}
/*public function booking_invoices()
{
return $this->hasMany(BookingInvoice::class);
}*/
public function booking_vouchers()
{
return $this->hasMany(BookingVoucher::class);
}
public function travel_insurances()
{
return $this->hasMany(TravelInsurance::class);
}
public function calculate_price_total()
{
$travel_draft_item = false;
$travel_price_adult = 0;
$travel_price_children = 0;
$total_adult = 0;
$total_children = 0;
foreach ($this->booking_draft_items as $booking_draft_item) {
//24 Rundreise
if($booking_draft_item->draft_type_id == 24){
$travel_draft_item = $booking_draft_item;
continue;
}
$prices = $booking_draft_item->getItemPrice();
//Grundpreis Reise
if($booking_draft_item->draft_type_id == 30){
$travel_price_adult += $prices['adult'];
$travel_price_children += $prices['children'];
}
$total_adult += $prices['adult'];
$total_children += $prices['children'];
}
if($travel_draft_item){
$travel_draft_item->setPriceAdultRaw($travel_price_adult);
$travel_draft_item->setPriceChildrenRaw($travel_price_children);
$travel_draft_item->save();
}
$this->price = $total_adult + $total_children;
$this->save();
}
public function getPriceAttribute()
{
// 2 = decimal places | '.' = decimal seperator | ',' = thousand seperator
return number_format(($this->attributes['price']), 2, ',', '.');
}
public function getPriceRaw()
{
return $this->attributes['price'];
}
public function findBeforeDraftItemRelation($reid)
{
$before = false;
foreach($this->booking_draft_items as $booking_draft_items) {
if ($booking_draft_items->id == $reid) {
return $before;
}
$before = $booking_draft_items;
}
return false;
}
public function findAfterDraftItemRelation($reid)
{
$next = false;
foreach($this->booking_draft_items as $booking_draft_items) {
if($next){
return $booking_draft_items;
}
if ($booking_draft_items->id == $reid) {
$next = true;
}
}
return false;
}
public function getStartDateFormat(){
if(!$this->attributes['start_date']){ return ""; }
return Carbon::parse($this->attributes['start_date'])->format(\Util::formatDateDB());
}
public function getEndDateFormat(){
if(!$this->attributes['end_date']){ return ""; }
return Carbon::parse($this->attributes['end_date'])->format(\Util::formatDateDB());
}
public function getBookingDateFormat(){
if(!$this->attributes['booking_date']){ return ""; }
return Carbon::parse($this->attributes['booking_date'])->format(\Util::formatDateDB());
}
//erlös #getRevenueFactor
public function proceedsRaw(){
$total = 0;
foreach ($this->service_provider_entries as $entry)
{
$total += $entry->amount / $entry->factor;
}
return $this->attributes['price'] - $total;
}
//erlös #getRevenueFactor
public function proceeds(){
$proceeds = $this->attributes['price']
// - $this->getServiceTotal()
// - $this->getServiceFee()
- $this->getServiceProviderEntriesAmountFactorTotal();
return number_format(($proceeds), 2, ',', '.');
}
public function getServiceProviderEntriesAmountFactorTotal()
{
$total = 0;
foreach ($this->service_provider_entries as $entry)
{
$total += $entry->amount / $entry->factor;
}
return $total;
}
public function getServiceProviderPaymentsTotalRaw()
{
$total = 0;
foreach ($this->service_provider_entries as $entry)
{
$total += $entry->amount;
}
return $total;
}
public function getServiceProviderPaymentsTotal()
{
$total = 0;
foreach ($this->service_provider_entries as $entry)
{
$total += $entry->amount;
}
return number_format(($total), 2, ',', '.');
}
public function getKontoNumber(){
switch ($this->ev_number){
case 'E01':
return '4011';
break;
case 'E02':
return '4012';
break;
case 'E03':
return '4013';
break;
case 'E04':
return '4014';
break;
}
return $this->ev_number;
}
public function getBookingNumber()
{
if ($this->lead)
{
return $this->lead->id;
}
return null;
}
public function getPayingOutType(){
return isset(self::$paying_out_types[$this->paying_out]) ? self::$paying_out_types[$this->paying_out] : '-';
}
public function getPayingOutStatusType(){
return isset(self::$paying_out_status_types[$this->paying_out_status]) ? self::$paying_out_status_types[$this->paying_out_status] : '-';
}
public function getRefundType(){
return isset(self::$refund_types[$this->refund]) ? self::$refund_types[$this->refund] : '-';
}
public function getXxTktType(){
return isset(self::$xx_tkt_types[$this->xx_tkt]) ? self::$xx_tkt_types[$this->xx_tkt] : '-';
}
public function getXxTktTypeList(){
if(isset(self::$xx_tkt_types[$this->xx_tkt])){
if($this->xx_tkt == 1 && $this->xx_tkt_date){
return Carbon::parse($this->xx_tkt_date)->format('d.m.Y');
}
return self::$xx_tkt_types[$this->xx_tkt];
}
return "-";
}
public function getRefundTypeList(){
if(isset(self::$refund_types[$this->refund])){
if($this->refund == 1 && $this->refund_date){
return Carbon::parse($this->refund_date)->format('d.m.Y');
}
return self::$refund_types[$this->refund];
}
return "-";
}
public function getPayingOutColor(){
return isset($this->paying_out_colors[$this->paying_out]) ? $this->paying_out_colors[$this->paying_out] : '';
}
public function getPayingOutStatusColor(){
return isset($this->paying_out_status_colors[$this->paying_out_status]) ? $this->paying_out_status_colors[$this->paying_out_status] : '';
}
public function getRefundColor(){
return isset($this->refund_colors[$this->refund]) ? $this->refund_colors[$this->refund] : '-';
}
public function getXxTktColor(){
return isset($this->xx_tkt_colors[$this->xx_tkt]) ? $this->xx_tkt_colors[$this->xx_tkt] : '-';
}
public function countCustomerMailsBy($dir, $country=false){
if($dir === 11){
return $this->customer_mails->where('draft', true)->count();
}
if($country){
return $this->customer_mails->where('dir', $dir)->where('travel_country_id', $country)->count();
}
return $this->customer_mails->where('dir', $dir)->count();
}
}