function saveOppPanelAction() { @($view_id = DevblocksPlatform::importGPC($_REQUEST['view_id'], 'string', '')); @($opp_id = DevblocksPlatform::importGPC($_REQUEST['opp_id'], 'integer', 0)); @($name = DevblocksPlatform::importGPC($_REQUEST['name'], 'string', '')); @($status = DevblocksPlatform::importGPC($_REQUEST['status'], 'integer', 0)); @($amount_dollars = DevblocksPlatform::importGPC($_REQUEST['amount'], 'string', '0')); @($amount_cents = DevblocksPlatform::importGPC($_REQUEST['amount_cents'], 'integer', 0)); @($email_str = DevblocksPlatform::importGPC($_REQUEST['emails'], 'string', '')); @($worker_id = DevblocksPlatform::importGPC($_REQUEST['worker_id'], 'integer', 0)); @($comment = DevblocksPlatform::importGPC($_REQUEST['comment'], 'string', '')); @($created_date_str = DevblocksPlatform::importGPC($_REQUEST['created_date'], 'string', '')); @($closed_date_str = DevblocksPlatform::importGPC($_REQUEST['closed_date'], 'string', '')); @($do_delete = DevblocksPlatform::importGPC($_REQUEST['do_delete'], 'integer', 0)); // State $is_closed = 0 == $status ? 0 : 1; $is_won = 1 == $status ? 1 : 0; // Strip commas and decimals and put together the "dollars+cents" $amount = intval(str_replace(array(',', '.'), '', $amount_dollars)) . '.' . number_format($amount_cents, 0, '', ''); // Dates if (false === ($created_date = strtotime($created_date_str))) { $created_date = time(); } if (false === ($closed_date = strtotime($closed_date_str))) { $closed_date = $is_closed ? time() : 0; } if (!$is_closed) { $closed_date = 0; } // Worker $active_worker = CerberusApplication::getActiveWorker(); // Save if ($do_delete) { if (null != ($opp = DAO_CrmOpportunity::get($opp_id))) { // Check privs if ($active_worker->hasPriv('crm.opp.actions.create') && $active_worker->id == $opp->worker_id || $active_worker->hasPriv('crm.opp.actions.update_nobody') && empty($opp->worker_id) || $active_worker->hasPriv('crm.opp.actions.update_all')) { DAO_CrmOpportunity::delete($opp_id); } } } elseif (empty($opp_id)) { $emails = DevblocksPlatform::parseCsvString($email_str); // Check privs if (!$active_worker->hasPriv('crm.opp.actions.create')) { return; } // One opportunity per provided e-mail address if (is_array($emails)) { foreach ($emails as $email) { if (null == ($address = DAO_Address::lookupAddress($email, true))) { continue; } $fields = array(DAO_CrmOpportunity::NAME => $name, DAO_CrmOpportunity::AMOUNT => $amount, DAO_CrmOpportunity::PRIMARY_EMAIL_ID => $address->id, DAO_CrmOpportunity::CREATED_DATE => intval($created_date), DAO_CrmOpportunity::UPDATED_DATE => time(), DAO_CrmOpportunity::CLOSED_DATE => intval($closed_date), DAO_CrmOpportunity::IS_CLOSED => $is_closed, DAO_CrmOpportunity::IS_WON => $is_won, DAO_CrmOpportunity::WORKER_ID => $worker_id); $opp_id = DAO_CrmOpportunity::create($fields); // Custom fields @($field_ids = DevblocksPlatform::importGPC($_REQUEST['field_ids'], 'array', array())); DAO_CustomFieldValue::handleFormPost(CrmCustomFieldSource_Opportunity::ID, $opp_id, $field_ids); // If we're adding a first comment if (!empty($comment)) { $fields = array(DAO_Note::CREATED => time(), DAO_Note::SOURCE_EXTENSION_ID => CrmNotesSource_Opportunity::ID, DAO_Note::SOURCE_ID => $opp_id, DAO_Note::CONTENT => $comment, DAO_Note::WORKER_ID => $active_worker->id); $comment_id = DAO_Note::create($fields); } } } } else { if (empty($opp_id)) { return; } $fields = array(DAO_CrmOpportunity::NAME => $name, DAO_CrmOpportunity::AMOUNT => $amount, DAO_CrmOpportunity::CREATED_DATE => intval($created_date), DAO_CrmOpportunity::UPDATED_DATE => time(), DAO_CrmOpportunity::CLOSED_DATE => intval($closed_date), DAO_CrmOpportunity::IS_CLOSED => $is_closed, DAO_CrmOpportunity::IS_WON => $is_won, DAO_CrmOpportunity::WORKER_ID => $worker_id); // Check privs if (null != ($opp = DAO_CrmOpportunity::get($opp_id)) && ($active_worker->hasPriv('crm.opp.actions.create') && $active_worker->id == $opp->worker_id || $active_worker->hasPriv('crm.opp.actions.update_nobody') && empty($opp->worker_id) || $active_worker->hasPriv('crm.opp.actions.update_all'))) { DAO_CrmOpportunity::update($opp_id, $fields); // Custom fields @($field_ids = DevblocksPlatform::importGPC($_REQUEST['field_ids'], 'array', array())); DAO_CustomFieldValue::handleFormPost(CrmCustomFieldSource_Opportunity::ID, $opp_id, $field_ids); } } // Reload view (if linked) if (!empty($view_id) && null != ($view = C4_AbstractViewLoader::getView('', $view_id))) { $view->render(); } exit; }
function doImportAction() { $active_worker = CerberusApplication::getActiveWorker(); if (!$active_worker->hasPriv('crm.opp.actions.import')) { return; } @($pos = DevblocksPlatform::importGPC($_REQUEST['pos'], 'array', array())); @($field = DevblocksPlatform::importGPC($_REQUEST['field'], 'array', array())); @($sync_dupes = DevblocksPlatform::importGPC($_REQUEST['sync_dupes'], 'array', array())); @($include_first = DevblocksPlatform::importGPC($_REQUEST['include_first'], 'integer', 0)); @($is_blank_unset = DevblocksPlatform::importGPC($_REQUEST['is_blank_unset'], 'integer', 0)); @($opt_assign = DevblocksPlatform::importGPC($_REQUEST['opt_assign'], 'integer', 0)); @($opt_assign_worker_id = DevblocksPlatform::importGPC($_REQUEST['opt_assign_worker_id'], 'integer', 0)); $visit = CerberusApplication::getVisit(); $db = DevblocksPlatform::getDatabaseService(); $workers = DAO_Worker::getAllActive(); $csv_file = $visit->get('crm.import.last.csv', ''); $fp = fopen($csv_file, "rt"); if (!$fp) { return; } // [JAS]: Do we need to consume a first row of headings? if (!$include_first) { @fgetcsv($fp, 8192, ',', '"'); } while (!feof($fp)) { $parts = fgetcsv($fp, 8192, ',', '"'); if (empty($parts) || 1 == count($parts) && is_null($parts[0])) { continue; } $fields = array(); $custom_fields = array(); $sync_fields = array(); foreach ($pos as $idx => $p) { $key = $field[$idx]; $val = $parts[$idx]; // Special handling if (!empty($key)) { switch ($key) { case 'amount': if (0 != strlen($val) && is_numeric($val)) { @($val = floatval($val)); } else { unset($key); } break; // Translate e-mail address to ID // Translate e-mail address to ID case 'email': if (null != ($addy = CerberusApplication::hashLookupAddress($val, true))) { $key = 'primary_email_id'; $val = $addy->id; } else { unset($key); } break; // Bools // Bools case 'is_won': case 'is_closed': if (0 != strlen($val)) { @($val = !empty($val) ? 1 : 0); } else { unset($key); } break; // Dates // Dates case 'created_date': case 'updated_date': case 'closed_date': if (0 != strlen($val)) { @($val = !is_numeric($val) ? strtotime($val) : $val); } else { unset($key); } break; // Worker by name // Worker by name case 'worker': unset($key); if (is_array($workers)) { foreach ($workers as $worker_id => $worker) { if (0 == strcasecmp($val, $worker->getName())) { $key = 'worker_id'; $val = $worker_id; } } } break; } if (!isset($key)) { continue; } // Custom fields if ('cf_' == substr($key, 0, 3)) { $custom_fields[substr($key, 3)] = $val; } elseif (!empty($key)) { $fields[$key] = $val; } // Find dupe combos if (in_array($idx, $sync_dupes)) { $search_field = ''; $search_val = ''; switch ($key) { case 'primary_email_id': $search_field = SearchFields_CrmOpportunity::PRIMARY_EMAIL_ID; $search_val = intval($val); break; case 'title': $search_field = SearchFields_CrmOpportunity::NAME; $search_val = $val; break; case 'amount': $search_field = SearchFields_CrmOpportunity::AMOUNT; $search_val = floatval($val); break; case 'is_won': $search_field = SearchFields_CrmOpportunity::IS_WON; $search_val = intval($val); break; case 'is_closed': $search_field = SearchFields_CrmOpportunity::IS_CLOSED; $search_val = intval($val); break; case 'created_date': $search_field = SearchFields_CrmOpportunity::CREATED_DATE; $search_val = intval($val); break; case 'updated_date': $search_field = SearchFields_CrmOpportunity::UPDATED_DATE; $search_val = intval($val); break; case 'closed_date': $search_field = SearchFields_CrmOpportunity::CLOSED_DATE; $search_val = intval($val); break; case 'worker_id': $search_field = SearchFields_CrmOpportunity::WORKER_ID; $search_val = intval($val); break; default: // Custom field dupe if ('cf_' == substr($key, 0, 3)) { $search_field = $key; // [TODO] Need to format this for proper custom fields $search_val = $val; } break; } if (!empty($search_field) && !empty($search_val)) { $sync_fields[$search_field] = new DevblocksSearchCriteria($search_field, '=', $search_val); } } } } // end foreach($pos) // Dupe checking if (!empty($fields) && !empty($sync_fields)) { list($dupes, $null) = DAO_CrmOpportunity::search(array(), $sync_fields, 1, 0, null, false, false); } if (!empty($fields)) { if (isset($fields['primary_email_id'])) { // Make sure a minimum amount of fields are provided if (!isset($fields[DAO_CrmOpportunity::UPDATED_DATE])) { $fields[DAO_CrmOpportunity::UPDATED_DATE] = time(); } if ($opt_assign && !isset($fields[DAO_CrmOpportunity::WORKER_ID])) { $fields[DAO_CrmOpportunity::WORKER_ID] = $opt_assign_worker_id; } if (empty($dupes)) { // [TODO] Provide an import prefix for blank names if (!isset($fields[DAO_CrmOpportunity::NAME]) && isset($addy)) { $fields[DAO_CrmOpportunity::NAME] = $addy->email; } if (!isset($fields[DAO_CrmOpportunity::CREATED_DATE])) { $fields[DAO_CrmOpportunity::CREATED_DATE] = time(); } $id = DAO_CrmOpportunity::create($fields); } else { $id = key($dupes); DAO_CrmOpportunity::update($id, $fields); } } } if (!empty($custom_fields) && !empty($id)) { // Format (typecast) and set the custom field types $source_ext_id = CrmCustomFieldSource_Opportunity::ID; DAO_CustomFieldValue::formatAndSetFieldValues($source_ext_id, $id, $custom_fields, $is_blank_unset); } } @unlink($csv_file); // nuke the imported file $visit->set('crm.import.last.csv', null); DevblocksPlatform::redirect(new DevblocksHttpResponse(array('activity', 'opps'))); }