/**
  * tests the correct replacement of markers with different contents
  */
 public function testMarkerReplacement()
 {
     $doc = new OpenDocument_Document(OpenDocument_Document::SPREADSHEET);
     $table = $doc->getBody()->appendTable('UNITTEST');
     $titleText = 'Hello unittest!';
     $row = $table->appendRow();
     $cell = $row->appendCell($titleText);
     $row = $table->appendRow();
     $row = $table->appendRow();
     $cell = $row->appendCell('###MATRIX###');
     $row = $table->appendRow();
     $row = $table->appendRow();
     $cell = $row->appendCell('###MARKER###');
     $filename = Tinebase_Config::getInstance()->get('tmpdir') . DIRECTORY_SEPARATOR . Tinebase_Record_Abstract::generateUID(4) . '-ods-unittest.ods';
     $ccc = Sales_Controller_CostCenter::getInstance();
     $cc1 = $ccc->create(new Sales_Model_CostCenter(array('number' => 'cc1', 'remark' => 'unittest-cc1')));
     $cc2 = $ccc->create(new Sales_Model_CostCenter(array('number' => 'cc2', 'remark' => 'unittest-cc2')));
     $colInfo = array();
     $colInfo[$cc1->getId()] = $cc1->number;
     $colInfo[$cc2->getId()] = $cc2->number;
     $matrixArray = array($cc1->getId() => array($cc2->getId() => '100'), $cc2->getId() => array($cc1->getId() => '200'));
     $matrix = new OpenDocument_Matrix($matrixArray, $colInfo, $colInfo, OpenDocument_Matrix::TYPE_FLOAT);
     $matrix->setColumnLegendDescription('Cat');
     $matrix->setRowLegendDescription('Dog');
     $markerText = 'unittest-marker';
     $doc->replaceMarker('marker', $markerText)->replaceMatrix('matrix', $matrix);
     $doc->getDocument($filename);
     $contentXml = file_get_contents('zip://' . $filename . '#content.xml');
     $xml = simplexml_load_string($contentXml);
     unlink($filename);
     $spreadSheets = $xml->xpath('//office:body/office:spreadsheet');
     $this->assertEquals(1, count($spreadSheets));
     $spreadSheet = $spreadSheets[0];
     $results = $spreadSheet->xpath("//text()[contains(., '{$markerText}')]");
     $this->assertEquals(1, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., '{$titleText}')]");
     $this->assertEquals(1, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., '{$cc1->number}')]");
     $this->assertEquals(2, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., '{$cc2->number}')]");
     $this->assertEquals(2, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., 'Sum')]");
     $this->assertEquals(2, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., 'Cat')]");
     $this->assertEquals(1, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., 'Dog')]");
     $this->assertEquals(1, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., '100')]");
     $this->assertEquals(3, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., '200')]");
     $this->assertEquals(3, count($results));
     $results = $spreadSheet->xpath("//text()[contains(., '300')]");
     $this->assertEquals(1, count($results));
 }
 /**
  * tests for the costcenter controller
  */
 public function testCostCenterController()
 {
     $cc = $this->_getCostCenter();
     $ccRet = Sales_Controller_CostCenter::getInstance()->create($cc);
     $this->assertEquals($cc->id, $ccRet->id);
     $this->assertEquals($cc->number, $ccRet->number);
     $this->assertEquals($cc->remark, $ccRet->remark);
     // check uniquity
     $cc1 = $this->_getCostCenter();
     $this->setExpectedException('Tinebase_Exception_Duplicate');
     Sales_Controller_CostCenter::getInstance()->create($cc1);
 }
 /**
  * @see Tinebase_Setup_DemoData_Abstract
  * 
  */
 protected function _beforeCreate()
 {
     $this->_ccController = Sales_Controller_CostCenter::getInstance();
     $this->_taController = Timetracker_Controller_Timeaccount::getInstance();
     $this->_taController->sendNotifications(FALSE);
     $this->_tsController = Timetracker_Controller_Timesheet::getInstance();
     $this->_tsController->sendNotifications(FALSE);
     $this->_tsController->doContainerACLChecks(false);
     $this->_contractController = Sales_Controller_Contract::getInstance();
     $contracts = $this->_contractController->getAll();
     $developmentString = self::$_de ? 'Entwicklung' : 'Development';
     $this->_contractsDevelopment = $contracts->filter('title', '/.' . $developmentString . '/', TRUE);
     $this->_contractsMarketing = $contracts->filter('title', '/.Marketing/', TRUE);
     $this->_loadCostCentersAndDivisions();
     if (Tinebase_Application::getInstance()->isInstalled('HumanResources')) {
         $this->_empController = HumanResources_Controller_Employee::getInstance();
         $filter = new HumanResources_Model_EmployeeFilter(array());
         $this->_employees = $this->_empController->search($filter);
     }
     // set start date to start date of june 1st before last year
     $date = Tinebase_DateTime::now();
     $this->_startDate = $date->subMonth(3)->setTime(8, 0, 0);
     // set clearedDate almost a month after
     $this->_clearedDate = clone $this->_startDate;
     $this->_clearedDate->addMonth(1)->subDay(2);
 }
 /**
  * do conversions
  *
  * @param array $_data
  * @return array
  */
 protected function _doConversions($_data)
 {
     $result = parent::_doConversions($_data);
     if ((isset($result['warranty']) || array_key_exists('warranty', $result)) && empty($_data['warranty'])) {
         unset($result['warranty']);
     }
     if ((isset($result['invoice_date']) || array_key_exists('invoice_date', $result)) && empty($_data['invoice_date'])) {
         unset($result['invoice_date']);
     }
     if ((isset($result["name"]) || array_key_exists("name", $result)) && $result['name'] == "") {
         $result['name'] = "!Not defined!";
     }
     if ((isset($result["inventory_id"]) || array_key_exists("inventory_id", $result)) && $result['inventory_id'] == "") {
         $result['inventory_id'] = Tinebase_Record_Abstract::generateUID(40);
     }
     if (isset($result["costcentre"]) || array_key_exists("costcentre", $result)) {
         $result["costcentre"] = $c = Sales_Controller_CostCenter::getInstance()->search(new Sales_Model_CostCenterFilter(array(array('field' => 'number', 'operator' => 'equals', 'value' => $result["costcentre"]))))->getFirstRecord();
     }
     if (isset($result["status"]) || array_key_exists("status", $result)) {
         $statusRecord = Inventory_Config::getInstance()->get(Inventory_Config::INVENTORY_STATUS)->getKeyfieldRecordByValue($result["status"]);
         if (empty($statusRecord)) {
             $statusRecord = Inventory_Config::getInstance()->get(Inventory_Config::INVENTORY_STATUS)->getKeyfieldDefault();
         }
         $result["status"] = $statusRecord['id'];
     }
     return $result;
 }
 protected function _createCostCenters()
 {
     $this->_costcenterController = Sales_Controller_CostCenter::getInstance();
     $this->_costcenterRecords = new Tinebase_Record_RecordSet('Sales_Model_CostCenter');
     $ccs = array('unittest1', 'unittest2', 'unittest3', 'unittest4');
     $id = 1;
     $allCC = $this->_costcenterController->getAll();
     foreach ($ccs as $title) {
         $cc = new Sales_Model_CostCenter(array('remark' => $title, 'number' => $id));
         try {
             $this->_costcenterRecords->addRecord($this->_costcenterController->create($cc));
         } catch (Tinebase_Exception_Duplicate $e) {
             $this->_costcenterRecords->addRecord($e->getClientRecord());
         } catch (Zend_Db_Statement_Exception $e) {
             $this->_costcenterRecords->addRecord($allCC->filter('number', $id)->getFirstRecord());
         }
         $id++;
     }
 }
 /**
  * get cost center
  * 
  * @param string
  * @return Sales_Model_CostCenter
  */
 protected function _getCostCenter($number = NULL)
 {
     if ($number !== NULL) {
         $c = Sales_Controller_CostCenter::getInstance()->search(new Sales_Model_CostCenterFilter(array(array('field' => 'number', 'operator' => 'equals', 'value' => $number))))->getFirstRecord();
         if ($c) {
             return $c;
         }
     }
     $c = new Sales_Model_CostCenter(array('number' => $number ? $number : Tinebase_Record_Abstract::generateUID(), 'remark' => Tinebase_Record_Abstract::generateUID()));
     return $c;
 }
 /**
  * returns the current or by date valid costcenter for an employee
  *
  * @param HumanResources_Model_Employee|string $employeeId
  * @param Tinebase_DateTime $date
  * @param boolean $getSalesCostCenter if true, this returns the sales costcenter, not the mm-table like hr costcenter
  * 
  * @return HumanResources_Model_CostCenter|Sales_Model_CostCenter
  */
 public function getValidCostCenter($employeeId, $date = NULL, $getSalesCostCenter = FALSE)
 {
     if (!$employeeId) {
         throw new Tinebase_Exception_InvalidArgument('You have to set an employee at least');
     }
     if (!is_string($employeeId)) {
         $employeeId = $employeeId->getId();
     }
     $date = $date ? new Tinebase_DateTime($date) : new Tinebase_DateTime();
     $filter = new HumanResources_Model_CostCenterFilter(array(), 'AND');
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'employee_id', 'operator' => 'equals', 'value' => $employeeId)));
     $filter->addFilter(new Tinebase_Model_Filter_Date(array('field' => 'start_date', 'operator' => 'before', 'value' => $date)));
     $result = $this->search($filter);
     if ($result->count()) {
         $result->sort('start_date', 'ASC');
         $cc = $result->getFirstRecord();
         if ($getSalesCostCenter) {
             return Sales_Controller_CostCenter::getInstance()->get($cc->cost_center_id);
         } else {
             return $cc;
         }
     } else {
         return NULL;
     }
 }
 /**
  * tests if nested transactions will be rolled back, if the outer fails
  */
 public function testNestedTransactions()
 {
     $c1 = Sales_Controller_Contract::getInstance();
     $c2 = Sales_Controller_CostCenter::getInstance();
     $tm = Tinebase_TransactionManager::getInstance();
     $tm->startTransaction(Tinebase_Core::getDb());
     try {
         // create cost center
         $costCenter = $c2->create(new Sales_Model_CostCenter(array('number' => 123, 'remark' => 'unittest123')));
         // exception should be thrown (title needed)
         $c1->create(new Sales_Model_Contract(array()));
     } catch (Exception $e) {
         $tm->rollBack();
     }
     $this->setExpectedException('Tinebase_Exception_NotFound');
     // try to get the created cost center
     $c2->get($costCenter->getId());
 }
 /**
  * loads all costcenters to this._costCenters property
  * 
  * @return Tinebase_Record_RecordSet
  */
 protected function _loadCostCentersAndDivisions()
 {
     $filter = new Sales_Model_CostCenterFilter(array());
     $this->_costCenters = Sales_Controller_CostCenter::getInstance()->search($filter)->sort('number');
     $this->_costCenterKeys[] = array();
     foreach ($this->_costCenters as $cc) {
         if ($cc->remark == 'Marketing') {
             $this->_marketingCostCenter = $cc;
         }
         if ($cc->remark == 'Development' || $cc->remark == 'Entwicklung') {
             $this->_developmentCostCenter = $cc;
         }
         $this->_costCenterKeys[] = $cc->getId();
     }
     $filter = new Sales_Model_DivisionFilter(array());
     $this->_divisions = Sales_Controller_Division::getInstance()->search($filter)->sort('number');
     return $this->_costCenters;
 }
 /**
  * the singleton pattern
  * @return Sales_Controller_CostCenter
  */
 public static function getInstance()
 {
     if (self::$_instance === NULL) {
         self::$_instance = new self();
     }
     return self::$_instance;
 }
 /**
  * deletes existing records
  *
  * @param  array $ids
  * @return string
  */
 public function deleteCostCenters($ids)
 {
     return $this->_delete($ids, Sales_Controller_CostCenter::getInstance());
 }
 /**
  * Return a single record
  *
  * @param   string $id
  * @return  array record data
  */
 public function getEmployee($id)
 {
     $employee = $this->_get($id, HumanResources_Controller_Employee::getInstance());
     if ((isset($employee['account_id']) || array_key_exists('account_id', $employee)) && !empty($employee['account_id']['contact_id'])) {
         try {
             $employee['account_id']['contact_id'] = Addressbook_Controller_Contact::getInstance()->get($employee['account_id']['contact_id']);
         } catch (Tinebase_Exception_NotFound $e) {
             // do nothing
         }
     }
     // TODO: resolve this in controller
     if (!empty($employee['costcenters']) && is_array($employee['costcenters'])) {
         $cc = Sales_Controller_CostCenter::getInstance()->search(new Sales_Model_CostCenterFilter(array()));
         for ($i = 0; $i < count($employee['costcenters']); $i++) {
             $costCenter = $cc->filter('id', $employee['costcenters'][$i]['cost_center_id'])->getFirstRecord();
             if ($costCenter) {
                 $employee['costcenters'][$i]['cost_center_id'] = $costCenter->toArray();
             }
         }
     }
     // TODO: resolve this in controller
     // add feast calendars
     if (!empty($employee['contracts'])) {
         for ($i = 0; $i < count($employee['contracts']); $i++) {
             if (!$employee['contracts'][$i]['feast_calendar_id']) {
                 continue;
             }
             try {
                 $cal = Tinebase_Container::getInstance()->get($employee['contracts'][$i]['feast_calendar_id']);
                 $employee['contracts'][$i]['feast_calendar_id'] = $cal->toArray();
             } catch (Tinebase_Exception_NotFound $e) {
                 $employee['contracts'][$i]['feast_calendar_id'] = NULL;
             }
         }
     }
     $aids = array();
     $fids = array();
     // TODO: resolve this in controller
     foreach (array('vacation', 'sickness') as $type) {
         if (!empty($employee[$type]) && is_array($employee[$type])) {
             foreach ($employee[$type] as $v) {
                 $aids[] = $v['account_id'];
                 $fids[] = $v['id'];
             }
         }
     }
     $aids = array_unique($aids);
     $fids = array_unique($fids);
     $acs = HumanResources_Controller_Account::getInstance()->getMultiple($aids);
     $freedayFilter = new HumanResources_Model_FreeDayFilter(array());
     $freedayFilter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'freetime_id', 'operator' => 'in', 'value' => $fids)));
     $fds = HumanResources_Controller_FreeDay::getInstance()->search($freedayFilter);
     $fds->setTimezone(Tinebase_Core::getUserTimezone());
     foreach (array('vacation', 'sickness') as $type) {
         if (!empty($employee[$type]) && is_array($employee[$type])) {
             for ($i = 0; $i < count($employee[$type]); $i++) {
                 $account = $acs->filter('id', $employee[$type][$i]['account_id'])->getFirstRecord();
                 if ($account) {
                     $employee[$type][$i]['account_id'] = $account->toArray();
                 }
                 $freedays = $fds->filter('freetime_id', $employee[$type][$i]['id']);
                 $employee[$type][$i]['freedays'] = $freedays->toArray();
             }
         }
     }
     return $employee;
 }
 /**
  * test if a user, who has no manage_invoices - right, is able tosave a timeaccount having an invoice linked
  */
 public function testUpdateInvoiceLinkedTimeaccount()
 {
     $this->markTestSkipped('0010492: fix failing invoices and timetracker tests');
     $ta = $this->_getTimeaccount(array('title' => 'to find'), true);
     $cc = Sales_Controller_CostCenter::getInstance()->create(new Sales_Model_CostCenter(array('number' => 1, 'title' => 'test')));
     $customer = Sales_Controller_Customer::getInstance()->create(new Sales_Model_Customer(array('number' => 100, 'name' => 'test', 'description' => 'unittest', 'credit_term' => 1)));
     $address = Sales_Controller_Address::getInstance()->create(new Sales_Model_Address(array('street' => 'teststreet', 'locality' => 'testcity', 'customer_id' => $customer->id, 'postalcode' => 12345)));
     $invoice = Sales_Controller_Invoice::getInstance()->create(new Sales_Model_Invoice(array('description' => 'test', 'address_id' => $address->id, 'date' => Tinebase_DateTime::now(), 'credit_term' => 1, 'type' => 'INVOICE', 'start_date' => Tinebase_DateTime::now(), 'end_date' => Tinebase_DateTime::now()->addMonth(1), 'costcenter_id' => $cc->id)));
     Tinebase_Relations::getInstance()->setRelations('Sales_Model_Invoice', 'Sql', $invoice->id, array(array('related_id' => $ta->id, 'related_model' => 'Timetracker_Model_Timeaccount', 'related_record' => $ta, 'own_degree' => 'sibling', 'type' => 'INVOICE')));
     // fetch user group
     $group = Tinebase_Group::getInstance()->getGroupByName('Users');
     $groupId = $group->getId();
     // create new user
     $user = new Tinebase_Model_FullUser(array('accountLoginName' => 'testuser', 'accountPrimaryGroup' => $groupId, 'accountDisplayName' => 'Test User', 'accountLastName' => 'User', 'accountFirstName' => 'Test', 'accountFullName' => 'Test User', 'accountEmailAddress' => '*****@*****.**'));
     $user = Admin_Controller_User::getInstance()->create($user, 'pw', 'pw');
     // add tt-ta admin right to user role to allow user to update (manage) timeaccounts
     // user has no right to see sales contracts
     $fe = new Admin_Frontend_Json();
     $userRoles = $fe->getRoles('user', array(), array(), 0, 1);
     $userRole = $fe->getRole($userRoles['results'][0]['id']);
     $roleRights = $fe->getRoleRights($userRole['id']);
     $roleMembers = $fe->getRoleMembers($userRole['id']);
     $roleMembers['results'][] = array('name' => 'testuser', 'type' => 'user', 'id' => $user->accountId);
     $app = Tinebase_Application::getInstance()->getApplicationByName('Timetracker');
     $roleRights['results'][] = array('application_id' => $app->getId(), 'right' => Timetracker_Acl_Rights::MANAGE_TIMEACCOUNTS);
     $roleRights['results'][] = array('application_id' => $app->getId(), 'right' => Tinebase_Acl_Rights::ADMIN);
     $fe->saveRole($userRole, $roleMembers['results'], $roleRights['results']);
     // switch to other user
     $this->_testUser = Tinebase_Core::getUser();
     Tinebase_Core::set(Tinebase_Core::USER, $user);
     $ta = $this->_json->getTimeaccount($ta->id);
     $this->assertTrue(empty($ta['relations']), 'relations are not empty: ' . print_r($ta['relations'], true));
     // this must be possible
     $ta = $this->_json->saveTimeaccount($ta);
     Tinebase_Core::set(Tinebase_Core::USER, $this->_testUser);
     $ta = $this->_json->getTimeaccount($ta['id']);
     $this->assertTrue(count($ta['relations']) == 1);
 }
 /**
  * test InventoryItem - CostCenter filter
  * @see: 0009588: InventoryItem-CostCenter filter fails without rights on Sales-App
  *       https://forge.tine20.org/mantisbt/view.php?id=9588
  */
 public function testCostCenterFilter()
 {
     $cc = Sales_Controller_CostCenter::getInstance()->create(new Sales_Model_CostCenter(array('remark' => 'test123qwe', 'number' => 123)));
     $inventoryItem = $this->_getInventoryItem();
     $inventoryItem->costcentre = $cc->getId();
     $this->_json->saveInventoryItem($inventoryItem->toArray());
     $inventoryItem = $this->_getInventoryItem();
     $this->_json->saveInventoryItem($inventoryItem->toArray());
     $filter = Zend_Json::decode('[{"condition":"OR","filters":[{"condition":"AND","filters":[{"field":"costcentre","operator":"AND","value":[{"field":":id","operator":"equals","value":"' . $cc->getId() . '"}],"id":"ext-record-2"}],"id":"ext-comp-1135","label":"test"}]}]');
     $result = $this->_json->searchInventoryItems($filter, array());
     $this->assertEquals(1, $result['totalcount']);
 }
 /**
  * create some costcenters
  *
  * @see Tinebase_Setup_DemoData_Abstract
  */
 protected function _onCreate()
 {
     $controller = Sales_Controller_CostCenter::getInstance();
     $this->_costCenters = new Tinebase_Record_RecordSet('Sales_Model_CostCenter');
     $ccs = static::$_de ? array('Management', 'Marketing', 'Entwicklung', 'Produktion', 'Verwaltung', 'Controlling') : array('Management', 'Marketing', 'Development', 'Production', 'Administration', 'Controlling');
     $be = new Sales_Backend_CostCenter();
     $be->setModlogActive(FALSE);
     $allCC = $be->getAll();
     $id = 1;
     foreach ($ccs as $title) {
         $cc = new Sales_Model_CostCenter(array('remark' => $title, 'number' => $id));
         try {
             $record = $controller->create($cc);
             $this->_costCenters->addRecord($record);
         } catch (Zend_Db_Statement_Exception $e) {
             $cc = $allCC->filter('number', $id)->getFirstRecord();
             $cc->is_deleted = 0;
             $this->_costCenters->addRecord($be->update($cc));
         } catch (Tinebase_Exception_Duplicate $e) {
             $cc = $allCC->filter('number', $e->getClientRecord()->number)->getFirstRecord();
             $cc->is_deleted = 0;
             $this->_costCenters->addRecord($be->update($cc));
         }
         $id++;
     }
     $divisionsArray = static::$_de ? array('Management', 'EDV', 'Marketing', 'Public Relations', 'Produktion', 'Verwaltung') : array('Management', 'IT', 'Marketing', 'Public Relations', 'Production', 'Administration');
     foreach ($divisionsArray as $divisionName) {
         Sales_Controller_Division::getInstance()->create(new Sales_Model_Division(array('title' => $divisionName)));
     }
     $this->_loadCostCentersAndDivisions();
 }
 /**
  * sanitize employee data
  * - fix n_fn + street(2) + contract / cost center
  * 
  * @param Zend_Console_Getopt $opts
  * @param HumanResources_Model_Employee $employee
  */
 protected function _sanitizeEmployee($opts, $employee)
 {
     if (preg_match('/([\\w\\s]+), ([\\w\\s]+)/u', $employee->n_fn, $matches)) {
         $employee->n_fn = $matches[2] . ' ' . $matches[1];
     }
     if (!empty($employee->street2)) {
         $employee->street = $employee->street . ' ' . $employee->street2;
         $employee->street2 = '';
     }
     if (!empty($employee->countryname)) {
         if (Tinebase_Core::isLogLevel(Zend_Log::DEBUG)) {
             Tinebase_Core::getLogger()->debug(__METHOD__ . '::' . __LINE__ . ' ' . 'Trying to add contract with cost center number ' . $employee->countryname);
         }
         $args = $this->_parseArgs($opts);
         // expecting cost center number here, creating contract from data
         $costCenter = Sales_Controller_CostCenter::getInstance()->search(new Sales_Model_CostCenterFilter(array(array('field' => 'number', 'operator' => 'equals', 'value' => $employee->countryname))))->getFirstRecord();
         $contract = HumanResources_Controller_Employee::getInstance()->createContractDataForEmployee(array('feastCalendarId' => isset($args['feast_calendar_id']) ? $args['feast_calendar_id'] : NULL, 'workingTimeModelId' => isset($args['working_time_model_id']) ? $args['working_time_model_id'] : NULL, 'vacationDays' => isset($args['vacation_days']) ? $args['vacation_days'] : NULL, 'startDate' => $employee->employment_begin ? $employee->employment_begin : NULL), TRUE);
         $employee->contracts = new Tinebase_Record_RecordSet('HumanResources_Model_Contract');
         $employee->contracts->addRecord(new HumanResources_Model_Contract($contract));
         if ($costCenter) {
             $employee->costcenters = new Tinebase_Record_RecordSet('HumanResources_Model_CostCenter');
             $cc = new HumanResources_Model_CostCenter(array('cost_center_id' => $costCenter->getId(), 'start_date' => $employee->employment_begin));
             $employee->costcenters->addRecord($cc);
         }
         unset($employee->countryname);
     }
 }