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']]); }
/** * @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; }
/** * @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; }
/** * Options to populate "Business Model" select element * @return array */ private function getBusinessModels() { return [0 => '-- All Models --'] + PartnerService::getBusinessModels(); }
/** * @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; }