123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370 |
- <?php
- /**
- *
- * PHP Pro Bid $Id$ DmJ+dQXcaHD5ZVtmYsSddO+g8baJA8BTKTA6PA6jJyE=
- *
- * @link http://www.phpprobid.com
- * @copyright Copyright (c) 2017 Online Ventures Software & CodeCube SRL
- * @license http://www.phpprobid.com/license Commercial License
- *
- * @version 7.10 [rev.7.10.02]
- */
- /**
- * listing setup fee class
- */
- namespace Ppb\Service\Fees;
- use Ppb\Service,
- Ppb\Db\Table\Row\Listing as ListingModel,
- Ppb\Db\Table\Row\Voucher;
- class ListingSetup extends Service\Fees
- {
- /**
- *
- * standard fees
- *
- * @var array
- */
- protected $_fees = array(
- self::SETUP => 'Listing Setup',
- self::HPFEAT => 'Home Page Featuring',
- self::CATFEAT => 'Category Pages Featuring',
- self::HIGHLIGHTED => 'Highlighted Item',
- self::SUBTITLE => 'Listing Subtitle',
- self::IMAGES => 'Listing Images',
- self::MEDIA => 'Listing Media',
- self::DIGITAL_DOWNLOADS => 'Digital Downloads',
- self::ADDL_CATEGORY => 'Additional Category Listing',
- self::BUYOUT => 'Buy Out',
- self::RESERVE => 'Reserve Price',
- self::MAKE_OFFER => 'Make Offer',
- self::ITEM_SWAP => 'Item Swap'
- );
- /**
- *
- * media upload fees, with corresponding keys for files that can be uploaded free of charge
- *
- * @var array
- */
- protected $_mediaFees = array(
- self::IMAGES => self::NB_FREE_IMAGES,
- self::MEDIA => self::NB_FREE_MEDIA,
- self::DIGITAL_DOWNLOADS => self::NB_FREE_DOWNLOADS,
- );
- /**
- *
- * listing object
- *
- * @var \Ppb\Db\Table\Row\Listing
- */
- protected $_listing;
- /**
- *
- * saved listing object (used for when editing a listing)
- *
- * @var \Ppb\Db\Table\Row\Listing
- */
- protected $_savedListing;
- /**
- *
- * total amount to be paid after the calculate method is called
- *
- * @var float
- */
- protected $_totalAmount;
- /**
- *
- * payment redirect path
- *
- * @var array
- */
- protected $_redirect = array(
- 'module' => 'listings',
- 'controller' => 'listing',
- 'action' => 'confirm',
- );
- /**
- *
- * class constructor
- *
- * @param \Ppb\Db\Table\Row\Listing $listing listing object
- * @param integer|string|\Ppb\Db\Table\Row\User $user the user that will be paying
- */
- public function __construct(ListingModel $listing = null, $user = null)
- {
- parent::__construct();
- $settings = $this->getSettings();
- $feesSettings = array(
- Service\Fees::ADDL_CATEGORY => $settings['addl_category_listing'],
- Service\Fees::BUYOUT => $settings['enable_buyout'],
- Service\Fees::RESERVE => $settings['enable_auctions'],
- Service\Fees::DIGITAL_DOWNLOADS => $settings['digital_downloads_max'],
- Service\Fees::MAKE_OFFER => $settings['enable_make_offer'],
- Service\Fees::IMAGES => $settings['images_max'],
- Service\Fees::MEDIA => $settings['videos_max'],
- Service\Fees::SUBTITLE => $settings['enable_subtitle'],
- );
- foreach ($this->_fees as $feeName => $feeDescription) {
- if (array_key_exists($feeName, $feesSettings) && ($feesSettings[$feeName] == 0)) {
- unset($this->_fees[$feeName]);
- }
- }
- if ($listing !== null) {
- $amount = ($listing['listing_type'] == 'product') ?
- $listing['buyout_price'] : max(array($listing['start_price'], $listing['reserve_price']));
- $this->setListing($listing)
- ->setAmount($amount)
- ->setCategoryId($listing['category_id'])
- ->setCurrency($listing['currency']);
- }
- if ($user !== null) {
- $this->setUser($user);
- }
- }
- /**
- *
- * set listing model
- *
- * @param \Ppb\Db\Table\Row\Listing $listing
- *
- * @return \Ppb\Service\Fees\ListingSetup
- */
- public function setListing(ListingModel $listing)
- {
- $this->_listing = $listing;
- return $this;
- }
- /**
- *
- * set saved listing model
- *
- * @param \Ppb\Db\Table\Row\Listing $savedListing
- *
- * @return \Ppb\Service\Fees\ListingSetup
- */
- public function setSavedListing(ListingModel $savedListing)
- {
- $this->_savedListing = $savedListing;
- return $this;
- }
- /**
- *
- * calculate and return an array containing all fees to be applied when creating a listing
- * also apply the voucher and add it as a separate row
- *
- * @return array
- */
- public function calculate()
- {
- $data = array();
- $this->_totalAmount = 0;
- $settings = $this->getSettings();
- foreach ($this->_fees as $key => $value) {
- if ($this->_applyFee($key)) {
- $feeAmount = $this->getFeeAmount($key);
- if ($feeAmount > 0 || $settings['display_free_fees']) {
- $data[] = array(
- 'key' => $key,
- 'name' => $value,
- 'amount' => $feeAmount,
- 'tax_rate' => $this->getTaxType()->getData('amount'),
- 'currency' => $settings['currency'],
- );
- }
- $this->_totalAmount += $feeAmount;
- }
- }
- if (($voucher = $this->getVoucher()) instanceof Voucher) {
- $totalAmount = $this->_applyVoucher($this->_totalAmount, $settings['currency']);
- if ($totalAmount != $this->_totalAmount) {
- $voucherAmount = $totalAmount - $this->_totalAmount;
- $data[] = array(
- 'key' => 'voucher_reduction',
- 'name' => $voucher->description(),
- 'amount' => $voucherAmount,
- 'tax_rate' => $this->getTaxType()->getData('amount'),
- 'currency' => $settings['currency'],
- );
- $this->_totalAmount = $totalAmount;
- }
- }
- return $data;
- }
- /**
- *
- * get redirect array, but attach listing_id variable if it is set
- *
- * @return array
- */
- public function getRedirect()
- {
- $redirect = $this->_redirect;
- if (!empty($this->_transactionDetails['data']['listing_id'])) {
- $redirect['params']['id'] = $this->_transactionDetails['data']['listing_id'];
- }
- return $redirect;
- }
- /**
- *
- * activate the affected listing
- * the callback will also process the listing in case a payment has been reversed etc.
- *
- * @param bool $ipn true if payment is completed, false otherwise
- * @param array $post array keys: {listing_id}
- *
- * @return \Ppb\Service\Fees\ListingSetup
- */
- public function callback($ipn, array $post)
- {
- $listingsService = new Service\Listings();
- $listing = $listingsService->findBy('id', $post['listing_id']);
- $flag = ($ipn) ? 1 : 0;
- $listing->updateActive($flag);
- return $this;
- }
- /**
- *
- * get the amount of a certain fee
- * calculates based on preferred seller feature
- * - in case of an image fee, calculate based on the number of images uploaded
- * (plus apply the free images setting as well)
- *
- * @param string $name
- * @param float $amount
- * @param int $categoryId
- * @param null $currency
- *
- * @return float|null return the fee amount or null if no fee applies for the selected action
- */
- public function getFeeAmount($name = null, $amount = null, $categoryId = null, $currency = null)
- {
- $feeAmount = parent::getFeeAmount($name, $amount, $categoryId, $currency);
- if (array_key_exists($name, $this->_mediaFees)) {
- $savedListingValue = (!empty($this->_savedListing[$name])) ? $this->_savedListing[$name] : null;
- $savedListingCategoryId = (!empty($this->_savedListing['category_id'])) ? $this->_savedListing['category_id'] : null;
- $counter = (is_numeric($this->_listing[$name])) ?
- intval($this->_listing[$name]) : count(array_filter((array)\Ppb\Utility::unserialize($this->_listing[$name])));
- $counterFree = intval($this->getFeeAmount($this->_mediaFees[$name]));
- $counterSaved = ($this->_listing['category_id'] == $savedListingCategoryId) ?
- count(\Ppb\Utility::unserialize($savedListingValue)) : 0;
- if ($counterSaved > $counterFree) {
- $counter -= $counterSaved;
- }
- else {
- $counter -= $counterFree;
- }
- $feeAmount *= ($counter <= 0) ? 0 : $counter;
- }
- return $feeAmount;
- }
- /**
- *
- * get total amount to be paid resulted from the calculate() method
- *
- * @return float
- */
- public function getTotalAmount()
- {
- return $this->_totalAmount;
- }
- /**
- *
- * check whether to apply the requested fee
- * do not apply any fees if the listing is a draft
- *
- * @param string $name the name of the fee
- *
- * @return bool
- */
- protected function _applyFee($name)
- {
- $savedListingValue = (!empty($this->_savedListing[$name])) ? $this->_savedListing[$name] : null;
- $savedListingCategoryId = (!empty($this->_savedListing['category_id'])) ? $this->_savedListing['category_id'] : null;
- if ($this->_listing['draft']) {
- return false;
- }
- else if (in_array($name, $this->_feesTiers) && (!$this->_savedListing instanceof ListingModel)) {
- return true;
- }
- else if (array_key_exists($name, $this->_mediaFees)) {
- $counter = count(array_filter((array)$this->_listing[$name]));
- if ($this->_savedListing instanceof ListingModel) {
- $counterSavedListing = count(array_filter((array)$savedListingValue));
- if (
- ($counter > $counterSavedListing) ||
- ($this->_listing['category_id'] != $savedListingCategoryId)
- ) {
- return true;
- }
- }
- else if ($counter > 0) {
- return true;
- }
- }
- else if (
- ($this->_listing[$name] && !$savedListingValue) ||
- ($this->_listing['category_id'] != $savedListingCategoryId)
- ) {
- $value = $this->_listing[$name];
- if (is_numeric($value)) {
- $value = floatval($value);
- }
- return (!empty($value)) ? true : false;
- }
- return false;
- }
- }
|