314 lines
8.6 KiB
PHP
314 lines
8.6 KiB
PHP
<?php
|
|
|
|
namespace frontend\models;
|
|
|
|
use Yii;
|
|
use yii\base\Model;
|
|
use yii\base\Exception;
|
|
use common\models\Ticket;
|
|
use common\models\Account;
|
|
use common\models\TicketType;
|
|
use common\models\Transfer;
|
|
use common\models\Contract;
|
|
use common\models\TicketInstallmentRequest;
|
|
use common\models\Discount;
|
|
use common\models\ShoppingCart;
|
|
|
|
/**
|
|
* ContactForm is the model behind the contact form.
|
|
*/
|
|
class ContractForm extends Model {
|
|
public $name;
|
|
public $birthdate;
|
|
public $birthplace;
|
|
public $mothername;
|
|
public $zip;
|
|
public $city;
|
|
public $address;
|
|
public $bank_account;
|
|
public $bank_name;
|
|
public $phone;
|
|
public $email;
|
|
public $ticket_type;
|
|
public $customer;
|
|
public $payment_method;
|
|
public $id_discount;
|
|
private $ticket;
|
|
private $transfer;
|
|
public $contract;
|
|
private $ticketType;
|
|
private $money;
|
|
private $discount;
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function rules() {
|
|
return [
|
|
// name, email, subject and body are required
|
|
[
|
|
[
|
|
'ticket_type',
|
|
'name',
|
|
'birthdate',
|
|
'birthplace',
|
|
'mothername',
|
|
"zip",
|
|
"city",
|
|
"address",
|
|
"bank_account",
|
|
"bank_name",
|
|
'phone',
|
|
'email',
|
|
'payment_method'
|
|
],
|
|
'required'
|
|
],
|
|
// email has to be a valid email address
|
|
[
|
|
'email',
|
|
'email'
|
|
],
|
|
[
|
|
'ticket_type',
|
|
'integer'
|
|
],
|
|
[
|
|
[
|
|
'phone'
|
|
],
|
|
'string',
|
|
'max' => 20
|
|
],
|
|
[
|
|
[
|
|
'bank_account'
|
|
],
|
|
'string',
|
|
'max' => 24
|
|
],
|
|
[
|
|
[
|
|
'bank_name'
|
|
],
|
|
'string',
|
|
'max' => 100
|
|
],
|
|
[
|
|
[
|
|
'mothername',
|
|
'birthplace',
|
|
'name',
|
|
'zip',
|
|
'city',
|
|
'address'
|
|
],
|
|
'string',
|
|
'max' => 100
|
|
],
|
|
[
|
|
[
|
|
'birthdate'
|
|
],
|
|
'date'
|
|
],
|
|
[
|
|
[
|
|
'ticket_type',
|
|
'id_discount',
|
|
'payment_method'
|
|
],
|
|
'integer'
|
|
],
|
|
[
|
|
[
|
|
'ticket_type'
|
|
],
|
|
'validateTicketType'
|
|
]
|
|
];
|
|
}
|
|
public function validateTicketType($attribute, $params) {
|
|
$this->ticketType = TicketType::findOne ( $this->ticket_type );
|
|
if (! isset ( $this->ticketType )) {
|
|
$this->addError ( $attribute, "Bérlet típus nem található" );
|
|
}else{
|
|
$contracts = Contract::find()->andWhere(['>' ,'contract.expired_at', date('Y-m-d')])->andWhere(['not in' ,'contract.flag',[Contract::$FLAG_DELETED]])->all();
|
|
if ( count($contracts) > 0 ){
|
|
$this->addError( $attribute , "Már van érvényes vagy lemondott szerződés az adott időszakban");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function attributeLabels() {
|
|
return [
|
|
'name' => 'Név',
|
|
'birthdate' => 'Születési dátum',
|
|
'birthplace' => 'Születési hely',
|
|
'mothername' => 'Anyja neve',
|
|
'zip' => 'Irányítószám',
|
|
'city' => 'Város',
|
|
'address' => 'Cím',
|
|
'bank_account' => 'Bankszámlaszám',
|
|
'bank_name' => 'Bank neve',
|
|
'phone' => 'Telefonszám',
|
|
'email' => 'E-mail',
|
|
'ticket_type' => 'Bérlet típus' ,
|
|
'payment_method' => 'Fizetési mód (első bérlet)' ,
|
|
'id_discount' => 'Kedvezmény' ,
|
|
];
|
|
}
|
|
public function fillOut() {
|
|
$this->name = $this->customer->name;
|
|
$this->birthdate = isset ( $this->customer->birthdate ) ? \Yii::$app->formatter->asDate ( $this->customer->birthdate ) : '';
|
|
$this->birthplace = $this->customer->birth_place;
|
|
$this->mothername = $this->customer->mother_name;
|
|
$this->zip = $this->customer->zip;
|
|
$this->city = $this->customer->city;
|
|
$this->address = $this->customer->address;
|
|
$this->bank_account = $this->customer->bank_account;
|
|
$this->bank_name = $this->customer->bank_name;
|
|
$this->phone = $this->customer->phone;
|
|
$this->email = $this->customer->email;
|
|
}
|
|
public function make() {
|
|
$this->money = $this->ticketType->price_brutto;
|
|
$this->discount = Discount::findOne($this->id_discount);
|
|
if ( isset($this->discount)){
|
|
$this->money = Discount::applyDiscount($this->ticketType->price_brutto, $this->discount);
|
|
}
|
|
$this->updateCustomer ();
|
|
|
|
|
|
$this->createTicket ();
|
|
$this->createTransfer ();
|
|
$this->appendToCustomerCart();
|
|
$this->addContract();
|
|
|
|
$this->ticket->id_contract = $this->contract->id_contract;
|
|
|
|
if ( !$this->ticket->update(false)){
|
|
\Yii::error("Nem sikerült a bérlethez hozzárendelni a szerződést");
|
|
throw new Exception("Hiba történt mentés közben!");
|
|
}
|
|
|
|
return true;
|
|
}
|
|
public function updateCustomer() {
|
|
$this->customer->name = $this->name;
|
|
$this->customer->birthdate = $this->birthdate;
|
|
$this->customer->birth_place = $this->birthplace;
|
|
$this->customer->mother_name = $this->mothername;
|
|
$this->customer->zip = $this->zip;
|
|
$this->customer->city = $this->city;
|
|
$this->customer->address = $this->address;
|
|
$this->customer->bank_account = $this->bank_account;
|
|
$this->customer->bank_name = $this->bank_name;
|
|
$this->customer->phone = $this->phone;
|
|
$this->customer->email = $this->email;
|
|
|
|
if (! $this->customer->save ( false )) {
|
|
throw new Exception ( 'nem sikerült a szerződés létrehozása' );
|
|
}
|
|
}
|
|
public function createTicket() {
|
|
|
|
$ticket = new Ticket ();
|
|
$ticket->id_user = \Yii::$app->user->id;
|
|
$ticket->id_account = Account::readDefault ();
|
|
$ticket->id_discount = $this->id_discount;
|
|
$ticket->start = date ( 'Y-m-d' );
|
|
$date = new \DateTime ();
|
|
$date->modify ( '+1 month' );
|
|
$date->modify ( '-1 day' );
|
|
$ticket->end = $date->format ( 'Y-m-d H:i:s' );
|
|
$ticket->id_ticket_type = $this->ticketType->id_ticket_type;
|
|
$ticket->price_brutto = $this->money;
|
|
$ticket->max_usage_count = $this->ticketType->max_usage_count;
|
|
$ticket->usage_count = 0;
|
|
$ticket->status = Ticket::STATUS_ACTIVE;
|
|
$ticket->comment = "Szerződéses bérlet";
|
|
$ticket->id_card = $this->customer->card->id_card;
|
|
$ticket->part = 0;
|
|
$ticket->part_paid = 0;
|
|
$ticket->part_count = $this->ticketType->installment_count;
|
|
|
|
if (! $ticket->save ( false )) {
|
|
\Yii::error ( "A bérlet mentése sikertelen volt" );
|
|
throw new Exception ( "Hiba történt mentés közben" );
|
|
}
|
|
|
|
$this->ticket = $ticket;
|
|
}
|
|
public function createTransfer() {
|
|
$transfer = new Transfer ();
|
|
$transfer->id_object = $this->ticket->id_ticket;
|
|
$transfer->status = Transfer::STATUS_NOT_PAID;
|
|
$transfer->type = Transfer::TYPE_TICKET;
|
|
$transfer->item_price = $this->money;
|
|
$transfer->count = 1;
|
|
$transfer->money = $this->money;
|
|
$transfer->id_user = \Yii::$app->user->id;
|
|
$transfer->comment = "Szerződéses bérlet";
|
|
$transfer->id_account = Account::readDefault ();
|
|
$transfer->direction = Transfer::DIRECTION_IN;
|
|
$transfer->id_customer = $this->customer->id_customer;
|
|
$transfer->payment_method = $this->payment_method;
|
|
$transfer->id_discount = $this->id_discount;
|
|
|
|
if (! $transfer->save ( false )) {
|
|
\Yii::error ( "A tranzakció mentése sikertelen volt" );
|
|
throw new Exception ( "Hiba történt mentés közben" );
|
|
}
|
|
$this->transfer = $transfer;
|
|
}
|
|
|
|
public function addContract() {
|
|
if (! $this->ticketType->isInstallment ()) {
|
|
\Yii::error ( "A bérlet típus nem tágmogatja a szerződés kötést!" );
|
|
throw new Exception ( "A bérlet típus nem tágmogatja a szerződés kötést!" );
|
|
}
|
|
|
|
$contract = new Contract ();
|
|
$contract->id_customer = $this->customer->id_customer;
|
|
$contract->id_user = \Yii::$app->user->id;
|
|
$contract->status = Contract::$STATUS_PAID;
|
|
$contract->flag = Contract::$FLAG_ACTIVE;
|
|
$contract->part_count = $this->ticketType->installment_count;
|
|
$contract->part_paid = 0;
|
|
$contract->part_required = 0;
|
|
$contract->expired_at = date ( 'Y-m-d', strtotime ( "today +12 month -1 day" ) );
|
|
$contract->id_ticket_type = $this->ticketType->id_ticket_type;
|
|
|
|
if (! $contract->save ( false )) {
|
|
\Yii::error ( "A szerződés mentése sikertelen volt" );
|
|
throw new Exception ( "Hiba történt mentés közben" );
|
|
}
|
|
|
|
$this->contract = $contract;
|
|
|
|
$requests = TicketInstallmentRequest::createInstallments ( $this->ticket, $this->ticketType, $this->customer, $contract );
|
|
foreach ( $requests as $request ) {
|
|
$request->save ( false );
|
|
if (! $request->save ( false )) {
|
|
\Yii::error ( "A szerződés részlet mentése sikertelen volt" );
|
|
throw new Exception ( "Hiba történt mentés közben" );
|
|
}
|
|
}
|
|
}
|
|
|
|
public function appendToCustomerCart(){
|
|
$item = new ShoppingCart();
|
|
$item->id_customer = $this->customer->id_customer;
|
|
$item->id_transfer = $this->transfer->id_transfer;
|
|
if ( !$item->save(false) ){
|
|
\Yii::error("Vendég kosár hozzárendelés sikertelen!");
|
|
throw new Exception ( "Hiba történt mentés közben" );
|
|
}
|
|
|
|
}
|
|
}
|