/**
  * inspects delete action
  *
  * @param array $_ids
  * @return array of ids to actually delete
  */
 protected function _inspectDelete(array $_ids)
 {
     $cc = Sales_Controller_Contract::getInstance();
     $filter = new Sales_Model_ContractFilter(array());
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'billing_address_id', 'operator' => 'in', 'value' => $_ids)));
     $contracts = $cc->search($filter);
     if ($contracts->count()) {
         $e = new Sales_Exception_DeleteUsedBillingAddress();
         $e->setContracts($contracts);
         throw $e;
     }
     return $_ids;
 }
 /**
  * creates the auto invoices, gets called by cli
  * 
  * @param Tinebase_DateTime $currentDate
  * @param Sales_Model_Contract $contract
  * @param boolean $merge
  */
 public function createAutoInvoices(Tinebase_DateTime $currentDate, Sales_Model_Contract $contract = NULL, $merge = false)
 {
     $this->_autoInvoiceIterationResults = array();
     $this->_autoInvoiceIterationDetailResults = array();
     $this->_autoInvoiceIterationFailures = array();
     $contractBackend = new Sales_Backend_Contract();
     $ids = $contract ? array($contract->getId()) : $contractBackend->getBillableContractIds($currentDate);
     $filter = new Sales_Model_ContractFilter(array());
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'id', 'operator' => 'in', 'value' => $ids)));
     $iterator = new Tinebase_Record_Iterator(array('iteratable' => $this, 'controller' => Sales_Controller_Contract::getInstance(), 'filter' => $filter, 'options' => array('getRelations' => TRUE, 'limit' => $this->_autoInvoiceIterationLimit), 'function' => 'processAutoInvoiceIteration'));
     $iterator->iterate($currentDate, $merge);
     unset($this->_autoInvoiceIterationDetailResults);
     $result = array('failures' => $this->_autoInvoiceIterationFailures, 'failures_count' => count($this->_autoInvoiceIterationFailures), 'created' => $this->_autoInvoiceIterationResults, 'created_count' => count($this->_autoInvoiceIterationResults));
     return $result;
 }
 public function setLastAutobill()
 {
     if (!Sales_Config::getInstance()->featureEnabled(Sales_Config::FEATURE_INVOICES_MODULE)) {
         Tinebase_Core::getLogger()->crit(__METHOD__ . '::' . __LINE__ . ' setLastAutobill ran allthoug feature ' . Sales_Config::FEATURE_INVOICES_MODULE . ' is disabled');
         return false;
     }
     $cc = Sales_Controller_Contract::getInstance();
     $pc = Sales_Controller_ProductAggregate::getInstance();
     $date = Tinebase_DateTime::now()->setTimezone(Tinebase_Core::getUserTimezone());
     $date->setDate($date->format('Y'), 1, 1)->setTime(0, 0, 0);
     $date->setTimezone('UTC');
     $filter = new Sales_Model_ContractFilter(array(array('field' => 'start_date', 'operator' => 'after_or_equals', 'value' => $date)));
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'end_date', 'operator' => 'isnull', 'value' => NULL)));
     $contracts = $cc->search($filter);
     foreach ($contracts as $contract) {
         $filter = new Sales_Model_ProductAggregateFilter(array());
         $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'contract_id', 'operator' => 'equals', 'value' => $contract->getId())));
         echo 'Updating last_autobill of ' . $contract->title . PHP_EOL;
         $contract->last_autobill = clone $contract->start_date;
         $contract->last_autobill->subMonth($contract->interval);
         foreach ($pc->search($filter) as $pagg) {
             echo 'Updating last_autobill of product assigned to ' . $contract->title . PHP_EOL;
             $pagg->last_autobill = clone $contract->start_date;
             $pagg->last_autobill->subMonth($pagg->interval);
             $pc->update($pagg);
         }
         $cc->update($contract);
     }
 }
 /**
  * update from 5.4 -> 5.5
  * - set cleared to text
  * - change default values for cleared, status 
  * 
  * @return void
  */
 public function update_4()
 {
     $declaration = new Setup_Backend_Schema_Field_Xml('
         <field>
             <name>cleared</name>
             <type>text</type>
             <length>64</length>
             <default>not yet cleared</default>
         </field>');
     $this->_backend->alterCol('sales_contracts', $declaration);
     $declaration = new Setup_Backend_Schema_Field_Xml('
         <field>
             <name>status</name>
             <type>text</type>
             <length>64</length>
             <default>open</default>
         </field>');
     $this->_backend->alterCol('sales_contracts', $declaration);
     $this->setTableVersion('sales_contracts', 4);
     // transfer cleared value
     $be = new Sales_Backend_Contract();
     $filter = new Sales_Model_ContractFilter(array(), 'AND');
     $filter->addFilter(new Tinebase_Model_Filter_Text('cleared', 'equals', '0'));
     $results = $be->search($filter, null, false, true);
     $be->updateMultiple($results, array('cleared' => 'NOTCLEARED'));
     $filter = new Sales_Model_ContractFilter(array(), 'AND');
     $filter->addFilter(new Tinebase_Model_Filter_Text('cleared', 'equals', '1'));
     $results = $be->search($filter, null, false, true);
     $be->updateMultiple($results, array('cleared' => 'CLEARED'));
     // keyfieldconfigs
     $cb = new Tinebase_Backend_Sql(array('modelName' => 'Tinebase_Model_Config', 'tableName' => 'config'));
     $appId = Tinebase_Application::getInstance()->getApplicationByName('Sales')->getId();
     $salesStatusConfig = array('name' => Sales_Config::CONTRACT_STATUS, 'records' => array(array('id' => 'OPEN', 'value' => 'open', 'icon' => 'images/oxygen/16x16/places/folder-green.png', 'system' => true), array('id' => 'CLOSED', 'value' => 'closed', 'icon' => 'images/oxygen/16x16/places/folder-red.png', 'system' => true)));
     $cb->create(new Tinebase_Model_Config(array('application_id' => $appId, 'name' => Sales_Config::CONTRACT_STATUS, 'value' => json_encode($salesStatusConfig))));
     $salesClearedConfig = array('name' => Sales_Config::CONTRACT_CLEARED, 'records' => array(array('id' => 'TOCLEAR', 'value' => 'to clear', 'icon' => 'images/oxygen/16x16/actions/dialog-warning.png', 'system' => true), array('id' => 'NOTCLEARED', 'value' => 'not yet cleared', 'icon' => 'images/oxygen/16x16/actions/edit-delete.png', 'system' => true), array('id' => 'CLEARED', 'value' => 'cleared', 'icon' => 'images/oxygen/16x16/actions/dialog-ok-apply.png', 'system' => true)));
     $cb->create(new Tinebase_Model_Config(array('application_id' => $appId, 'name' => Sales_Config::CONTRACT_CLEARED, 'value' => json_encode($salesClearedConfig))));
     $this->setApplicationVersion('Sales', '5.5');
 }
 public function setLastAutobill()
 {
     $cc = Sales_Controller_Contract::getInstance();
     $pc = Sales_Controller_ProductAggregate::getInstance();
     $date = Tinebase_DateTime::now()->setTimezone(Tinebase_Core::getUserTimezone());
     $date->setDate($date->format('Y'), 1, 1)->setTime(0, 0, 0);
     $date->setTimezone('UTC');
     $filter = new Sales_Model_ContractFilter(array(array('field' => 'start_date', 'operator' => 'after_or_equals', 'value' => $date)));
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'end_date', 'operator' => 'isnull', 'value' => NULL)));
     $contracts = $cc->search($filter);
     foreach ($contracts as $contract) {
         $filter = new Sales_Model_ProductAggregateFilter(array());
         $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'contract_id', 'operator' => 'equals', 'value' => $contract->getId())));
         echo 'Updating last_autobill of ' . $contract->title . PHP_EOL;
         $contract->last_autobill = clone $contract->start_date;
         $contract->last_autobill->subMonth($contract->interval);
         foreach ($pc->search($filter) as $pagg) {
             echo 'Updating last_autobill of product assigned to ' . $contract->title . PHP_EOL;
             $pagg->last_autobill = clone $contract->start_date;
             $pagg->last_autobill->subMonth($pagg->interval);
             $pc->update($pagg);
         }
         $cc->update($contract);
     }
 }