예제 #1
0
 /**
  * Method to load a row from the database by primary key and bind the fields
  * to the JTable instance properties.
  *
  * @param   mixed   $keys  An optional primary key value to load the row by, or an array of fields to match.  If not
  *                         set the instance property value is used.
  * @param   boolean $reset True to reset the default values before loading the new row.
  *
  * @return  boolean  True if successful. False if row not found or on error (internal error state set in that case).
  *
  * @link    http://docs.joomla.org/JTable/load
  * @since   11.1
  */
 public function load($keys = null, $reset = true)
 {
     parent::load($keys, $reset);
     $this->slug = $this->id . "." . $this->alias;
     // Calculate funded percent
     if (!$this->goal) {
         $this->fundedPercent = 0;
     } else {
         $percentage = new ITPrismMath();
         $percentage->calculatePercentage($this->funded, $this->goal, 0);
         $this->fundedPercent = (string) $percentage;
     }
     // Calculate end date
     if (!empty($this->funding_days)) {
         $fundingStartDateValidator = new ITPrismValidatorDate($this->funding_start);
         if (!$fundingStartDateValidator->isValid()) {
             $this->funding_end = "0000-00-00";
         } else {
             $fundingStartDate = new CrowdFundingDate($this->funding_start);
             $fundingEndDate = $fundingStartDate->calculateEndDate($this->funding_days);
             $this->funding_end = $fundingEndDate->toSql();
         }
     }
     // Calculate days left
     $today = new CrowdFundingDate();
     $this->daysLeft = $today->calculateDaysLeft($this->funding_days, $this->funding_start, $this->funding_end);
     return true;
 }
예제 #2
0
 /**
  * Method to get an object.
  *
  * @param    integer  $id The id of the object to get.
  *
  * @return    mixed    Object on success, false on failure.
  */
 public function getItem($id = null)
 {
     if (empty($id)) {
         $id = $this->getState($this->context . '.id');
     }
     $storedId = $this->getStoreId($id);
     if (!isset($this->item[$storedId])) {
         $this->item[$storedId] = null;
         $db = $this->getDbo();
         $query = $db->getQuery(true);
         $query->select("a.id, a.title, a.short_desc, a.image,  " . "a.funded, a.goal, a.user_id, " . "a.funding_start, a.funding_end, a.funding_days,  " . $query->concatenate(array("a.id", "a.alias"), "-") . ' AS slug, ' . "b.name AS user_name, " . $query->concatenate(array("c.id", "c.alias"), "-") . ' AS catslug ')->from($db->quoteName("#__crowdf_projects", "a"))->innerJoin($db->quoteName('#__users', 'b') . ' ON a.user_id = b.id')->innerJoin($db->quoteName('#__categories', 'c') . ' ON a.catid = c.id')->where("a.id = " . (int) $id)->where("a.published = 1")->where("a.approved  = 1");
         $db->setQuery($query, 0, 1);
         $result = $db->loadObject();
         // Attempt to load the row.
         if (!empty($result)) {
             // Calculate funded percentage.
             $percent = new ITPrismMath();
             $percent->calculatePercentage($result->funded, $result->goal, 0);
             $result->funded_percents = (string) $percent;
             // Calculate days left
             $today = new CrowdFundingDate();
             $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end);
             $this->item[$storedId] = $result;
         }
     }
     return $this->item[$storedId];
 }
예제 #3
0
 /**
  * Method to change the published state of one or more records.
  *
  * @param   array   &$pks  A list of the primary keys to change.
  * @param   integer $value The value of the published state.
  *
  * @throws Exception
  *
  * @return  boolean  True on success.
  *
  * @since   12.2
  */
 public function publish(&$pks, $value = 0)
 {
     $table = $this->getTable();
     /** @var $table CrowdFundingTableProject */
     $pks = (array) $pks;
     // Access checks.
     foreach ($pks as $pk) {
         $table->reset();
         if ($table->load($pk)) {
             if ($value == CrowdFundingConstants::PUBLISHED) {
                 // Publish a project
                 // Validate funding period
                 jimport("itprism.validator.date");
                 $fundingEndValidator = new ITPrismValidatorDate($table->funding_end);
                 if (!$table->funding_days and !$fundingEndValidator->isValid()) {
                     throw new RuntimeException(JText::_("COM_CROWDFUNDING_ERROR_INVALID_DURATION_PERIOD"));
                 }
                 // Calculate starting date if the user publish a project for first time.
                 $fundingStartValidator = new ITPrismValidatorDate($table->funding_start);
                 if (!$fundingStartValidator->isValid()) {
                     $fundingStart = new JDate();
                     $table->funding_start = $fundingStart->toSql();
                     // If funding type is "days", calculate end date.
                     if (!empty($table->funding_days)) {
                         jimport("crowdfunding.date");
                         $fundingStartDate = new CrowdFundingDate($table->funding_start);
                         $fundingEndDate = $fundingStartDate->calculateEndDate($table->funding_days);
                         $table->funding_end = $fundingEndDate->toSql();
                     }
                 }
                 // Validate the period if the funding type is days
                 $params = JComponentHelper::getParams($this->option);
                 /** @var  $params Joomla\Registry\Registry */
                 $minDays = $params->get("project_days_minimum", 15);
                 $maxDays = $params->get("project_days_maximum");
                 $fundingStartValidator = new ITPrismValidatorDate($table->funding_start);
                 if ($fundingStartValidator->isValid()) {
                     $dateValidator = new CrowdFundingDate($table->funding_start);
                     if (!$dateValidator->isValidPeriod($table->funding_end, $minDays, $maxDays)) {
                         if (!empty($maxDays)) {
                             throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_MAX_DAYS", $minDays, $maxDays));
                         } else {
                             throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_DAYS", $minDays));
                         }
                     }
                 }
                 $table->set("published", CrowdFundingConstants::PUBLISHED);
                 $table->store();
             } else {
                 // Set other states - unpublished, trash,...
                 $table->publish(array($pk), $value);
             }
         }
     }
     // Trigger change state event
     $context = $this->option . '.' . $this->name;
     // Include the content plugins for the change of state event.
     JPluginHelper::importPlugin('content');
     // Trigger the onContentChangeState event.
     $dispatcher = JEventDispatcher::getInstance();
     $result = $dispatcher->trigger($this->event_change_state, array($context, $pks, $value));
     if (in_array(false, $result, true)) {
         throw new Exception(JText::_("COM_CROWDFUNDING_ERROR_CHANGE_STATE"));
     }
     // Clear the component's cache
     $this->cleanCache();
 }
예제 #4
0
 public function prepareItems($items)
 {
     $result = array();
     if (!empty($items)) {
         foreach ($items as $key => $item) {
             $result[$key] = $item;
             // Calculate funding end date
             if (!empty($item->funding_days)) {
                 $fundingStartDate = new CrowdFundingDate($item->funding_start);
                 $fundingEndDate = $fundingStartDate->calculateEndDate($item->funding_days);
                 $result[$key]->funding_end = $fundingEndDate->format("Y-m-d");
             }
             // Calculate funded percentage.
             $percent = new ITPrismMath();
             $percent->calculatePercentage($item->funded, $item->goal, 0);
             $result[$key]->funded_percents = (string) $percent;
             // Calculate days left
             $today = new CrowdFundingDate();
             $result[$key]->days_left = $today->calculateDaysLeft($item->funding_days, $item->funding_start, $item->funding_end);
         }
     }
     return $result;
 }
예제 #5
0
 /**
  * Prepare and sanitise the table prior to saving.
  *
  * @param CrowdFundingTableProject $table
  * @param array $data
  *
  * @throws RuntimeException
  *
  * @since    1.6
  */
 protected function prepareTable(&$table, $data)
 {
     $durationType = JArrayHelper::getValue($data, "duration_type");
     $fundingEnd = JArrayHelper::getValue($data, "funding_end");
     $fundingDays = JArrayHelper::getValue($data, "funding_days");
     switch ($durationType) {
         case "days":
             $table->funding_days = $fundingDays < 0 ? 0 : (int) $fundingDays;
             // Calculate end date
             if (!empty($table->funding_start)) {
                 $fundingStartDate = new CrowdFundingDate($table->funding_start);
                 $fundingEndDate = $fundingStartDate->calculateEndDate($table->funding_days);
                 $table->funding_end = $fundingEndDate->format("Y-m-d");
             } else {
                 $table->funding_end = "0000-00-00";
             }
             break;
         case "date":
             $dateValidator = new ITPrismValidatorDate($fundingEnd);
             if (!$dateValidator->isValid($fundingEnd)) {
                 throw new RuntimeException(JText::_("COM_CROWDFUNDING_ERROR_INVALID_DATE"));
             }
             $date = new JDate($fundingEnd);
             $table->funding_days = 0;
             $table->funding_end = $date->toSql();
             break;
         default:
             $table->funding_days = 0;
             $table->funding_end = "0000-00-00";
             break;
     }
 }
예제 #6
0
 /**
  * Load project data from database.
  *
  * <code>
  * $projectId = 1;
  *
  * $project   = CrowdFundingProject::getInstance(JFactory::getDbo());
  * $project->load($projectId);
  * </code>
  *
  * @param int $id
  *
  * @throws UnexpectedValueException
  */
 public function load($id)
 {
     if (!$id) {
         throw new UnexpectedValueException(JText::_("LIB_CROWDFUNDING_INVALID_PROJECT"));
     }
     $query = $this->db->getQuery(true);
     $query->select("a.id, a.title, a.alias, a.short_desc, a.description, a.image, a.image_square, a.image_small, " . "a.location, a.goal, a.funded, a.funding_type, a.funding_start, a.funding_end, a.funding_days, " . "a.pitch_video, a.pitch_image, a.hits, a.created, a.featured, a.published, a.approved, " . "a.ordering, a.catid, a.type_id, a.user_id, " . $query->concatenate(array("a.id", "a.alias"), "-") . " AS slug, " . $query->concatenate(array("b.id", "b.alias"), "-") . " AS catslug")->from($this->db->quoteName("#__crowdf_projects", "a"))->leftJoin($this->db->quoteName("#__categories", "b") . " ON a.catid = b.id")->where("a.id = " . (int) $id);
     $this->db->setQuery($query);
     $result = $this->db->loadAssoc();
     if (!$result) {
         $result = array();
     }
     $this->bind($result);
     // Calculate funded percent
     if (!$this->goal) {
         $this->fundedPercent = 0;
     } else {
         $math = new ITPrismMath();
         $math->calculatePercentage($this->funded, $this->goal, 0);
         $this->fundedPercent = (string) $math;
     }
     // Calculate end date
     if (!empty($this->funding_days)) {
         $fundingStartDateValidator = new ITPrismValidatorDate($this->funding_start);
         if (!$fundingStartDateValidator->isValid()) {
             $this->funding_end = "0000-00-00";
         } else {
             $fundingStartDate = new CrowdFundingDate($this->funding_start);
             $fundingEndDate = $fundingStartDate->calculateEndDate($this->funding_days);
             $this->funding_end = $fundingEndDate->format("Y-m-d");
         }
     }
     // Calculate days left
     $today = new CrowdFundingDate();
     $this->daysLeft = $today->calculateDaysLeft($this->funding_days, $this->funding_start, $this->funding_end);
 }
예제 #7
0
 /**
  * Method to get an object.
  *
  * @param    integer  $id  The id of the object to get.
  *
  * @return    mixed    Object on success, false on failure.
  */
 public function getItem($id = null)
 {
     if (empty($id)) {
         $id = $this->getState($this->context . '.id');
     }
     $storedId = $this->getStoreId($id);
     if (!isset($this->item[$storedId])) {
         $this->item[$storedId] = null;
         $db = $this->getDbo();
         $query = $db->getQuery(true);
         $query->select("a.id, a.title, a.short_desc, a.description, a.image, a.location, " . "a.funded, a.goal, a.pitch_video, a.pitch_image, " . "a.funding_start, a.funding_end, a.funding_days, a.funding_type,  " . "a.catid, a.user_id, a.published, a.approved, a.hits, " . $query->concatenate(array("a.id", "a.alias"), "-") . ' AS slug, ' . $query->concatenate(array("b.id", "a.alias"), "-") . ' AS catslug')->from($db->quoteName("#__crowdf_projects", "a"))->innerJoin($db->quoteName("#__categories", "b") . " ON a.catid = b.id")->where("a.id = " . (int) $id);
         $db->setQuery($query, 0, 1);
         $result = $db->loadObject();
         // Attempt to load the row.
         if (!empty($result)) {
             // Calculate end date
             if (!empty($result->funding_days)) {
                 $fundingStartDateValidator = new ITPrismValidatorDate($result->funding_start);
                 if (!$fundingStartDateValidator->isValid()) {
                     $result->funding_end = "0000-00-00";
                 } else {
                     $fundingStartDate = new CrowdFundingDate($result->funding_start);
                     $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days);
                     $result->funding_end = $fundingEndDate->format("Y-m-d");
                 }
             }
             // Calculate funded percentage.
             $math = new ITPrismMath();
             $math->calculatePercentage($result->funded, $result->goal, 0);
             $result->funded_percents = (string) $math;
             // Calculate days left.
             $today = new CrowdFundingDate();
             $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end);
             $this->item[$storedId] = $result;
         }
     }
     return $this->item[$storedId];
 }
 /**
  * Validate user data that comes from step "Funding".
  *
  * @param array $data
  * @param Joomla\Registry\Registry $params
  *
  * @return array
  */
 protected function validateStepFunding(&$data, &$params)
 {
     $result = array("success" => false, "message" => "");
     // Validate minimum and maximum amount.
     if ($this->params->get("validate_amount", 1)) {
         $goal = JArrayHelper::getValue($data, "goal", 0, "float");
         $minAmount = $params->get("project_amount_minimum", 100);
         $maxAmount = $params->get("project_amount_maximum");
         // Verify minimum amount
         if ($goal < $minAmount) {
             $result["message"] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_GOAL');
             return $result;
         }
         // Verify maximum amount
         if (!empty($maxAmount) and $goal > $maxAmount) {
             $result["message"] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_GOAL');
             return $result;
         }
     }
     // Validate funding duration - days or date.
     if ($this->params->get("validate_funding_duration", 1)) {
         $minDays = (int) $params->get("project_days_minimum", 15);
         $maxDays = (int) $params->get("project_days_maximum", 0);
         $fundingType = JArrayHelper::getValue($data, "funding_duration_type");
         // Validate funding type "days"
         if (strcmp("days", $fundingType) == 0) {
             $days = JArrayHelper::getValue($data, "funding_days", 0, "integer");
             if ($days < $minDays) {
                 $result["message"] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DAYS');
                 return $result;
             }
             if (!empty($maxDays) and $days > $maxDays) {
                 $result["message"] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DAYS');
                 return $result;
             }
         } else {
             // Validate funding type "date"
             $fundingEndDate = JArrayHelper::getValue($data, "funding_end");
             $dateValidator = new ITPrismValidatorDate($fundingEndDate);
             if (!$dateValidator->isValid()) {
                 $result["message"] = JText::_('PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_DATE');
                 return $result;
             }
         }
     }
     // Validate funding duration when the projects is published and approved.
     if ($this->params->get("validate_funding_duration_approved", 1)) {
         // Get item and check it for active state ( published and approved ).
         $itemId = JArrayHelper::getValue($data, "id");
         $userId = JFactory::getUser()->get("id");
         $item = $this->getItem($itemId, $userId);
         // Validate date if user want to edit date, while the project is published.
         if ($item->published and $item->approved) {
             $minDays = (int) $params->get("project_days_minimum", 15);
             $maxDays = (int) $params->get("project_days_maximum", 0);
             $fundingType = JArrayHelper::getValue($data, "funding_duration_type");
             // Generate funding end date from days.
             if (strcmp("days", $fundingType) == 0) {
                 // Get funding days.
                 $days = JArrayHelper::getValue($data, "funding_days", 0, "integer");
                 $fundingStartDate = new CrowdFundingDate($item->funding_start);
                 $endDate = $fundingStartDate->calculateEndDate($days);
                 $fundingEndDate = $endDate->format("Y-m-d");
             } else {
                 // Get funding end date from request
                 $fundingEndDate = JArrayHelper::getValue($data, "funding_end");
             }
             // Validate the period.
             $dateValidator = new CrowdFundingDate($item->funding_start);
             if (!$dateValidator->isValidPeriod($fundingEndDate, $minDays, $maxDays)) {
                 $result["message"] = !empty($maxDays) ? JText::sprintf("PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_ENDING_DATE_MIN_MAX_DAYS", $minDays, $maxDays) : JText::sprintf("PLG_CONTENT_CROWDFUNDINGVALIDATOR_ERROR_INVALID_ENDING_DATE_MIN_DAYS", $minDays);
                 return $result;
             }
         }
     }
     // Validations completed successfully.
     $result = array("success" => true);
     return $result;
 }
예제 #9
0
 /**
  * This method calculate start date and validate funding period.
  *
  * @param CrowdFundingTableProject $table
  *
  * @throws Exception
  */
 protected function prepareTable(&$table)
 {
     // Calculate start and end date if the user publish a project for first time.
     $fundingStartDate = new ITPrismValidatorDate($table->funding_start);
     if (!$fundingStartDate->isValid($table->funding_start)) {
         $fundingStart = new JDate();
         $table->funding_start = $fundingStart->toSql();
         // If funding type is "days", calculate end date.
         if ($table->get("funding_days")) {
             $fundingStartDate = new CrowdFundingDate($table->get("funding_start"));
             $endDate = $fundingStartDate->calculateEndDate($table->get("funding_days"));
             $table->set("funding_end", $endDate->format("Y-m-d"));
         }
     }
     // Get parameters
     $app = JFactory::getApplication();
     /** @var $app JApplicationSite */
     $params = $app->getParams();
     /** @var  $params Joomla\Registry\Registry */
     $minDays = $params->get("project_days_minimum", 15);
     $maxDays = $params->get("project_days_maximum");
     // If there is an ending date, validate the period.
     $fundingEndDate = new ITPrismValidatorDate($table->get("funding_end"));
     if ($fundingEndDate->isValid()) {
         $fundingStartDate = new CrowdFundingDate($table->get("funding_start"));
         if (!$fundingStartDate->isValidPeriod($table->get("funding_end"), $minDays, $maxDays)) {
             if (!empty($maxDays)) {
                 throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_MAX_DAYS", $minDays, $maxDays));
             } else {
                 throw new RuntimeException(JText::sprintf("COM_CROWDFUNDING_ERROR_INVALID_ENDING_DATE_MIN_DAYS", $minDays));
             }
         }
     }
 }
예제 #10
0
 /**
  * Method to get an object.
  *
  * @param    integer $id   The id of the object to get.
  *
  * @return    mixed    Object on success, false on failure.
  */
 public function getItem($id = null)
 {
     if (empty($id)) {
         $id = $this->getState('id');
     }
     if (is_null($this->item)) {
         $db = $this->getDbo();
         $query = $db->getQuery(true);
         $query->select("a.id, a.title, a.short_desc, a.image, " . "a.funded, a.goal, a.pitch_video, a.pitch_image, " . "a.funding_start, a.funding_end, a.funding_days, " . "a.funding_type, a.user_id,  a.type_id, " . "b.name AS user_name, " . $query->concatenate(array("a.id", "a.alias"), "-") . ' AS slug, ' . $query->concatenate(array("c.id", "c.alias"), "-") . ' AS catslug')->from($db->quoteName("#__crowdf_projects", "a"))->innerJoin($db->quoteName('#__users', 'b') . ' ON a.user_id = b.id')->innerJoin($db->quoteName('#__categories', 'c') . ' ON a.catid = c.id')->where("a.id = " . (int) $id)->where("a.published = 1")->where("a.approved  = 1");
         $db->setQuery($query, 0, 1);
         $result = $db->loadObject();
         // Attempt to load the row.
         if (!empty($result)) {
             // Calculate ending date by days left.
             if (!empty($result->funding_days)) {
                 $fundingStartDate = new CrowdFundingDate($result->funding_start);
                 $fundingEndDate = $fundingStartDate->calculateEndDate($result->funding_days);
                 $result->funding_end = $fundingEndDate->format("Y-m-d");
             }
             // Calculate funded percent
             $percent = new ITPrismMath();
             $percent->calculatePercentage($result->funded, $result->goal, 0);
             $result->funded_percents = (string) $percent;
             // Calculate days left.
             $today = new CrowdFundingDate();
             $result->days_left = $today->calculateDaysLeft($result->funding_days, $result->funding_start, $result->funding_end);
             $this->item = $result;
         }
     }
     return $this->item;
 }