/** * 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); } }