/**
  * resolve address records before setting headers, so we know how much addresses exist
  *
  * @param Sales_Model_CustomerFilter $filter
  * @param Sales_Controller_Customer $controller
  */
 protected function _resolveAddresses($filter, $controller)
 {
     $customers = $controller->search($filter);
     $customerIds = $customers->id;
     $contactIds = array_unique(array_merge($customers->cpextern_id, $customers->cpintern_id));
     unset($customers);
     $be = new Sales_Backend_Address();
     $this->_specialFieldDefinitions = array(array('header' => 'Postal Address', 'identifier' => 'postal_address', 'type' => 'postal'));
     foreach (array('billing', 'delivery') as $type) {
         $maxAddresses = $be->getMaxAddressesByType($customerIds, $type);
         $header = $type == 'billing' ? 'Billing Address' : 'Delivery Address';
         if ($maxAddresses > 0) {
             $i = 0;
             while ($i < $maxAddresses) {
                 $this->_specialFieldDefinitions[] = array('header' => $header, 'identifier' => $type . '_address' . ($i > 0 ? $i + 1 : ''), 'type' => $type, 'index' => $i + 1);
                 $i++;
             }
         }
     }
     $filter = new Sales_Model_AddressFilter(array());
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'customer_id', 'operator' => 'in', 'value' => $customerIds)));
     $this->_addresses = $be->search($filter);
     $this->_contacts = Addressbook_Controller_Contact::getInstance()->getMultiple($contactIds);
 }
 /**
  * resolves all virtual fields for the customer
  *
  * @param array $customer
  * @return array with property => value
  */
 public function resolveVirtualFields($customer)
 {
     $addressController = Sales_Controller_Address::getInstance();
     $filter = new Sales_Model_AddressFilter(array(array('field' => 'type', 'operator' => 'equals', 'value' => 'postal')));
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'customer_id', 'operator' => 'equals', 'value' => $customer['id'])));
     $postalAddressRecord = $addressController->search($filter)->getFirstRecord();
     if ($postalAddressRecord) {
         $customer['postal_id'] = $postalAddressRecord->toArray();
         foreach ($postalAddressRecord as $field => $value) {
             $customer['adr_' . $field] = $value;
         }
     }
     return $customer;
 }
 /**
  * resolve address records before setting headers, so we know how much addresses exist
  *
  * @param Sales_Model_SupplierFilter $filter
  * @param Sales_Controller_Supplier $controller
  */
 protected function _resolveAddresses($filter, $controller)
 {
     $suppliers = $controller->search($filter);
     $supplierIds = $suppliers->id;
     $contactIds = array_unique(array_merge($suppliers->cpextern_id, $suppliers->cpintern_id));
     unset($suppliers);
     $be = new Sales_Backend_Address();
     $this->_specialFieldDefinitions = array(array('header' => 'Postal Address', 'identifier' => 'postal_address', 'type' => 'postal'));
     $filter = new Sales_Model_AddressFilter(array());
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'customer_id', 'operator' => 'in', 'value' => $supplierIds)));
     $this->_addresses = $be->search($filter);
     $this->_contacts = Addressbook_Controller_Contact::getInstance()->getMultiple($contactIds);
 }
 /**
  * creates/updates a record
  *
  * @param  array $recordData
  * @param  boolean $duplicateCheck
  *
  * @return array created/updated record
  */
 public function saveSupplier($recordData, $duplicateCheck = TRUE)
 {
     $postalAddress = array();
     foreach ($recordData as $field => $value) {
         if (strpos($field, 'adr_') !== FALSE && !empty($value)) {
             $postalAddress[substr($field, 4)] = $value;
             unset($recordData[$field]);
         }
     }
     if (!isset($postalAddress['seq']) && isset($recordData['postal_id']) && isset($recordData['postal_id']['seq'])) {
         $postalAddress['seq'] = $recordData['postal_id']['seq'];
     }
     foreach (array('cpextern_id', 'cpintern_id') as $prop) {
         if (isset($recordData[$prop]) && is_array($recordData[$prop])) {
             $recordData[$prop] = $recordData[$prop]['id'];
         }
     }
     $ret = $this->_save($recordData, Sales_Controller_Supplier::getInstance(), 'Sales_Model_Supplier', 'id', array($duplicateCheck));
     $postalAddress['customer_id'] = $ret['id'];
     $addressController = Sales_Controller_Address::getInstance();
     $filter = new Sales_Model_AddressFilter(array(array('field' => 'type', 'operator' => 'equals', 'value' => 'postal')));
     $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'customer_id', 'operator' => 'equals', 'value' => $ret['id'])));
     $postalAddressRecord = $addressController->search($filter)->getFirstRecord();
     // delete if fields are empty
     if (empty($postalAddress) && $postalAddressRecord) {
         $addressController->delete(array($postalAddressRecord->getId()));
         $postalAddressRecord = NULL;
     } else {
         // create if none has been found
         if (!$postalAddressRecord) {
             $postalAddressRecord = $addressController->create(new Sales_Model_Address($postalAddress));
         } else {
             // update if it has changed
             $postalAddress['id'] = $postalAddressRecord->getId();
             $postalAddressRecordToUpdate = new Sales_Model_Address($postalAddress);
             $diff = $postalAddressRecord->diff($postalAddressRecordToUpdate);
             if (!empty($diff)) {
                 $postalAddressRecord = $addressController->update($postalAddressRecordToUpdate);
             }
         }
     }
     return $this->getSupplier($ret['id']);
 }
 /**
  * add body rows
  * 
  * @alternate, kind of POC or VIP, overwrites the default one
  *
  * @param Tinebase_Record_RecordSet $records
  */
 public function processIteration($_records)
 {
     $json = new Tinebase_Convert_Json();
     $addressIds = array_unique($_records->address_id);
     $addresses = NULL;
     $resolved = $json->fromTine20RecordSet($_records);
     foreach ($resolved as $record) {
         $row = $this->_activeTable->appendRow();
         $customer = '';
         $contract = '';
         $debitor = '';
         foreach ($record['relations'] as $relation) {
             if ($relation['related_model'] == 'Sales_Model_Customer') {
                 $customer = $relation['related_record']['number'] . ' - ' . $relation['related_record']['name'];
             } elseif ($relation['related_model'] == 'Sales_Model_Contract') {
                 $contract = $relation['related_record']['number'] . ' - ' . $relation['related_record']['title'];
             }
         }
         $i18n = $this->_translate->getAdapter();
         foreach ($this->_config->columns->column as $field) {
             $identifier = $field->identifier;
             // TODO: use ModelConfig here to get the POC
             // get type and value for cell
             $cellType = $this->_getCellType($field->type);
             switch ($identifier) {
                 case 'costcenter_id':
                     $value = $record[$identifier]['number'] . ' - ' . $record[$identifier]['remark'];
                     break;
                 case 'customer':
                     $value = $customer;
                     break;
                 case 'contract':
                     $value = $contract;
                     break;
                 case 'fixed_address':
                     $value = str_replace("\n", ', ', $record[$identifier]);
                     break;
                 case 'date':
                     $value = substr($record[$identifier], 0, 10);
                     break;
                 case 'cleared':
                     $value = $i18n->_($record[$identifier] == 'CLEARED' ? 'cleared' : 'to clear');
                     break;
                 case 'type':
                     $value = $i18n->_($record[$identifier] == 'INVOICE' ? 'invoice' : 'Reversal Invoice');
                     break;
                 case 'debitor':
                     if (!$addresses) {
                         $filter = new Sales_Model_AddressFilter(array());
                         $filter->addFilter(new Tinebase_Model_Filter_Text(array('field' => 'id', 'operator' => 'in', 'value' => $addressIds)));
                         $addresses = Sales_Controller_Address::getInstance()->search($filter);
                     }
                     $address = $addresses->filter('id', $record['address_id']['id'])->getFirstRecord();
                     if ($address) {
                         $value = $address->custom1;
                     } else {
                         $value = '';
                     }
                     break;
                 default:
                     $value = $record[$identifier];
             }
             // create cell with type and value and add style
             $cell = $row->appendCell($value, $cellType);
             if ($field->customStyle) {
                 $cell->setStyle((string) $field->customStyle);
             }
         }
     }
 }