Merge branch '2014.11-develop' into 2015.07
authorPhilipp Schüle <p.schuele@metaways.de>
Thu, 3 Sep 2015 08:07:57 +0000 (10:07 +0200)
committerPhilipp Schüle <p.schuele@metaways.de>
Thu, 3 Sep 2015 08:07:57 +0000 (10:07 +0200)
Conflicts:
tests/tine20/TestCase.php
tine20/Calendar/Setup/Update/Release8.php
tine20/Calendar/Setup/setup.xml
tine20/Sales/Setup/Update/Release8.php
tine20/Sales/Setup/setup.xml
tine20/Sales/translations/de.po
tine20/Tinebase/Container.php

Change-Id: I4d38bcc23add836bd52d37f468a60a2d5f174521

13 files changed:
1  2 
tests/tine20/TestCase.php
tine20/Calendar/Convert/Event/VCalendar/Abstract.php
tine20/Calendar/Setup/Update/Release8.php
tine20/Calendar/Setup/Update/Release9.php
tine20/Calendar/Setup/setup.xml
tine20/Sales/Setup/Update/Release8.php
tine20/Sales/Setup/Update/Release9.php
tine20/Sales/Setup/setup.xml
tine20/Sales/js/InvoiceEditDialog.js
tine20/Sales/js/PurchaseInvoiceEditDialog.js
tine20/Sales/translations/de.po
tine20/Tinebase/Container.php
tine20/Tinebase/Core.php

@@@ -121,8 -121,18 +121,16 @@@ abstract class TestCase extends PHPUnit
          if ($this->_invalidateRolesCache) {
              Tinebase_Acl_Roles::getInstance()->resetClassCache();
          }
 -        Tinebase_Cache_PerRequest::getInstance()->resetCache();
 -
 -
 +        Tinebase_Cache_PerRequest::getInstance()->reset();
      }
+     /**
+      * tear down after test class
+      */
+     public static function tearDownAfterClass()
+     {
+         Tinebase_Core::getDbProfiling();
+     }
      
      /**
       * test needs transaction
@@@ -19,25 -19,25 +19,25 @@@ class Calendar_Setup_Update_Release8 ex
          // find all events with ack or snooze times set
          $eventIds = $this->_db->query(
              "SELECT DISTINCT " . $this->_db->quoteIdentifier('cal_event_id') .
--                " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_attendee") .
--                " WHERE " . $this->_db->quoteIdentifier("alarm_ack_time") . " IS NOT NULL OR ". $this->_db->quoteIdentifier("alarm_snooze_time") . " IS NOT NULL"
--            )->fetchAll(Zend_Db::FETCH_ASSOC);
--        
++            " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_attendee") .
++            " WHERE " . $this->_db->quoteIdentifier("alarm_ack_time") . " IS NOT NULL OR " . $this->_db->quoteIdentifier("alarm_snooze_time") . " IS NOT NULL"
++        )->fetchAll(Zend_Db::FETCH_ASSOC);
++
          $attendeeBE = new Calendar_Backend_Sql_Attendee();
          $alarmBE = Tinebase_Alarm::getInstance();
--        
++
          foreach ($eventIds as $eventId) {
              $eventId = $eventId['cal_event_id'];
--            
++
              $attendeeFilter = new Tinebase_Model_Filter_FilterGroup();
              $attendeeFilter->addFilter(new Tinebase_Model_Filter_Text('cal_event_id', 'equals', $eventId));
              $attendees = $attendeeBE->search($attendeeFilter);
--            
++
              $alarms = $alarmBE->search(new Tinebase_Model_AlarmFilter(array(
--                array('field' => 'model',     'operator' => 'equals', 'value' =>'Calendar_Model_Event'),
++                array('field' => 'model', 'operator' => 'equals', 'value' => 'Calendar_Model_Event'),
                  array('field' => 'record_id', 'operator' => 'equals', 'value' => $eventId)
              )));
--            
++
              foreach ($alarms as $alarm) {
                  foreach ($attendees as $attendee) {
                      if ($attendee->alarm_ack_time instanceof Tinebase_DateTime) {
                      if ($attendee->alarm_snooze_time instanceof Tinebase_DateTime) {
                          $alarm->setOption("snoozed-{$attendee->user_id}", $attendee->alarm_snooze_time->format(Tinebase_Record_Abstract::ISO8601LONG));
                      }
--                    
++
                  }
                  $alarmBE->update($alarm);
              }
          }
--        
++
          // delte ack & snooze from attendee
          $this->_backend->dropCol('cal_attendee', 'alarm_ack_time');
          $this->_backend->dropCol('cal_attendee', 'alarm_snooze_time');
--        
++
          $this->setTableVersion('cal_attendee', 5);
          $this->setApplicationVersion('Calendar', '8.1');
      }
--    
++
      /**
       * update to 8.2
--     * 
++     *
       */
      public function update_1()
      {
          $eventBE = new Tinebase_Backend_Sql(array(
--                'modelName'    => 'Calendar_Model_Event',
--                'tableName'    => 'cal_events',
--                'modlogActive' => false
++            'modelName' => 'Calendar_Model_Event',
++            'tableName' => 'cal_events',
++            'modlogActive' => false
          ));
          // find all events without organizer
          $eventIds = $this->_db->query(
--                "SELECT " . $this->_db->quoteIdentifier('id') .
--                " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
--                " WHERE " . $this->_db->quoteIdentifier("organizer") . " IS NULL OR " .
--                            $this->_db->quoteIdentifier("organizer") . " = ''"
++            "SELECT " . $this->_db->quoteIdentifier('id') .
++            " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
++            " WHERE " . $this->_db->quoteIdentifier("organizer") . " IS NULL OR " .
++            $this->_db->quoteIdentifier("organizer") . " = ''"
          )->fetchAll(Zend_Db::FETCH_ASSOC);
--        
++
          foreach ($eventIds as $eventId) {
              $event = $eventBE->get($eventId['id']);
--            $event->organizer = (string) Tinebase_User::getInstance()->getFullUserById($event->created_by)->contact_id;
--            
--            $where  = array(
++            $event->organizer = (string)Tinebase_User::getInstance()->getFullUserById($event->created_by)->contact_id;
++
++            $where = array(
                  $this->_db->quoteInto($this->_db->quoteIdentifier('id') . ' = ?', $eventId),
              );
--            
++
              try {
                  $this->_db->update(SQL_TABLE_PREFIX . "cal_events", $event->toArray(), $where);
              } catch (Tinebase_Exception_Record_Validation $terv) {
                  Tinebase_Exception::log($terv);
              }
          }
--        
++
          // find all events CONFIDENTIAL class
          $eventIds = $this->_db->query(
--                "SELECT " . $this->_db->quoteIdentifier('id') .
--                " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
--                " WHERE " . $this->_db->quoteIdentifier("class") . " = 'CONFIDENTIAL'"
++            "SELECT " . $this->_db->quoteIdentifier('id') .
++            " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
++            " WHERE " . $this->_db->quoteIdentifier("class") . " = 'CONFIDENTIAL'"
          )->fetchAll(Zend_Db::FETCH_ASSOC);
--        
++
          foreach ($eventIds as $eventId) {
              $event = $eventBE->get($eventId['id']);
              $class = Calendar_Model_Event::CLASS_PRIVATE;
--            $event->class = (string) $class;
--            
--            $where  = array(
++            $event->class = (string)$class;
++
++            $where = array(
                  $this->_db->quoteInto($this->_db->quoteIdentifier('id') . ' = ?', $eventId),
              );
--            
++
              try {
                  $this->_db->update(SQL_TABLE_PREFIX . "cal_events", $event->toArray(), $where);
              } catch (Tinebase_Exception_Record_Validation $terv) {
                  Tinebase_Exception::log($terv);
              }
          }
--         $this->setApplicationVersion('Calendar', '8.2');
++        $this->setApplicationVersion('Calendar', '8.2');
      }
--    
++
      /**
       * update to 8.3
       * - normalize all rrules
      {
          // find all events with rrule
          $eventIds = $this->_db->query(
--                "SELECT " . $this->_db->quoteIdentifier('id') .
--                " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
--                " WHERE " . $this->_db->quoteIdentifier("rrule") . " IS NOT NULL"
++            "SELECT " . $this->_db->quoteIdentifier('id') .
++            " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
++            " WHERE " . $this->_db->quoteIdentifier("rrule") . " IS NOT NULL"
          )->fetchAll(Zend_Db::FETCH_ASSOC);
--        
++
          // NOTE: we need a generic sql BE to circumvent calendar specific acl issues
          $eventBE = new Tinebase_Backend_Sql(array(
--                'modelName'    => 'Calendar_Model_Event',
--                'tableName'    => 'cal_events',
--                'modlogActive' => false
++            'modelName' => 'Calendar_Model_Event',
++            'tableName' => 'cal_events',
++            'modlogActive' => false
          ));
--        
++
          foreach ($eventIds as $eventId) {
              $event = $eventBE->get($eventId['id']);
--            $oldRruleString = (string) $event->rrule;
++            $oldRruleString = (string)$event->rrule;
              $rrule = Calendar_Model_Rrule::getRruleFromString($oldRruleString);
              $rrule->normalize($event);
--            
--            if ($oldRruleString != (string) $rrule) {
--                $event->rrule = (string) $rrule;
++
++            if ($oldRruleString != (string)$rrule) {
++                $event->rrule = (string)$rrule;
                  try {
                      $eventBE->update($event);
                  } catch (Tinebase_Exception_Record_Validation $terv) {
                  }
              }
          }
--        
++
          $this->setApplicationVersion('Calendar', '8.3');
      }
--    
++
      /**
       * update to 8.4
--     * 
++     *
       * - adds etag column
       */
      public function update_3()
      {
--        if (! $this->_backend->columnExists('etag', 'cal_events')) {
++        if (!$this->_backend->columnExists('etag', 'cal_events')) {
              $declaration = new Setup_Backend_Schema_Field_Xml('
                  <field>
                      <name>etag</name>
                  </index>');
              $this->_backend->addIndex('cal_events', $declaration);
          }
--        
++
          $this->setTableVersion('cal_events', 7);
          $this->setApplicationVersion('Calendar', '8.4');
      }
--    
++
      /**
       * - update import / export
       */
          $this->setTableVersion('cal_events', 7);
          $this->setApplicationVersion('Calendar', '8.5');
      }
--    
++
      /**
       * adds external_seq col
--     * 
++     *
       * @see 0009890: improve external event invitation support
       */
      public function update_5()
      {
--        if (! $this->_backend->columnExists('external_seq', 'cal_events')) {
++        if (!$this->_backend->columnExists('external_seq', 'cal_events')) {
              $seqCol = '<field>
                  <name>external_seq</name>
                  <type>integer</type>
                  <notnull>true</notnull>
                  <default>0</default>
              </field>';
--            
++
              $declaration = new Setup_Backend_Schema_Field_Xml($seqCol);
              $this->_backend->addCol('cal_events', $declaration);
          }
--        
++
          $this->setTableVersion('cal_events', '8');
          $this->setApplicationVersion('Calendar', '8.6');
      }
--    
++
      /**
       * add rrule index
--     * 
++     *
       * @see 0010214: improve calendar performance / yearly base events
       *
       * TODO re-enable this when it is fixed for postgresql
  //        } catch (Zend_Db_Statement_Exception $e) {
  //            Tinebase_Exception::log($e);
  //        }
--        
++
          $this->setTableVersion('cal_events', '9');
          $this->setApplicationVersion('Calendar', '8.7');
      }
          // find all events with rrule
          $events = $this->_db->query(
              "SELECT " . $this->_db->quoteIdentifier('id') .
--                 ', ' . $this->_db->quoteIdentifier('uid') .
--                 ', ' . $this->_db->quoteIdentifier('container_id') .
--                 ', ' . $this->_db->quoteIdentifier('created_by') .
++            ', ' . $this->_db->quoteIdentifier('uid') .
++            ', ' . $this->_db->quoteIdentifier('container_id') .
++            ', ' . $this->_db->quoteIdentifier('created_by') .
              " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
              " WHERE " . $this->_db->quoteIdentifier("rrule") . " IS NOT NULL" .
--              " AND " . $this->_db->quoteIdentifier("is_deleted") . " = " . $this->_db->quote(0, Zend_Db::INT_TYPE)
++            " AND " . $this->_db->quoteIdentifier("is_deleted") . " = " . $this->_db->quote(0, Zend_Db::INT_TYPE)
          )->fetchAll(Zend_Db::FETCH_ASSOC);
  
          // update all exdates in same container
--        foreach($events as $event) {
++        foreach ($events as $event) {
              $this->_db->query(
                  "UPDATE " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
--                  " SET " . $this->_db->quoteIdentifier('base_event_id') . ' = ' . $this->_db->quote($event['id']) .
++                " SET " . $this->_db->quoteIdentifier('base_event_id') . ' = ' . $this->_db->quote($event['id']) .
                  " WHERE " . $this->_db->quoteIdentifier('uid') . ' = ' . $this->_db->quote($event['uid']) .
--                  " AND " . $this->_db->quoteIdentifier("container_id") . ' = ' . $this->_db->quote($event['container_id']) .
--                  " AND " . $this->_db->quoteIdentifier("recurid") . " IS NOT NULL" .
--                  " AND " . $this->_db->quoteIdentifier("is_deleted") . " = " . $this->_db->quote(0, Zend_Db::INT_TYPE)
++                " AND " . $this->_db->quoteIdentifier("container_id") . ' = ' . $this->_db->quote($event['container_id']) .
++                " AND " . $this->_db->quoteIdentifier("recurid") . " IS NOT NULL" .
++                " AND " . $this->_db->quoteIdentifier("is_deleted") . " = " . $this->_db->quote(0, Zend_Db::INT_TYPE)
              );
          }
  
          // find all container move exdates
          $danglingExdates = $this->_db->query(
              "SELECT " . $this->_db->quoteIdentifier('uid') .
--                ', ' . $this->_db->quoteIdentifier('id') .
--                ', ' . $this->_db->quoteIdentifier('created_by') .
++            ', ' . $this->_db->quoteIdentifier('id') .
++            ', ' . $this->_db->quoteIdentifier('created_by') .
              " FROM " . $this->_db->quoteIdentifier(SQL_TABLE_PREFIX . "cal_events") .
              " WHERE " . $this->_db->quoteIdentifier("recurid") . " IS NOT NULL" .
--              " AND " . $this->_db->quoteIdentifier("base_event_id") . " IS NULL" .
--              " AND " . $this->_db->quoteIdentifier("is_deleted") . " = " . $this->_db->quote(0, Zend_Db::INT_TYPE)
++            " AND " . $this->_db->quoteIdentifier("base_event_id") . " IS NULL" .
++            " AND " . $this->_db->quoteIdentifier("is_deleted") . " = " . $this->_db->quote(0, Zend_Db::INT_TYPE)
          )->fetchAll(Zend_Db::FETCH_ASSOC);
  
          // try to match by creator
                  return false;
              });
  
--            switch(count($matches)) {
++            switch (count($matches)) {
                  case 0:
                      // no match :-(
                      if (count($possibleBaseEvents) == 0) {
       */
      public function update_9()
      {
+         $fieldsToChange = array('location', 'summary');
+         foreach ($fieldsToChange as $name) {
+             $seqCol = '<field>
+                 <name>' . $name . '</name>
+                 <type>text</type>
+                 <length>1024</length>
+             </field>';
+             $declaration = new Setup_Backend_Schema_Field_Xml($seqCol);
+             $this->_backend->alterCol('cal_events', $declaration);
+         }
+         $this->setTableVersion('cal_events', 11);
+         $this->setApplicationVersion('Calendar', '8.10');
+     }
++
++    /**
++     * update to 9.0
++     */
++    public function update_10()
++    {
 +        $this->setApplicationVersion('Calendar', '9.0');
 +    }
  }
index f2c7f29,0000000..e51e71a
mode 100644,000000..100644
--- /dev/null
@@@ -1,25 -1,0 +1,39 @@@
 +<?php
 +/**
 + * Tine 2.0
 + *
 + * @package     Calendar
 + * @subpackage  Setup
 + * @license     http://www.gnu.org/licenses/agpl.html AGPL3
 + * @copyright   Copyright (c) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
 + * @author      Philipp Schüle <p.schuele@metaways.de>
 + */
 +class Calendar_Setup_Update_Release9 extends Setup_Update_Abstract
 +{
 +    /**
 +     * update to 9.1
 +     * - identify base event via new base_event_id field instead of UID
 +     */
 +    public function update_0()
 +    {
 +        if ($this->getTableVersion('cal_events') < 10) {
 +            $release8 = new Calendar_Setup_Update_Release8($this->_backend);
 +            $release8->update_8();
 +        }
 +        $this->setApplicationVersion('Calendar', '9.1');
 +    }
++
++    /**
++     * update to 9.2
++     *
++     * @see 0011266: increase size of event fields summary and location
++     */
++    public function update_1()
++    {
++        if ($this->getTableVersion('cal_events') < 11) {
++            $release8 = new Calendar_Setup_Update_Release8($this->_backend);
++            $release8->update_9();
++        }
++        $this->setApplicationVersion('Calendar', '9.2');
++    }
 +}
@@@ -2,7 -2,7 +2,7 @@@
  <application>
      <name>Calendar</name>
      <!-- gettext('Calendar') -->   
-     <version>9.1</version>
 -    <version>8.10</version>
++    <version>9.2</version>
      <order>15</order>
      <status>enabled</status>
      <tables>
@@@ -2070,14 -2070,57 +2070,67 @@@ class Sales_Setup_Update_Release8 exten
          $this->setTableVersion('sales_purchase_invoices', 2);
          $this->setApplicationVersion('Sales', '8.30');
      }
-     
+     /**
 -     * Add price_gross2 and price_total to pruchase invoice
++     * Add price_gross2 and price_total to purchase invoice
+      */
+     public function update_30()
+     {
+         $field = '<field>
+                     <name>price_gross2</name>
+                     <type>float</type>
+                     <unsigned>false</unsigned>
+                     <notnull>false</notnull>
+                 </field>';
+         $declaration = new Setup_Backend_Schema_Field_Xml($field);
+         $this->_backend->addCol('sales_purchase_invoices', $declaration, 16);
+         $field = '<field>
+                     <name>price_total</name>
+                     <type>float</type>
+                     <unsigned>false</unsigned>
+                     <notnull>false</notnull>
+                 </field>';
+         $declaration = new Setup_Backend_Schema_Field_Xml($field);
+         $this->_backend->addCol('sales_purchase_invoices', $declaration, 19);
+         // update existing purchase invoices, set total price to price_gross
+         $db = $this->_backend->getDb();
+         $sql = 'UPDATE ' . $db->quoteIdentifier(SQL_TABLE_PREFIX . 'sales_purchase_invoices') . ' SET ' . $db->quoteIdentifier('price_total') . ' = ( ' . $db->quoteIdentifier('price_gross') . ' * (1 - discount/100))';
+         $db->query($sql);
+         $field = '<field>
+                     <name>price_tax</name>
+                     <type>float</type>
+                     <unsigned>false</unsigned>
+                     <notnull>false</notnull>
+                 </field>';
+         $declaration = new Setup_Backend_Schema_Field_Xml($field);
+         $this->_backend->addCol('sales_sales_invoices', $declaration, 8);
+         // TODO fix this for pgsql/oracle. currently we only update the invoices for mysql db adapters
+         if ($db instanceof Zend_Db_Adapter_Pdo_Mysql) {
+             $sql = 'UPDATE ' . $db->quoteIdentifier(SQL_TABLE_PREFIX . 'sales_sales_invoices') . ' SET ' . $db->quoteIdentifier('price_tax') . ' = TRUNCATE( ' . $db->quoteIdentifier('price_net') . ' * ' . $db->quoteIdentifier('sales_tax') . ' / 100 + 0.005, 2) WHERE ' . $db->quoteIdentifier('price_net') . ' > 0';
+             $db->query($sql);
+             $sql = 'UPDATE ' . $db->quoteIdentifier(SQL_TABLE_PREFIX . 'sales_sales_invoices') . ' SET ' . $db->quoteIdentifier('price_tax') . ' = TRUNCATE( ' . $db->quoteIdentifier('price_net') . ' * ' . $db->quoteIdentifier('sales_tax') . ' / 100 - 0.005, 2) WHERE ' . $db->quoteIdentifier('price_net') . ' < 0';
+             $db->query($sql);
+         }
+         $this->setTableVersion('sales_purchase_invoices', 3);
+         $this->setApplicationVersion('Sales', '8.31');
+     }
++
 +    /**
 +     * update to 9.0
 +     *
 +     * @return void
 +     */
-     public function update_30()
++    public function update_31()
 +    {
 +        $this->setApplicationVersion('Sales', '9.0');
 +    }
  }
index 0000000,0000000..bb11338
new file mode 100644 (file)
--- /dev/null
--- /dev/null
@@@ -1,0 -1,0 +1,25 @@@
++<?php
++/**
++ * Tine 2.0
++ *
++ * @package     Sales
++ * @subpackage  Setup
++ * @license     http://www.gnu.org/licenses/agpl.html AGPL3
++ * @copyright   Copyright (c) 2015 Metaways Infosystems GmbH (http://www.metaways.de)
++ * @author      Philipp Schüle <p.schuele@metaways.de>
++ */
++class Sales_Setup_Update_Release9 extends Setup_Update_Abstract
++{
++    /**
++     * update to 9.1
++     * - Add price_gross2 and price_total to purchase invoice
++     */
++    public function update_0()
++    {
++        if ($this->getTableVersion('sales_purchase_invoices') < 3) {
++            $release8 = new Sales_Setup_Update_Release8($this->_backend);
++            $release8->update_30();
++        }
++        $this->setApplicationVersion('Sales', '9.1');
++    }
++}
@@@ -1,7 -1,7 +1,7 @@@
  <?xml version="1.0" encoding="utf-8"?>
  <application>
      <name>Sales</name>
-     <version>9.0</version>
 -    <version>8.31</version>
++    <version>9.1</version>
      <order>50</order>
      <status>enabled</status>
      <tables>
Simple merge
@@@ -735,15 -909,18 +735,15 @@@ msgstr "Keine Kostenstelle zugeordnet
  msgid ""
  "The selected contract doesn't have a cost center assigned, yet. Add a cost "
  "center to the contract with the contract edit dialog."
 -msgstr ""
 -"Dem ausgewählten Vertrag ist bisher keine Kostenstelle zugeordnet worden. "
 -"Bitte verknüpfen Sie den Vertrag mit einer Kostenstelle."
 +msgstr "Dem ausgewählten Vertrag ist bisher keine Kostenstelle zugeordnet worden. Bitte verknüpfen Sie den Vertrag mit einer Kostenstelle."
  
 -#: js/InvoiceEditDialog.js:346 js/PurchaseInvoiceEditDialog.js:300
 +#: js/InvoiceEditDialog.js:347 js/PurchaseInvoiceEditDialog.js:300
  msgid "Sales Tax (percent)"
- msgstr "Mehrwertsteuer in Prozent"
+ msgstr "MwSt. in Prozent"
  
 -#: js/InvoiceEditDialog.js:380 js/InvoiceEditDialog.js:386
 +#: js/InvoiceEditDialog.js:381 js/InvoiceEditDialog.js:387
  #: js/PurchaseInvoiceEditDialog.js:356 js/PurchaseInvoiceEditDialog.js:380
  #: js/PurchaseInvoiceEditDialog.js:394 js/PurchaseInvoiceEditDialog.js:421
 -#: js/PurchaseInvoiceEditDialog.js:428
  msgid "automatically set..."
  msgstr "automatisch ausgefüllt..."
  
@@@ -1164,166 -1363,54 +1164,172 @@@ msgstr "Rechnung abgerechnet
  msgid "Possible Invoice Cleared States."
  msgstr "Mögliche Werte für Abgerechnetstatus"
  
 -#: Config.php:212
 +#: Config.php:302
  msgid "Enabled Features"
 -msgstr ""
 +msgstr "Feature aktivieren"
  
 -#: Config.php:214
 +#: Config.php:304
  msgid "Enabled Features in Sales Application."
 -msgstr ""
 +msgstr "Feature in der Sales Applikation aktivieren."
  
 -#: Config.php:221
 +#: Config.php:311
  msgid "Invoices Module"
 -msgstr "Rechnungen Modul"
 +msgstr "Rechnungsmodul"
  
 -#: Config.php:225
 +#: Config.php:315
  msgid "Offers Module"
 -msgstr "Angebote Modul"
 +msgstr "Angebotsmodul"
  
 -#: Config.php:229
 +#: Config.php:319
  msgid "Order Confirmations Module"
 -msgstr "Auftragsbestätigungen Modul"
 +msgstr "Auftragsbestätigung Modul"
  
 -#: Config.php:233
 +#: Config.php:323
  msgid "Suppliers Module"
 -msgstr "Lieferanten Modul"
 +msgstr "Lieferantenmodul"
  
 -#: Config.php:237
 +#: Config.php:327
  msgid "Purchase Invoice Module"
 -msgstr "Eingangsrechnungen Modul"
 +msgstr "Eingangsrechnungsmodul"
  
 -#: Controller.php:83 Controller.php:105
 -msgid "You do not have admin rights on Sales"
 -msgstr "Sie haben kein Adminrecht in der Sales-Applikation"
 +#: Setup/Initialize.php:34 Setup/Update/Release5.php:63
 +msgid "My Products"
 +msgstr "Meine Produkte"
 +
 +#: Setup/Initialize.php:35
 +msgid "Products created by me"
 +msgstr "Produktdatensätze, die ich angelegt habe"
 +
 +#: Setup/Initialize.php:51 Setup/Update/Release5.php:84
 +msgid "My Contracts"
 +msgstr "Meine Verträge"
 +
 +#: Setup/Initialize.php:52 Setup/Update/Release5.php:85
 +msgid "Contracts created by myself"
 +msgstr "Von mir erstellte Aufträge"
 +
 +#: Setup/Initialize.php:68 Setup/Update/Release8.php:510
 +msgid "All Customers"
 +msgstr "Alle Kunden"
 +
 +#: Setup/Initialize.php:69 Setup/Update/Release8.php:511
 +msgid "All customer records"
 +msgstr "Datensätze aller Kunden"
 +
 +#: Setup/Initialize.php:80 Setup/Update/Release8.php:1331
 +msgid "All Offers"
 +msgstr "Alle Angebotsdatensätze"
 +
 +#: Setup/Initialize.php:81 Setup/Update/Release8.php:1332
 +msgid "All offer records"
 +msgstr "Alle Angebote"
 +
 +#: Setup/Initialize.php:109 Setup/Update/Release8.php:1950
 +msgid "Default"
 +msgstr "Default"
 +
 +#: Setup/Initialize.php:124
 +msgid "Reversal"
 +msgstr "Storno"
 +
 +#: Setup/Initialize.php:125
 +msgid "Credit"
 +msgstr "Gutschrift"
 +
 +#: Setup/Initialize.php:139
 +msgid "to clear"
 +msgstr "abzurechnen"
 +
 +#: Setup/Initialize.php:140
 +msgid "cleared"
 +msgstr "abgerechnet"
 +
 +#: Setup/Initialize.php:154 Setup/Update/Release8.php:1901
 +msgid "Bank transfer"
 +msgstr "Banküberweisung"
 +
 +#: Setup/Initialize.php:155 Setup/Update/Release8.php:1902
 +msgid "Direct debit"
 +msgstr "Lastschrifteinzug"
 +
 +#: Setup/Update/Release8.php:146
 +msgid "Status"
 +msgstr "Status"
 +
 +#: Setup/Update/Release8.php:158
 +msgid "Cleared In"
 +msgstr "Abgerechnet in"
 +
 +#: Setup/Update/Release8.php:1392
 +msgid "All Suppliers"
 +msgstr "Alle Lieferanten"
 +
 +#: Setup/Update/Release8.php:1393
 +msgid "All supllier records"
 +msgstr "Alle Lieferantendatensätze"
 +
 +#: Setup/Update/Release8.php:1417
 +msgid "All Purchase Imvoices"
 +msgstr "Alle Eingangsrechnungen"
 +
 +#: Setup/Update/Release8.php:1418
 +msgid "All purchase invoices"
 +msgstr "Alle Eingangsrechnungen"
 +
 +#: Setup/Update/Release8.php:1442
 +msgid "All Products"
 +msgstr "Alle Produkte"
 +
 +#: Setup/Update/Release8.php:1443
 +msgid "All product records"
 +msgstr "Alle Produktdatensätze"
 +
 +#: Setup/Update/Release8.php:1453
 +msgid "All Contracts"
 +msgstr "Alle Verträge"
 +
 +#: Setup/Update/Release8.php:1454
 +msgid "All contract records"
 +msgstr "Alle Vertragsdatensätze"
  
 -#~ msgid "Lifespan Start"
 -#~ msgstr "Laufzeitanfang Beginn"
 +#: Setup/Update/Release8.php:1464
 +msgid "All Invoices"
 +msgstr "Alle Rechnungen"
 +
 +#: Setup/Update/Release8.php:1465
 +msgid "All invoice records"
 +msgstr "Alle Rechnungsdatensätze"
 +
 +#: Setup/Update/Release8.php:1475
 +msgid "All Cost Centers"
 +msgstr "Alle Kostenstellen"
 +
 +#: Setup/Update/Release8.php:1476
 +msgid "All costcenter records"
 +msgstr "Alle Kostenstellendatensätze"
 +
 +#: Setup/Update/Release8.php:1486
 +msgid "All Divisions"
 +msgstr "Alle Abteilungen"
 +
 +#: Setup/Update/Release8.php:1487
 +msgid "All division records"
 +msgstr "Alle Abteilungsdatensätze"
  
 -#~ msgid "Lifespan End"
 -#~ msgstr "Laufzeitende Ende"
 +#: Setup/Update/Release8.php:1497
 +msgid "All Order Confirmations"
 +msgstr "Alle Auftragsbestätigungen"
  
 -#~ msgid "Is Active"
 -#~ msgstr "Ist aktiv"
 +#: Setup/Update/Release8.php:1498
 +msgid "All order confirmation records"
 +msgstr "Alle Auftragsbestätigungsdatensätze"
  
 -#~ msgid "Costcenter"
 -#~ msgid_plural "Costcenters"
 -#~ msgstr[0] "Kostenstelle"
 -#~ msgstr[1] "Kostenstellen"
 +#: Setup/Update/Release5.php:64
 +msgid "Products created by myself"
 +msgstr "Von mir erstellte Produkte"
+ msgid "Additional Price Gross"
+ msgstr "Zusätzlicher Brutto Preis"
+ msgid "Total Price"
 -msgstr "Gesamtpreis"
++msgstr "Gesamtpreis"
@@@ -773,9 -798,10 +789,10 @@@ class Tinebase_Container extends Tineba
              $accountId .
              $application->getId() .
              implode('', (array)$grant) .
-             (int)$_ignoreACL
+             (int)$_ignoreACL .
+             (int)$_andGrants
          );
 -        
 +
          try {
              return $this->loadFromClassCache(__FUNCTION__, $classCacheId);
          } catch (Tinebase_Exception_NotFound $tenf) {
Simple merge