Esempio n. 1
0
 /**
  * User-aware price of the product,
  * accounting for user group, date, specials, etc.
  * Defaults to the product's default price.
  * 
  * @param \Users\Models\Users $user
  * @return unknown
  */
 public function price($variant_id = null, \Users\Models\Users $user = null)
 {
     $price = $this->get('prices.default');
     if (empty($user)) {
         $identity = \Dsc\System::instance()->get('auth')->getIdentity();
         if (!empty($identity->id)) {
             $user = $identity;
         }
     }
     $settings = \Shop\Models\Settings::fetch();
     // find the first user group that has special price override in settings and use it
     $settings_price_override = null;
     $settings_override = false;
     if (!empty($user)) {
         foreach ($user->groups() as $group) {
             $settings_override = $settings->exists('special_group_default_prices.' . $group['slug']);
             if ($settings_override) {
                 // found it, so get the correct number and leave
                 $type_price = 'regular';
                 if (!empty($this->{'prices.list'})) {
                     $type_price = 'sale';
                 }
                 $settings_price_override = 'special_group_default_prices.' . $group['slug'] . '.' . $type_price;
                 break;
             }
         }
     }
     // Get the product price for the user's primary group
     // primaryGroup defaults to the site-wide default user group
     $primaryGroup = \Shop\Models\Customers::primaryGroup($user);
     if ($group_slug = $primaryGroup->{'slug'}) {
         if (!$settings_override && $this->exists('prices.' . $group_slug)) {
             $price = $this->get('prices.' . $group_slug);
         }
     }
     if (!empty($variant_id) && $this->{'policies.variant_pricing.enabled'} && ($variant = $this->variant($variant_id))) {
         $price = $variant['price'];
     }
     // adjust price based on date ranges too
     $using_special_price = false;
     $now = strtotime('now');
     $today = date('Y-m-d', $now);
     foreach ((array) $this->{'prices.special'} as $special_price) {
         if (empty($special_price['group_id']) || $special_price['group_id'] == (string) $primaryGroup->id) {
             if (!empty($special_price['start']['time']) && $special_price['start']['time'] <= $now && (empty($special_price['end']['time']) || $special_price['end']['time'] > $now)) {
                 $price = $special_price['price'];
                 $using_special_price = true;
                 break;
             }
         }
     }
     // don't discount special prices
     if (!$using_special_price && $settings_override) {
         $ratio = 1.0 - (double) $settings->{$settings_price_override} / 100.0;
         $price = $price * $ratio;
     }
     return $price;
 }