20 ], [ [ 'bank_account' ], 'string', 'max' => 24 ], [ [ 'bank_account' ], 'validateBankAccount', ], [ [ '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' ] , [[ 'started_at', ], 'date', 'format' =>Yii::$app->formatter->dateFormat , 'timestampAttribute' => 'timestampStart' ,'timestampAttributeFormat' => 'yyyy-MM-dd' ,'timeZone' => 'UTC' ], ]; } public function validateBankAccount($attribute, $params) { if ( !is_numeric($this->bank_account)){ $this->addError( $attribute, "A bankszámlaszám csak számokat tartalmazhat!"); }else{ if ( !( strlen($this->bank_account) == 16 || strlen($this->bank_account) == 24 ) ){ $this->addError($attribute,"Bankszámlaszám 16 vagy 24 hosszú!"); } } } 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::getFlagsDoesNotProhibitNewContract() ]) ->andWhere(['contract.id_customer' => $this->customer->id_customer])->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' , 'started_at' => 'Érvényesség kezdete' , ]; } 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 = $this->getUserId(); $ticket->id_account = $this->getAccountId(); $ticket->id_discount = $this->id_discount; $ticket->start = $this->started_at; $date = new \DateTime ( $this->timestampStart); $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 = $this->getUserId(); $transfer->comment = "Szerződéses bérlet"; $transfer->id_account = $this->getAccountId(); $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 = $this->getUserId(); $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->started_at = $this->started_at; $date = new \DateTime( $this->timestampStart ); $date->modify ( '+1 year' ); $date->modify ( '-1 day' ); $date->setTime(0, 0, 0); $contract->expired_at = $date->format ( 'Y-m-d H:i:s' ); $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" ); } } protected function getUserId(){ if ( isset($this->idUser)){ return $this->idUser; } return \Yii::$app->user->id; } protected function getAccountId(){ if ( isset($this->idAccount)){ return $this->idAccount; } return Account::readDefault(); } }