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