/**
  * Sanitize post data, specifically handling any date and date time conversions from local format to the
  * database format.
  * @param string $importRulesType
  * @param array $postMappingData
  */
 public static function sanitizePostByTypeForSavingMappingData($importRulesType, $postMappingData)
 {
     assert('is_string($importRulesType)');
     assert('is_array($postMappingData)');
     foreach ($postMappingData as $columnName => $mappingData) {
         if (!isset($mappingData['mappingRulesData'])) {
             $postMappingData[$columnName]['mappingRulesData'] = array();
         }
     }
     foreach ($postMappingData as $columnName => $mappingData) {
         foreach ($mappingData['mappingRulesData'] as $mappingRuleFormClassName => $mappingRuleFormData) {
             $model = MappingRuleFormAndElementTypeUtil::makeForm($importRulesType, $mappingData['attributeIndexOrDerivedType'], $mappingRuleFormClassName);
             foreach ($mappingRuleFormData as $attributeName => $value) {
                 if ($value !== null) {
                     if (!is_array($value)) {
                         if ($model->isAttribute($attributeName) && $model->isAttributeSafe($attributeName)) {
                             $type = ModelAttributeToMixedTypeUtil::getTypeByModelUsingValidator($model, $model::getAttributeName());
                             if ($type == 'Date') {
                                 $postMappingData[$columnName]['mappingRulesData'][$mappingRuleFormClassName][$attributeName] = DateTimeUtil::resolveValueForDateDBFormatted($value);
                             }
                             if ($type == 'DateTime' && !empty($value)) {
                                 $postMappingData[$columnName]['mappingRulesData'][$mappingRuleFormClassName][$attributeName] = DateTimeUtil::convertDateTimeLocaleFormattedDisplayToDbFormattedDateTimeWithSecondsAsZero($value);
                             }
                         }
                     }
                 }
             }
         }
     }
     return $postMappingData;
 }
 public function testMakeCollectionByAttributeImportRules()
 {
     //Contact
     $attributeImportRules = new ContactAttributeImportRules(new ImportModelTestItem(), 'hasOne');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'hasOne', 'importColumn');
     $this->assertEquals(2, count($collection));
     $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']);
     $this->assertEquals('DefaultModelNameIdMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
     $this->assertEquals('ImportMappingRelatedModelValueTypeDropDown', $collection[1]['elementType']);
     $this->assertEquals('RelatedModelValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm']));
     //Contact Derived
     $attributeImportRules = new ContactDerivedAttributeImportRules(new ImportModelTestItem(), 'contactDerived');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'contactDerived', 'importColumn');
     $this->assertEquals(2, count($collection));
     $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']);
     $this->assertEquals('DefaultModelNameIdDerivedAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
     $this->assertEquals('ImportMappingModelIdValueTypeDropDown', $collection[1]['elementType']);
     $this->assertEquals('IdValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm']));
     //Contact State
     ContactsModule::loadStartingData();
     $attributeImportRules = new ContactStateAttributeImportRules(new ImportModelTestItem(), 'state');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'state', 'importColumn');
     $this->assertEquals(1, count($collection));
     $this->assertEquals('ImportMappingRuleContactStatesDropDown', $collection[0]['elementType']);
     $this->assertEquals('DefaultContactStateIdMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
 }
 public function testMakeCollectionByAttributeImportRules()
 {
     //Leads
     ContactsModule::loadStartingData();
     $attributeImportRules = new LeadStateAttributeImportRules(new ImportModelTestItem(), 'state');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'state', 'importColumn');
     $this->assertEquals(1, count($collection));
     $this->assertEquals('ImportMappingRuleContactStatesDropDown', $collection[0]['elementType']);
     $this->assertEquals('DefaultLeadStateIdMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
 }
 public function testMakeCollectionByAttributeImportRules()
 {
     //User
     $attributeImportRules = new UserAttributeImportRules(new ImportModelTestItem(), 'owner');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'owner', 'importColumn');
     $this->assertEquals(2, count($collection));
     $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']);
     $this->assertEquals('DefaultModelNameIdMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
     $this->assertEquals('ImportMappingUserValueTypeDropDown', $collection[1]['elementType']);
     $this->assertEquals('UserValueTypeModelAttributeMappingRuleForm', get_class($collection[1]['mappingRuleForm']));
     //User Password
     $attributeImportRules = new PasswordAttributeImportRules(new User(), 'hash');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'hash', 'importColumn');
     $this->assertEquals(1, count($collection));
     $this->assertEquals('Text', $collection[0]['elementType']);
     $this->assertEquals('PasswordDefaultValueModelAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
 }
 public function testMakeCollectionByAttributeImportRules()
 {
     //Opportunity
     $attributeImportRules = new OpportunityAttributeImportRules(new ImportModelTestItem(), 'hasOne');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'hasOne', 'importColumn');
     $this->assertEquals(2, count($collection));
     $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']);
     $this->assertEquals('DefaultModelNameIdMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
     $this->assertEquals('ImportMappingModelIdValueTypeDropDown', $collection[1]['elementType']);
     $this->assertEquals('IdValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm']));
     //OpportunityDerived
     $attributeImportRules = new OpportunityDerivedAttributeImportRules(new ImportModelTestItem(), 'opportunityDerived');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'opportunityDerived', 'importColumn');
     $this->assertEquals(2, count($collection));
     $this->assertEquals('ImportMappingRuleDefaultModelNameId', $collection[0]['elementType']);
     $this->assertEquals('DefaultModelNameIdDerivedAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
     $this->assertEquals('ImportMappingModelIdValueTypeDropDown', $collection[1]['elementType']);
     $this->assertEquals('IdValueTypeMappingRuleForm', get_class($collection[1]['mappingRuleForm']));
 }
 /**
  * @param string $columnName
  * @param string $attributeIndexOrDerivedType
  * @param string $importRulesType
  * @param string $columnType
  * @param array $mappingRuleFormsAndElementTypes
  * @return string
  */
 public function renderMappingRulesElements($columnName, $attributeIndexOrDerivedType, $importRulesType, $columnType, $mappingRuleFormsAndElementTypes)
 {
     assert('is_string($columnName)');
     assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null');
     assert('is_string($importRulesType)');
     assert('$columnType == "importColumn" || $columnType == "extraColumn"');
     assert('is_array($mappingRuleFormsAndElementTypes) || $mappingRuleFormsAndElementTypes == null');
     $content = null;
     $multipleMappingRulesCssClass = null;
     if ($attributeIndexOrDerivedType != null) {
         if ($mappingRuleFormsAndElementTypes == null) {
             $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRulesType, $attributeIndexOrDerivedType);
             $mappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, $attributeIndexOrDerivedType, $columnType);
         }
         if (count($mappingRuleFormsAndElementTypes) > 0) {
             $title = Zurmo::t('ImportModule', 'Rules');
         } else {
             $title = null;
         }
         $content .= ZurmoHtml::tag('h4', array(), $title);
         foreach ($mappingRuleFormsAndElementTypes as $notUsed => $ruleFormAndElementType) {
             $mappingRuleForm = $ruleFormAndElementType['mappingRuleForm'];
             $elementClassName = $ruleFormAndElementType['elementType'] . 'Element';
             $classToEvaluate = new ReflectionClass($elementClassName);
             if ($classToEvaluate->implementsInterface('DerivedElementInterface')) {
                 $attributeName = 'null';
             } else {
                 $attributeName = $mappingRuleForm::getAttributeName();
             }
             $params = array();
             $params['inputPrefix'] = array($this->mappingFormModelClassName, $columnName, 'mappingRulesData', get_class($mappingRuleForm));
             $element = new $elementClassName($mappingRuleForm, $attributeName, $this->form, $params);
             $element->editableTemplate = '<div>{label}{content}{error}</div>';
             $content .= $element->render();
         }
     }
     $subDivsCssClass = 'has' . count($mappingRuleFormsAndElementTypes);
     $content = ZurmoHtml::tag('div', array('id' => self::getMappingRulesDivIdByColumnName($columnName), 'class' => 'mapping-rules ' . $subDivsCssClass), $content);
     // Not Coding Standard
     return $content;
 }
 /**
  * Step 4. Import mapping
  */
 public function actionStep4($id)
 {
     $import = Import::getById((int) $id);
     $importWizardForm = ImportWizardUtil::makeFormByImport($import);
     $importWizardForm->setScenario('saveMappingData');
     $importRulesClassName = ImportRulesUtil::getImportRulesClassNameByType($importWizardForm->importRulesType);
     if (isset($_POST[get_class($importWizardForm)])) {
         $reIndexedPostData = ImportMappingUtil::reIndexExtraColumnNamesByPostData($_POST[get_class($importWizardForm)]);
         $sanitizedPostData = ImportWizardFormPostUtil::sanitizePostByTypeForSavingMappingData($importWizardForm->importRulesType, $reIndexedPostData);
         ImportWizardUtil::setFormByPostForStep4($importWizardForm, $sanitizedPostData);
         $mappingDataMappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeFormsAndElementTypesByMappingDataAndImportRulesType($importWizardForm->mappingData, $importWizardForm->importRulesType);
         $validated = MappingRuleFormAndElementTypeUtil::validateMappingRuleForms($mappingDataMappingRuleFormsAndElementTypes);
         if ($validated) {
             //Still validate even if MappingRuleForms fails, so all errors are captured and returned.
             $this->attemptToValidateImportWizardFormAndSave($importWizardForm, $import, 'step5');
         } else {
             $importWizardForm->validate();
             $importWizardForm->addError('mappingData', Zurmo::t('ImportModule', 'There are errors with some of your mapping rules. Please fix.'));
         }
     } else {
         $mappingDataMappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeFormsAndElementTypesByMappingDataAndImportRulesType($importWizardForm->mappingData, $importWizardForm->importRulesType);
     }
     $dataProvider = $this->makeDataProviderForSampleRow($import, (bool) $importWizardForm->firstRowIsHeaderRow);
     if ($importWizardForm->firstRowIsHeaderRow) {
         $headerRow = ZurmoRedBean::$writer->getFirstRowByTableName($import->getTempTableName());
         assert('$headerRow != null');
     } else {
         $headerRow = null;
     }
     $sampleData = $dataProvider->getData();
     assert('count($sampleData) == 1');
     $sample = current($sampleData);
     $pagerUrl = Yii::app()->createUrl('import/default/sampleRow', array('id' => $import->id));
     $pagerContent = ImportDataProviderPagerUtil::renderPagerAndHeaderTextContent($dataProvider, $pagerUrl);
     $mappingDataMetadata = ImportWizardMappingViewUtil::resolveMappingDataForView($importWizardForm->mappingData, $sample, $headerRow);
     $mappableAttributeIndicesAndDerivedTypes = $importRulesClassName::getMappableAttributeIndicesAndDerivedTypes();
     $title = Zurmo::t('ImportModule', 'Import Wizard - Map Fields');
     $importRulesClassName = ImportRulesUtil::getImportRulesClassNameByType($importWizardForm->importRulesType);
     $stepToUse = ImportStepsAndProgressBarForWizardView::resolveAfterUploadStepByImportClassName(3, $importRulesClassName);
     $progressBarAndStepsView = new ImportStepsAndProgressBarForWizardView($importRulesClassName, $stepToUse);
     $importView = new ImportWizardMappingView($this->getId(), $this->getModule()->getId(), $importWizardForm, $pagerContent, $mappingDataMetadata, $mappingDataMappingRuleFormsAndElementTypes, $mappableAttributeIndicesAndDerivedTypes, $importRulesClassName::getRequiredAttributesLabelsData(), $title);
     echo $this->getImportPageView($progressBarAndStepsView, $importView)->render();
 }
 public function testResolveAttributeIndexAndTheFormsAreUsingTheCorrectModelClassNameAndAttributeName()
 {
     $attributeImportRules = new EmailAttributeImportRules(new Email(), 'emailAddress');
     $collection = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, 'primaryEmail__emailAddress', 'importColumn');
     $this->assertEquals(1, count($collection));
     $this->assertEquals('Text', $collection[0]['elementType']);
     $this->assertEquals('DefaultValueModelAttributeMappingRuleForm', get_class($collection[0]['mappingRuleForm']));
     $this->assertEquals('Email', static::getReflectedPropertyValue($collection[0]['mappingRuleForm'], 'modelClassName'));
     $this->assertEquals('emailAddress', static::getReflectedPropertyValue($collection[0]['mappingRuleForm'], 'modelAttributeName'));
 }
 /**
  * @param string $columnName
  * @param string $attributeIndexOrDerivedType
  * @param string $importRulesType
  * @param string $columnType
  * @param array $mappingRuleFormsAndElementTypes
  * @return string
  */
 public function renderMappingRulesElements($columnName, $attributeIndexOrDerivedType, $importRulesType, $columnType, $mappingRuleFormsAndElementTypes)
 {
     assert('is_string($columnName)');
     assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null');
     assert('is_string($importRulesType)');
     assert('$columnType == "importColumn" || $columnType == "extraColumn"');
     assert('is_array($mappingRuleFormsAndElementTypes) || $mappingRuleFormsAndElementTypes == null');
     $content = null;
     $multipleMappingRulesCssClass = null;
     if ($attributeIndexOrDerivedType != null) {
         if ($mappingRuleFormsAndElementTypes == null) {
             $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRulesType, $attributeIndexOrDerivedType);
             $mappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, $attributeIndexOrDerivedType, $columnType);
         }
         if (count($mappingRuleFormsAndElementTypes) > 0) {
             $title = Zurmo::t('ImportModule', 'Rules');
         } else {
             $title = null;
         }
         $content .= ZurmoHtml::tag('h4', array(), $title);
         foreach ($mappingRuleFormsAndElementTypes as $notUsed => $ruleFormAndElementType) {
             $mappingRuleForm = $ruleFormAndElementType['mappingRuleForm'];
             $elementClassName = $ruleFormAndElementType['elementType'] . 'Element';
             $classToEvaluate = new ReflectionClass($elementClassName);
             if ($classToEvaluate->implementsInterface('DerivedElementInterface')) {
                 $attributeName = 'null';
             } else {
                 $attributeName = $mappingRuleForm::getAttributeName();
             }
             $params = array();
             $params['inputPrefix'] = array($this->mappingFormModelClassName, $columnName, 'mappingRulesData', get_class($mappingRuleForm));
             $element = new $elementClassName($mappingRuleForm, $attributeName, $this->form, $params);
             $element->editableTemplate = '<div>{label}{content}{error}</div>';
             // In case of TagCloud or MultiSelectDropbox inform user that in cas of updating existing model, original values will be overwritten.
             // Prepend this text before content, so it will appear before "Rules" title
             if ($element instanceof ImportMappingRuleDefaultMultiSelectDropDownFormElement) {
                 $content = $this->resolveTextAboutOverwritingMultiselectOrTagCloudValues($columnName . $attributeIndexOrDerivedType) . $content;
             }
             $content .= $element->render();
         }
     }
     $subDivsCssClass = 'has' . count($mappingRuleFormsAndElementTypes);
     $content = ZurmoHtml::tag('div', array('id' => self::getMappingRulesDivIdByColumnName($columnName), 'class' => 'mapping-rules ' . $subDivsCssClass), $content);
     // Not Coding Standard
     return $content;
 }
 public function renderMappingRulesElements($columnName, $attributeIndexOrDerivedType, $importRulesType, $columnType, $mappingRuleFormsAndElementTypes)
 {
     assert('is_string($columnName)');
     assert('is_string($attributeIndexOrDerivedType) || $attributeIndexOrDerivedType == null');
     assert('is_string($importRulesType)');
     assert('$columnType == "importColumn" || $columnType == "extraColumn"');
     assert('is_array($mappingRuleFormsAndElementTypes) || $mappingRuleFormsAndElementTypes == null');
     $content = '<div id="' . self::getMappingRulesDivIdByColumnName($columnName) . '" class="mapping-rules">';
     if ($attributeIndexOrDerivedType != null) {
         if ($mappingRuleFormsAndElementTypes == null) {
             $attributeImportRules = AttributeImportRulesFactory::makeByImportRulesTypeAndAttributeIndexOrDerivedType($importRulesType, $attributeIndexOrDerivedType);
             $mappingRuleFormsAndElementTypes = MappingRuleFormAndElementTypeUtil::makeCollectionByAttributeImportRules($attributeImportRules, $attributeIndexOrDerivedType, $columnType);
         }
         foreach ($mappingRuleFormsAndElementTypes as $notUsed => $ruleFormAndElementType) {
             $mappingRuleForm = $ruleFormAndElementType['mappingRuleForm'];
             $elementClassName = $ruleFormAndElementType['elementType'] . 'Element';
             $classToEvaluate = new ReflectionClass($elementClassName);
             if ($classToEvaluate->implementsInterface('DerivedElementInterface')) {
                 $attributeName = 'null';
             } else {
                 $attributeName = $mappingRuleForm::getAttributeName();
             }
             $params = array();
             $params['inputPrefix'] = array($this->mappingFormModelClassName, $columnName, 'mappingRulesData', get_class($mappingRuleForm));
             $element = new $elementClassName($mappingRuleForm, $attributeName, $this->form, $params);
             $content .= '<table><tbody><tr>';
             $content .= $element->render();
             $content .= '</tr></tbody></table>';
         }
     }
     $content .= '</div>';
     return $content;
 }