Example #1
0
 public function __construct($name = 'partner')
 {
     parent::__construct($name);
     $this->setAttribute('method', 'post');
     $this->setAttribute('class', 'form-horizontal');
     $this->setAttribute('id', 'partner');
     $this->setAttribute('data-loading-text', 'It creates ...');
     $this->add(['name' => 'partner_name', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Partner Name', 'required' => true], 'attributes' => ['class' => 'form-control', 'id' => 'partner_name']]);
     $this->add(['name' => 'business_model', 'type' => 'Zend\\Form\\Element\\Select', 'options' => ['label' => 'Business Model', 'value_options' => PartnerService::getBusinessModels()], 'attributes' => ['class' => 'form-control', 'id' => 'business_model']]);
     $this->add(['name' => 'contact_name', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Contact Name', 'required' => true], 'attributes' => ['class' => 'form-control', 'id' => 'contact_name']]);
     $this->add(['name' => 'email', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Email', 'required' => false], 'attributes' => ['class' => 'form-control', 'id' => 'email']]);
     $this->add(['name' => 'mobile', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Mobile', 'prependText' => '+'], 'attributes' => ['class' => 'form-control', 'id' => 'mobile']]);
     $this->add(['name' => 'phone', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Phone', 'prependText' => '+'], 'attributes' => ['class' => 'form-control', 'id' => 'phone']]);
     $this->add(['name' => 'cubilis_id', 'attributes' => ['id' => 'cubilis_id'], 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Cubilis ID']]);
     $this->add(['name' => 'commission', 'type' => 'Zend\\Form\\Element\\Select', 'options' => ['label' => 'Default (%)', 'value_options' => $this->getSelectPercentValues(), 'required' => true], 'attributes' => ['class' => 'form-control', 'id' => 'commission']]);
     $this->add(['name' => 'additional_tax_commission', 'type' => 'Zend\\Form\\Element\\Checkbox', 'options' => ['use_hidden_element' => true, 'checked_value' => '1', 'unchecked_value' => '0'], 'attributes' => ['id' => 'additional_tax_commission']]);
     $this->add(['name' => 'is_ota', 'type' => 'Zend\\Form\\Element\\Checkbox', 'options' => ['label' => 'Schema Available', 'use_hidden_element' => true, 'checked_value' => '1', 'unchecked_value' => '0'], 'attributes' => ['id' => 'is_ota']]);
     $this->add(['name' => 'apply_fuzzy_logic', 'type' => 'Zend\\Form\\Element\\Checkbox', 'options' => ['label' => 'Take Channel Price', 'use_hidden_element' => true, 'checked_value' => '1', 'unchecked_value' => '0'], 'attributes' => ['id' => 'apply_fuzzy_logic']]);
     $this->add(['name' => 'is_deducted_commission', 'type' => 'Zend\\Form\\Element\\Checkbox', 'options' => ['label' => 'Deducted Commission', 'use_hidden_element' => true, 'checked_value' => '1', 'unchecked_value' => '0'], 'attributes' => ['id' => 'is_deducted_commission']]);
     $this->add(['name' => 'show_partner', 'type' => 'Zend\\Form\\Element\\Checkbox', 'options' => ['label' => 'Display Name', 'use_hidden_element' => true, 'checked_value' => '1', 'unchecked_value' => '0'], 'attributes' => ['id' => 'show_partner']]);
     $this->add(['name' => 'account_holder_name', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Account Holder Name'], 'attributes' => ['class' => 'form-control', 'id' => 'account_holder_name']]);
     $this->add(['name' => 'bank_bsr', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'BIC/SWIFT/Routing'], 'attributes' => ['class' => 'form-control', 'id' => 'bank_bsr']]);
     $this->add(['name' => 'bank_account_num', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Account Number (IBAN)'], 'attributes' => ['class' => 'form-control', 'id' => 'bank_account_num']]);
     $this->add(['name' => 'discount_num', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'Discount (%)'], 'attributes' => ['class' => 'form-control', 'id' => 'discount_num']]);
     $this->add(['name' => 'create_date', 'type' => 'Zend\\Form\\Element\\Text', 'attributes' => ['disabled' => true], 'options' => ['label' => 'Create Date'], 'attributes' => ['class' => 'form-control', 'id' => 'create_date']]);
     $this->add(['name' => 'partner-number', 'type' => 'Zend\\Form\\Element\\Text', 'options' => ['label' => 'GID'], 'attributes' => ['class' => 'form-control', 'id' => 'partner-number', 'readonly' => 'readonly']]);
     $this->add(['name' => 'notes', 'type' => 'Zend\\Form\\Element\\Textarea', 'attributes' => ['id' => 'notes', 'rows' => '10', 'class' => 'form-control'], 'options' => ['label' => 'Notes']]);
     $this->add(['name' => 'open', 'type' => 'Zend\\Form\\Element\\Button', 'attributes' => ['id' => 'openPartner'], 'options' => ['label' => 'Website as affiliate']]);
     $this->add(['name' => 'submit', 'type' => 'Zend\\Form\\Element\\Button', 'attributes' => ['id' => 'savePartner', 'data-loading-text' => 'Saving...', 'class' => 'col-sm-2 col-xs-12 btn btn-primary margin-left-10 pull-right administration-tab-btn commission-tab-btn', 'value' => 'Save Changes'], 'options' => ['label' => 'Save Changes']]);
     $this->add(['name' => 'delete', 'type' => 'Zend\\Form\\Element\\Button', 'attributes' => ['id' => 'deletePartner', 'data-toggle' => 'modal', 'href' => '#deletePartner', 'value' => '#deletePartner'], 'options' => ['label' => 'Delete Partner']]);
 }
Example #2
0
 /**
  * @param array $data
  * @return bool
  */
 public function saveFrontierCharge($data)
 {
     /**
      * @var \DDD\Dao\Booking\Booking $bookingDao
      * @var \Library\Authentication\BackofficeAuthenticationService $authenticationService
      * @var \DDD\Dao\Booking\Charge $chargingDao
      * @var BankTransaction $serviceTransaction
      * @var Logger $logger
      * @var \DDD\Service\Booking\BookingAddon $addonService
      * @var \DDD\Dao\ApartmentGroup\ApartmentGroup $apartmentManagementDao
      */
     $addonService = $this->getServiceLocator()->get('service_booking_booking_addon');
     $serviceTransaction = $this->getServiceLocator()->get('service_booking_bank_transaction');
     $bookingDao = $this->getServiceLocator()->get('dao_booking_booking');
     $logger = $this->getServiceLocator()->get('ActionLogger');
     $apartmentManagementDao = $this->getServiceLocator()->get('dao_apartment_group_apartment_group');
     if (!isset($data['bookingId']) || !($rowBooking = $bookingDao->getBookingForFrontierCharge($data['bookingId'])) || !$data['cc_id']) {
         return false;
     }
     $authenticationService = $this->getServiceLocator()->get('library_backoffice_auth');
     $loggedInUserID = $authenticationService->getIdentity()->id;
     $chargingDao = $this->getServiceLocator()->get('dao_booking_charge');
     $parkingInventoryDao = $this->getServiceLocator()->get('dao_parking_spot_inventory');
     $addons = $addonService->getAddonsArray();
     $groupId = isset($data['groupId']) ? (int) $data['groupId'] : 0;
     $pspId = $apartmentManagementDao->getPsp($groupId);
     /**
      * @var Psp $pspService
      */
     $pspService = $this->getServiceLocator()->get('service_psp');
     $pspInfo = $pspService->getPspInfo($pspId);
     try {
         $chargingDao->beginTransaction();
         if (isset($data['accommodation_amount'])) {
             foreach ($data['accommodation_amount'] as $key => $value) {
                 if (isset($data['entityId'][$key]) && (int) $data['entityId'][$key] > 0) {
                     if ((int) $data['addonstype'][$key] == Constants::ADDONS_PARKING) {
                         $isAvailable = $parkingInventoryDao->getSpotInventoryAvailability($data['entityId'][$key], $data['nightDate'][$key]);
                         if (!$isAvailable) {
                             return false;
                         }
                     }
                 }
             }
             $params = ['reservation_id' => $rowBooking['id'], 'date' => date('Y-m-d H:i:s'), 'user_id' => $loggedInUserID, 'comment' => Helper::setLog('commentWithoutData', $data['charge_comment']), 'acc_currency' => $rowBooking['apartment_currency_code'], 'type' => 'n', 'apartment_id' => $rowBooking['apartment_id_assigned']];
             // set business model
             if ($rowBooking['model'] == PartnerService::BUSINESS_MODEL_GINOSI_COLLECT) {
                 $params['money_direction'] = Charge::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT;
             } elseif (in_array($rowBooking['model'], PartnerService::partnerBusinessModel())) {
                 $params['money_direction'] = Charge::CHARGE_MONEY_DIRECTION_PARTNER_COLLECT;
             }
             $provideParking = [];
             foreach ($data['accommodation_amount'] as $key => $row) {
                 //nightly data
                 if (isset($data['reservation_nightly_ids'][$key]) && (int) $data['reservation_nightly_ids'][$key] > 0) {
                     $params['reservation_nightly_id'] = (int) $data['reservation_nightly_ids'][$key];
                     $params['rate_name'] = $data['rateNames'][$key];
                     $params['reservation_nightly_date'] = $data['nightDate'][$key];
                 } else {
                     $params['reservation_nightly_id'] = 0;
                     $params['rate_name'] = NUll;
                     $params['reservation_nightly_date'] = NULL;
                 }
                 //entityId is being used for parking now
                 if (isset($data['entityId'][$key]) && (int) $data['entityId'][$key] > 0) {
                     $params['entity_id'] = (int) $data['entityId'][$key];
                     if ((int) $data['addonstype'][$key] == Constants::ADDONS_PARKING) {
                         //close spot availability
                         $parkingInventoryDao->save(['availability' => 0], ['spot_id' => $params['entity_id'], 'date' => $params['reservation_nightly_date']]);
                     }
                 } else {
                     $params['entity_id'] = 0;
                 }
                 $params['acc_amount'] = number_format((double) $row, 2, '.', '');
                 $params['addons_type'] = (int) $data['addonstype'][$key];
                 $params['addons_value'] = (int) $data['addons_value'][$key];
                 $params['tax_type'] = isset($data['taxtype'][$key]) ? (double) $data['taxtype'][$key] : 0;
                 if (isset($addons[$params['addons_type']]['default_commission']) && $addons[$params['addons_type']]['default_commission']) {
                     $params['commission'] = $rowBooking['partner_commission'];
                 } else {
                     $params['commission'] = 0;
                 }
                 $params['status'] = 0;
                 $chargingDao->save($params);
                 if ($params['addons_type'] == Constants::ADDONS_PARKING) {
                     if (!isset($provideParking[$params['rate_name']])) {
                         $provideParking[$params['rate_name']] = [];
                     }
                     array_push($provideParking[$params['rate_name']], $params['reservation_nightly_date']);
                 }
             }
             $parkingChargesByDateRanges = $this->calculateDateRangesForSpot($provideParking);
             foreach ($parkingChargesByDateRanges as $parkingSpotRequested) {
                 $logger->save(Logger::MODULE_BOOKING, $rowBooking['id'], Logger::ACTION_PROVIDE_PARKING, 'Provide Parking on ' . $parkingSpotRequested['date'] . ' for ' . $parkingSpotRequested['spot']);
             }
             $bookingTicketService = $this->getServiceLocator()->get('service_booking_booking_ticket');
             $balanceAndSummaryArray = $bookingTicketService->getSumAndBalanc($rowBooking['id']);
             $bookingArray = ['guest_balance' => $balanceAndSummaryArray['ginosiBalanceInApartmentCurrency'], 'partner_balance' => $balanceAndSummaryArray['partnerBalanceInApartmentCurrency'], 'check_charged' => 1];
             // recalculatePenalty
             $newPenalty = $this->recalculatePenalty($rowBooking['id']);
             if ($newPenalty > 0) {
                 $bookingArray['penalty_fixed_amount'] = $newPenalty;
             }
             $bookingDao->save($bookingArray, ['res_number' => $rowBooking['res_number']]);
         }
         $transactionAmountInApartmentCurrency = doubleval($data['transaction_amount_apartment_currency']);
         if (is_float($transactionAmountInApartmentCurrency) && $transactionAmountInApartmentCurrency > 0) {
             $transactionAmountInCustomerCurrency = $transactionAmountInApartmentCurrency * $rowBooking['currency_rate'];
             // Transaction
             $transactionData = ['res_number' => $rowBooking['res_number'], 'transaction_type' => BankTransaction::BANK_TRANSACTION_TYPE_COLLECT, 'transaction_psp' => $pspId, 'reservation_id' => $rowBooking['id'], 'acc_currency_rate' => $rowBooking['acc_currency_rate'], 'transaction_acc_amount' => $transactionAmountInApartmentCurrency, 'transaction_customer_amount' => $transactionAmountInCustomerCurrency, 'transaction_money_account_currency' => $pspInfo['currency'], 'transaction_money_account_currency_rate' => $rowBooking['currency_rate'], 'transaction_charge_amount' => $transactionAmountInApartmentCurrency, 'transaction_money_account_id' => $pspInfo['money_account_id'], 'transaction_charge_comment' => $data['charge_comment'], 'accId' => $rowBooking['apartment_id_assigned'], 'transaction_status' => BankTransaction::BANK_TRANSACTION_STATUS_APPROVED, 'transaction_rrn' => '', 'transaction_auth_code' => '', 'cardId' => $data['cc_id']];
             $responseTransaction = $serviceTransaction->saveTransaction($transactionData, BankTransaction::TRANSACTION_MONEY_DIRECTION_GINOSI_COLLECT, true);
             if ($responseTransaction['status'] == 'error') {
                 $chargingDao->rollbackTransaction();
                 return false;
             }
         } else {
             $chargingDao->rollbackTransaction();
             return false;
         }
         $chargingDao->commitTransaction();
         return $rowBooking['res_number'];
     } catch (\Exception $e) {
         $chargingDao->rollbackTransaction();
     }
     return false;
 }
Example #3
0
 /**
  * @param $partner
  * @return array
  */
 private function getModel($partner)
 {
     $ticketModel = [PartnerService::BUSINESS_MODEL_GINOSI_COLLECT => PartnerService::getBusinessModels()[PartnerService::BUSINESS_MODEL_GINOSI_COLLECT]];
     // get partner model
     if ($partner->getBusinessModel() && isset(PartnerService::getBusinessModels()[$partner->getBusinessModel()])) {
         $ticketModel += [$partner->getBusinessModel() => PartnerService::getBusinessModels()[$partner->getBusinessModel()]];
     }
     return $ticketModel;
 }
Example #4
0
 /**
  * Options to populate "Business Model" select element
  * @return array
  */
 private function getBusinessModels()
 {
     return [0 => '-- All Models --'] + PartnerService::getBusinessModels();
 }
Example #5
0
 /**
  * @param $res_number
  * @param bool $push
  * @param bool $sendEmail
  * @param int $cancellationType
  * @param bool $emailAddress
  * @return bool
  */
 public function processCancellation($res_number, $push = false, $sendEmail = true, $cancellationType = BookingService::BOOKING_STATUS_CANCELLED_BY_CUSTOMER, $emailAddress = false)
 {
     /**
      * @var \DDD\Service\Booking\BookingTicket $bookingTicketService
      * @var \Library\Authentication\BackofficeAuthenticationService $authenticationService
      * @var \DDD\Domain\Booking\ForCancelCharge $charge
      * @var Logger $logger
      * @var \DDD\Dao\Booking\ChargeDeleted $chargeDeletedDao
      * @var \DDD\Service\Availability $availabilityService
      * @var \DDD\Dao\Booking\Booking $bookingDao
      */
     $chargeDeletedDao = $this->getServiceLocator()->get('dao_booking_charge_deleted');
     $logger = $this->getServiceLocator()->get('ActionLogger');
     $availabilityService = $this->getServiceLocator()->get('service_availability');
     $bookingDao = $this->getServiceLocator()->get('dao_booking_booking');
     $bookingDao->setEntity(new \DDD\Domain\Booking\ForCancel());
     $rowBooking = $bookingDao->getBookingForCancel($res_number);
     if (!$rowBooking) {
         return false;
     }
     // If ticket status equals unknown it means ticket was canceled, availability was opened and now we should
     // apply our processes to calculate commissions, balance, etc... Now we need to apply real cancelation logic
     if ($rowBooking->getStatus() != BookingService::BOOKING_STATUS_CANCELLED_PENDING && $rowBooking->isOverbooking() != ReservationTicketService::OVERBOOKING_STATUS_OVERBOOKED) {
         // do not open availability if apartment status is not "Live and Selling" or "Selling not Searchable"
         $availabilityService->updateAvailabilityAllPartForApartment($rowBooking->getId(), $this->getNewAvailability(), true);
         // change apartel availability and sync cubilis if this apartment is apartel
         $availabilityService->updateAvailabilityAllPartForApartel($rowBooking->getId(), true);
     }
     // Global parameters
     $ticketModel = $rowBooking->getModel();
     $affiliateID = $rowBooking->getAffiliateID();
     $expediaPartnerID = Partners::PARTNER_EXPEDIA;
     $affiliateCommission = $rowBooking->getPartnerCommission();
     $loggedInUserID = $this->getUserId();
     $noActionCancellationStatuses = [BookingService::BOOKING_STATUS_CANCELLED_MOVED];
     if (in_array($cancellationType, $noActionCancellationStatuses)) {
         // Not commission partner if not expedia
     } elseif ($cancellationType != BookingService::BOOKING_STATUS_CANCELLED_PENDING) {
         // Common parameters for charge
         $params = ['reservation_id' => $rowBooking->getId(), 'date' => date('Y-m-d H:i:s'), 'user_id' => $loggedInUserID, 'customer_currency' => $rowBooking->getGuestCurrencyCode(), 'acc_currency' => $rowBooking->getApartmentCurrencyCode(), 'status' => ChargeService::CHARGE_STATUS_NORMAL];
         $reverseParams = ['reservation_id' => $rowBooking->getId(), 'date' => date('Y-m-d H:i:s'), 'user_id' => $loggedInUserID];
         $chargeDao = $this->getChargingDao();
         $charges = $chargeDao->getFirstAccTaxCharge($rowBooking->getId());
         $charges = iterator_to_array($charges);
         //open parking availability for that period
         $parkingInventoryDao = $this->getServiceLocator()->get('dao_parking_spot_inventory');
         foreach ($charges as $charge) {
             if ($charge->getAddons_type() == BookingAddon::ADDON_TYPE_PARKING && (int) $charge->getEntityId() > 0) {
                 $parkingInventoryDao->save(['availability' => 1], ['spot_id' => $charge->getEntityId(), 'date' => $charge->getReservationNightlyDate()]);
             }
         }
         $accChargeInApartmentCurrency = 0;
         $accChargeInCustomerCurrency = 0;
         $parkingCommissionChargeAmountInApartmentCurrency = 0;
         $parkingCommissionChargeAmountInCustomerCurrency = 0;
         $totCommissionChargeAmountInApartmentCurrency = 0;
         $totCommissionChargeAmountInCustomerCurrency = 0;
         $taxes = [];
         foreach ($charges as $charge) {
             switch ($charge->getAddons_type()) {
                 case BookingAddon::ADDON_TYPE_ACC:
                     $accChargeInApartmentCurrency += $charge->getAcc_amount();
                     $accChargeInCustomerCurrency += $charge->getCustomer_amount();
                     break;
                 case BookingAddon::ADDON_TYPE_TAX_TOT:
                     $totCommissionChargeAmountInApartmentCurrency += $charge->getAcc_amount();
                     $totCommissionChargeAmountInCustomerCurrency += $charge->getCustomer_amount();
                     break;
                 case BookingAddon::ADDON_TYPE_PARKING:
                     if ($charge->getCommission() > 0) {
                         $parkingCommissionChargeAmountInApartmentCurrency += $charge->getAcc_amount();
                         $parkingCommissionChargeAmountInCustomerCurrency += $charge->getCustomer_amount();
                     }
                     break;
                 case BookingAddon::ADDON_TYPE_CLEANING_FEE:
                     break;
                 case BookingAddon::ADDON_TYPE_DISCOUNT:
                     break;
                 case BookingAddon::ADDON_TYPE_COMPENSATION:
                     break;
                 case BookingAddon::ADDON_TYPE_EXTRA_PERSON:
                     break;
                 default:
                     // Compose array of tax charges
                     $chargeAddonsValue = $rowBooking->{"get" . ucfirst($charge->getLocation_tax())}();
                     $taxes[] = ['cxl_apply' => $charge->getCxl_apply(), 'value' => $chargeAddonsValue];
                     break;
             }
             if (in_array($cancellationType, [BookingService::BOOKING_STATUS_CANCELLED_NOSHOW, BookingService::BOOKING_STATUS_CANCELLED_BY_CUSTOMER]) && in_array($charge->getAddons_type(), [BookingAddon::ADDON_TYPE_PARKING, BookingAddon::ADDON_TYPE_CLEANING_FEE])) {
                 continue;
             } else {
                 // Reverse charges
                 if ($charge->getAddons_type() == BookingAddon::ADDON_TYPE_PARKING || $charge->getAddons_type() == BookingAddon::ADDON_TYPE_CLEANING_FEE || $rowBooking->getIsRefundable() == Rate::APARTMENT_RATE_REFUNDABLE || $cancellationType == BookingService::BOOKING_STATUS_CANCELLED_INVALID || $cancellationType == BookingService::BOOKING_STATUS_CANCELLED_EXCEPTION) {
                     // Parking or refundable type
                     $removedId = $charge->getId();
                     $chargeDao->save(['status' => ChargeService::CHARGE_STATUS_DELETED], ['id' => $removedId]);
                     if (!$chargeDeletedDao->fetchOne(['reservation_charge_id' => $removedId])) {
                         $reverseParams['reservation_charge_id'] = $removedId;
                         $chargeDeletedDao->save($reverseParams);
                     }
                 }
             }
         }
         if ($rowBooking->getIsRefundable() == Rate::APARTMENT_RATE_REFUNDABLE) {
             // Penalty
             if ($rowBooking->getPenalty_hours() <= $rowBooking->getRefundableBeforeHours()) {
                 // Default params + penalty type
                 $penaltyChargeParams = $params;
                 $penaltyChargeParams['type'] = 'p';
                 // Calculate penalty amount
                 $ticketPenaltyAmount = $rowBooking->getPenaltyFixedAmount();
                 $penaltyChargeAmountInApartmentCurrency = $ticketPenaltyAmount;
                 //time of cancel
                 //					foreach ($taxes as $tax) {
                 //						if ($tax['cxl_apply'] == 1) {
                 //							$penaltyChargeAmountInApartmentCurrency += $accChargeInApartmentCurrency * $tax['value'] / 100;
                 //						} elseif ($tax['cxl_apply'] == 2) {
                 //							$penaltyChargeAmountInApartmentCurrency += $ticketPenaltyAmount * $tax['value'] / 100;
                 //						}
                 //					}
                 $ticketPenaltyAmountInCustomerCurrency = $ticketPenaltyAmount * $rowBooking->getCurrency_rate();
                 $penaltyChargeAmountInCustomerCurrency = $penaltyChargeAmountInApartmentCurrency * $rowBooking->getCurrency_rate();
                 // Without taxes
                 $ticketPenaltyAmountInApartmentCurrency = number_format($ticketPenaltyAmount, 2, '.', '');
                 $ticketPenaltyAmountInCustomerCurrency = number_format($ticketPenaltyAmountInCustomerCurrency, 2, '.', '');
                 // Including taxes
                 $penaltyChargeAmountInApartmentCurrency = number_format($penaltyChargeAmountInApartmentCurrency, 2, '.', '');
                 $penaltyChargeAmountInCustomerCurrency = number_format($penaltyChargeAmountInCustomerCurrency, 2, '.', '');
                 // initializing....
                 $penaltyChargeCommission = 0;
                 $penaltyChargeModel = ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT;
                 switch ($cancellationType) {
                     case BookingService::BOOKING_STATUS_CANCELLED_BY_CUSTOMER:
                     case BookingService::BOOKING_STATUS_CANCELLED_NOSHOW:
                     case BookingService::BOOKING_STATUS_CANCELLED_TEST_BOOKING:
                         if ($ticketModel == Partners::BUSINESS_MODEL_GINOSI_COLLECT) {
                             $penaltyChargeModel = ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT;
                             if ($affiliateID == $expediaPartnerID) {
                                 $penaltyChargeCommission = $affiliateCommission;
                             } else {
                                 $penaltyChargeCommission = 0;
                             }
                             $penaltyChargeParams['acc_amount'] = $penaltyChargeAmountInApartmentCurrency;
                             $penaltyChargeParams['customer_amount'] = $penaltyChargeAmountInCustomerCurrency;
                         } elseif (in_array($ticketModel, Partners::partnerBusinessModel())) {
                             $penaltyChargeModel = ChargeService::CHARGE_MONEY_DIRECTION_PARTNER_COLLECT;
                             $penaltyChargeCommission = $affiliateCommission;
                             $penaltyChargeParams['acc_amount'] = $penaltyChargeAmountInApartmentCurrency;
                             $penaltyChargeParams['customer_amount'] = $penaltyChargeAmountInCustomerCurrency;
                             // reverse only ginosi collect charges
                             $this->reverseChages($charges, $reverseParams, ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT);
                         }
                         if ($cancellationType == BookingService::BOOKING_STATUS_CANCELLED_TEST_BOOKING) {
                             // reverse all charges
                             $this->reverseChages($charges, $reverseParams);
                         }
                         break;
                     case BookingService::BOOKING_STATUS_CANCELLED_BY_GINOSI:
                         if ($ticketModel == Partners::BUSINESS_MODEL_GINOSI_COLLECT) {
                             $partnerAllCharges = [];
                             foreach ($charges as $charge) {
                                 // Calculate partner commission
                                 if ($charge->getCommission() > 0 || $affiliateID == $expediaPartnerID && $charge->getAddons_type() == BookingAddon::ADDON_TYPE_TAX_TOT) {
                                     //$charge->getAddons_type() == BookingAddon::ADDON_TYPE_PARKING &&
                                     $chargeAmountInApartmentCurrency = $charge->getAcc_amount();
                                     $chargeAmountInCustomerCurrency = $charge->getCustomer_amount();
                                     $partnerCharge = $params;
                                     $partnerCharge['type'] = 'g';
                                     $partnerCharge['money_direction'] = ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT;
                                     $partnerCharge['commission'] = 100;
                                     $partnerCharge['acc_amount'] = $chargeAmountInApartmentCurrency * $affiliateCommission / 100;
                                     $partnerCharge['customer_amount'] = $chargeAmountInCustomerCurrency * $affiliateCommission / 100;
                                     $partnerAllCharges[] = $partnerCharge;
                                 }
                                 // Reverse charges
                                 $removedId = $charge->getId();
                                 $chargeDao->save(['status' => ChargeService::CHARGE_STATUS_DELETED], ['id' => $removedId]);
                                 if (!$chargeDeletedDao->fetchOne(['reservation_charge_id' => $removedId])) {
                                     $reverseParams['reservation_charge_id'] = $removedId;
                                     $chargeDeletedDao->save($reverseParams);
                                 }
                             }
                             foreach ($partnerAllCharges as $pCharge) {
                                 $chargeDao->save($pCharge);
                             }
                         } elseif (in_array($ticketModel, Partners::partnerBusinessModel())) {
                             // reverse all charges
                             $this->reverseChages($charges, $reverseParams);
                         }
                         break;
                     case BookingService::BOOKING_STATUS_CANCELLED_INVALID:
                     case BookingService::BOOKING_STATUS_CANCELLED_EXCEPTION:
                         break;
                     case BookingService::BOOKING_STATUS_CANCELLED_UNWANTED:
                     case BookingService::BOOKING_STATUS_CANCELLED_FRAUDULANT:
                         if ($ticketModel == Partners::BUSINESS_MODEL_GINOSI_COLLECT) {
                             $partnerAllCharges = [];
                             foreach ($charges as $charge) {
                                 // Calculate partner commission
                                 if ($charge->getCommission() > 0 && $charge->getMoneyDirection() == ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT) {
                                     $chargeDao->update(['commission' => 0], ['id' => $charge->getId()]);
                                 }
                             }
                         } else {
                             // reverse only ginosi collect charges
                             $this->reverseChages($charges, $reverseParams, ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT);
                         }
                         break;
                 }
                 $penaltyChargeParams['commission'] = $penaltyChargeCommission;
                 $penaltyChargeParams['money_direction'] = $penaltyChargeModel;
                 if (isset($penaltyChargeParams['acc_amount']) && $penaltyChargeParams['acc_amount'] > 0) {
                     $chargeDao->save($penaltyChargeParams);
                 }
             } else {
                 // Flexible period
                 $partnerAllCharges = [];
                 foreach ($charges as $charge) {
                     if ($cancellationType == BookingService::BOOKING_STATUS_CANCELLED_BY_GINOSI) {
                         // Calculate partner commission
                         if ($charge->getCommission() > 0 || $affiliateID == $expediaPartnerID && $charge->getAddons_type() == BookingAddon::ADDON_TYPE_TAX_TOT) {
                             $chargeAmountInApartmentCurrency = $charge->getAcc_amount();
                             $chargeAmountInCustomerCurrency = $charge->getCustomer_amount();
                             $partnerCharge = $params;
                             $partnerCharge['type'] = 'g';
                             $partnerCharge['money_direction'] = ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT;
                             $partnerCharge['commission'] = 100;
                             $partnerCharge['acc_amount'] = $chargeAmountInApartmentCurrency * $affiliateCommission / 100;
                             $partnerCharge['customer_amount'] = $chargeAmountInCustomerCurrency * $affiliateCommission / 100;
                             $partnerAllCharges[] = $partnerCharge;
                         }
                     }
                     // Reverse charges
                     $removedId = $charge->getId();
                     $chargeDao->save(['status' => ChargeService::CHARGE_STATUS_DELETED], ['id' => $removedId]);
                     if (!$chargeDeletedDao->fetchOne(['reservation_charge_id' => $removedId])) {
                         $reverseParams['reservation_charge_id'] = $removedId;
                         $chargeDeletedDao->save($reverseParams);
                     }
                 }
                 foreach ($partnerAllCharges as $pCharge) {
                     $chargeDao->save($pCharge);
                 }
             }
         } elseif ($rowBooking->getIsRefundable() == Rate::APARTMENT_RATE_NON_REFUNDABLE) {
             switch ($cancellationType) {
                 case BookingService::BOOKING_STATUS_CANCELLED_BY_CUSTOMER:
                 case BookingService::BOOKING_STATUS_CANCELLED_NOSHOW:
                 case BookingService::BOOKING_STATUS_CANCELLED_TEST_BOOKING:
                     if ($ticketModel == Partners::BUSINESS_MODEL_GINOSI_COLLECT) {
                         foreach ($charges as $charge) {
                             if ($affiliateID == $expediaPartnerID) {
                                 // pay commission for apartment
                                 if ($charge->getAddons_type() != BookingAddon::ADDON_TYPE_ACC) {
                                     $chargeDao->update(['commission' => 0], ['id' => $charge->getId()]);
                                 }
                             } else {
                                 $chargeDao->update(['commission' => 0], ['id' => $charge->getId()]);
                             }
                         }
                     } else {
                         // reverse only ginosi collect charges
                         $this->reverseChages($charges, $reverseParams, ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT);
                     }
                     if ($cancellationType == BookingService::BOOKING_STATUS_CANCELLED_TEST_BOOKING) {
                         // reverse all charges
                         $this->reverseChages($charges, $reverseParams);
                     }
                     break;
                 case BookingService::BOOKING_STATUS_CANCELLED_BY_GINOSI:
                     if ($ticketModel == Partners::BUSINESS_MODEL_GINOSI_COLLECT) {
                         $partnerAllCharges = [];
                         foreach ($charges as $charge) {
                             // partner commission calculate
                             if ($charge->getCommission() > 0 || $affiliateID == $expediaPartnerID && $charge->getAddons_type() == BookingAddon::ADDON_TYPE_TAX_TOT) {
                                 //$charge->getAddons_type() == BookingAddon::ADDON_TYPE_PARKING &&
                                 $chargeAmountInApartmentCurrency = $charge->getAcc_amount();
                                 $chargeAmountInCustomerCurrency = $charge->getCustomer_amount();
                                 $partnerCharge = $params;
                                 $partnerCharge['type'] = 'g';
                                 $partnerCharge['money_direction'] = ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT;
                                 $partnerCharge['commission'] = 100;
                                 $partnerCharge['acc_amount'] = $chargeAmountInApartmentCurrency * $affiliateCommission / 100;
                                 $partnerCharge['customer_amount'] = $chargeAmountInCustomerCurrency * $affiliateCommission / 100;
                                 $partnerAllCharges[] = $partnerCharge;
                             }
                             // Reverse charges
                             $removedId = $charge->getId();
                             $chargeDao->save(['status' => ChargeService::CHARGE_STATUS_DELETED], ['id' => $removedId]);
                             if (!$chargeDeletedDao->fetchOne(['reservation_charge_id' => $removedId])) {
                                 $reverseParams['reservation_charge_id'] = $removedId;
                                 $chargeDeletedDao->save($reverseParams);
                             }
                         }
                         foreach ($partnerAllCharges as $pCharge) {
                             $chargeDao->save($pCharge);
                         }
                     } else {
                         // reverse all charges
                         $this->reverseChages($charges, $reverseParams);
                     }
                     break;
                 case BookingService::BOOKING_STATUS_CANCELLED_INVALID:
                 case BookingService::BOOKING_STATUS_CANCELLED_EXCEPTION:
                     break;
                 case BookingService::BOOKING_STATUS_CANCELLED_UNWANTED:
                 case BookingService::BOOKING_STATUS_CANCELLED_FRAUDULANT:
                     if ($ticketModel == Partners::BUSINESS_MODEL_GINOSI_COLLECT) {
                         $partnerAllCharges = [];
                         foreach ($charges as $charge) {
                             // Calculate partner commission
                             if ($charge->getCommission() > 0 && $charge->getMoneyDirection() == ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT) {
                                 $chargeDao->update(['commission' => 0], ['id' => $charge->getId()]);
                             }
                         }
                     } else {
                         // reverse only ginosi collect charges
                         $this->reverseChages($charges, $reverseParams, ChargeService::CHARGE_MONEY_DIRECTION_GINOSI_COLLECT);
                     }
                     break;
             }
         }
     } else {
         // do nothing
     }
     if ($cancellationType == BookingService::BOOKING_STATUS_CANCELLED_PENDING) {
         $logger->save(Logger::MODULE_BOOKING, $rowBooking->getId(), Logger::ACTION_BOOKING_STATUSES, Logger::VALUE_CANCELED_UNKNOWN);
         $bookingTicketData = ['cancelation_date' => date('Y-m-d H:i:s'), 'status' => $cancellationType];
     } else {
         // Update balances
         $bookingTicketService = $this->getServiceLocator()->get('service_booking_booking_ticket');
         $balances = $bookingTicketService->getSumAndBalanc($rowBooking->getId());
         $penaltyBit = 0;
         if ($rowBooking->getIsRefundable() == 2 || $rowBooking->getIsRefundable() != 2 && $rowBooking->getPenalty_hours() <= $rowBooking->getRefundableBeforeHours()) {
             $penaltyBit = 1;
         }
         $bookingTicketData = ['guest_balance' => $balances['ginosiBalanceInApartmentCurrency'], 'partner_balance' => $balances['partnerBalanceInApartmentCurrency'], 'status' => $cancellationType, 'penalty_bit' => $penaltyBit];
         if ($rowBooking->getStatus() != BookingService::BOOKING_STATUS_CANCELLED_PENDING) {
             $bookingTicketData['cancelation_date'] = date('Y-m-d H:i:s');
         }
         // If CC Status is invalid and both of balances equals 0 then ticket must be marked as settled
         //		    if ($cancellationType == BookingService::BOOKING_STATUS_CANCELLED_INVALID) {
         //			    if ($balances['ginosiBalanceInApartmentCurrency'] == 0 && $balances['partnerBalanceInApartmentCurrency'] == 0) {
         //				    $bookingTicketData['payment_settled'] = 1;
         //				    $bookingTicketData['settled_date'] = date('Y-m-d H:i:s');
         //
         //                    $logger->save(Logger::MODULE_BOOKING, $rowBooking->getId(), Logger::ACTION_RESERVATION_SETTLED);
         //			    }
         //		    }
     }
     $bookingDao->save($bookingTicketData, ['res_number' => $res_number]);
     $taskService = $this->getServiceLocator()->get('service_task');
     //delete auto-created cleaning tasks
     $taskService->deleteTask(['res_id' => $rowBooking->getId(), 'is_hk' => TaskService::TASK_IS_HOUSEKEEPING, 'task_status' => TaskService::STATUS_NEW]);
     if ($rowBooking->getArrivalStatus() == ReservationTicketService::BOOKING_ARRIVAL_STATUS_CHECKED_IN) {
         //checked in, but canceled
         //create extra task for cleaning, and key change for tomorrow
         $taskService->createExtraCleaningCancelReservationAfterCheckin($rowBooking->getId(), $rowBooking->getApartmentIdAssigned(), Task::CASE_CANCEL);
     } else {
         //if the previous task is done , or the reservation has started
         //create extra task for key change on next reservation's checkin date
         $taskService->checkAndCreateExtraTaskForStartedReservationsCancelation($rowBooking->getId(), $rowBooking->getApartmentIdAssigned(), Task::CASE_CANCEL);
     }
     // Delete nightly reservation
     /**
      * @var ReservationNightly $reservationNightlyDao
      */
     $reservationNightlyDao = $this->getServiceLocator()->get('dao_booking_reservation_nightly');
     $reservationNightlyDao->delete(['reservation_id' => $rowBooking->getId()]);
     // Send cancelations email
     !$sendEmail ?: $this->sendCancelationEmail($rowBooking->getId(), $emailAddress);
     return true;
 }