Files
codecanyon-rest-api-for-per…/api/models/Custom_fields_model.php
2025-10-29 11:09:43 +01:00

568 lines
26 KiB
PHP

<?php
defined('BASEPATH') or exit('No direct script access allowed');
class Custom_fields_model extends App_Model {
private $pdf_fields = ['estimate', 'invoice', 'credit_note', 'items'];
private $client_portal_fields = ['customers', 'estimate', 'invoice', 'proposal', 'contracts', 'tasks', 'projects', 'contacts', 'tickets', 'company', 'credit_note'];
private $client_editable_fields = ['customers', 'contacts', 'tasks'];
public function __construct() {
parent::__construct();
}
/**
* @param integer (optional)
* @return object
* Get single custom field
*/
public function get($id = false, $playground = false) {
if (is_numeric($id)) {
$this->db->where('id', $id);
return $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'customfields')->row();
}
return $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'customfields')->result_array();
}
/**
* Add new custom field
* @param mixed $data All $_POST data
* @return boolean
*/
public function add($data, $playground = false) {
if (isset($data['disabled'])) {
$data['active'] = 0;
unset($data['disabled']);
} else {
$data['active'] = 1;
}
if (isset($data['show_on_pdf'])) {
if (in_array($data['fieldto'], $this->pdf_fields)) {
$data['show_on_pdf'] = 1;
} else {
$data['show_on_pdf'] = 0;
}
} else {
$data['show_on_pdf'] = 0;
}
if (isset($data['required'])) {
$data['required'] = 1;
} else {
$data['required'] = 0;
}
if (isset($data['disalow_client_to_edit'])) {
$data['disalow_client_to_edit'] = 1;
} else {
$data['disalow_client_to_edit'] = 0;
}
if (isset($data['show_on_table'])) {
$data['show_on_table'] = 1;
} else {
$data['show_on_table'] = 0;
}
if (isset($data['only_admin'])) {
$data['only_admin'] = 1;
} else {
$data['only_admin'] = 0;
}
if (isset($data['show_on_client_portal'])) {
if (in_array($data['fieldto'], $this->client_portal_fields)) {
$data['show_on_client_portal'] = 1;
} else {
$data['show_on_client_portal'] = 0;
}
} else {
$data['show_on_client_portal'] = 0;
}
if ($data['field_order'] == '') {
$data['field_order'] = 0;
}
$data['slug'] = slug_it($data['fieldto'] . '_' . $data['name'], ['separator' => '_', ]);
$slugs_total = total_rows(db_prefix() . ($playground ? 'playground_' : '') . 'customfields', ['slug' => $data['slug']]);
if ($slugs_total > 0) {
$data['slug'].= '_' . ($slugs_total + 1);
}
if ($data['fieldto'] == 'company') {
$data['show_on_pdf'] = 1;
$data['show_on_client_portal'] = 1;
$data['show_on_table'] = 1;
$data['only_admin'] = 0;
$data['disalow_client_to_edit'] = 0;
} else if ($data['fieldto'] == 'items') {
$data['show_on_pdf'] = 1;
$data['show_on_client_portal'] = 1;
$data['show_on_table'] = 1;
$data['only_admin'] = 0;
$data['disalow_client_to_edit'] = 0;
}
$this->db->insert(db_prefix() . ($playground ? 'playground_' : '') . 'customfields', $data);
$insert_id = $this->db->insert_id();
if ($insert_id) {
log_activity('New Custom Field Added [' . $data['name'] . ']');
return $insert_id;
}
return false;
}
/**
* Update custom field
* @param mixed $data All $_POST data
* @return boolean
*/
public function update($data, $id, $playground = false) {
$original_field = $this->get($id, $playground);
if (isset($data['disabled'])) {
$data['active'] = 0;
unset($data['disabled']);
} else {
$data['active'] = 1;
}
if (isset($data['disalow_client_to_edit'])) {
$data['disalow_client_to_edit'] = 1;
} else {
$data['disalow_client_to_edit'] = 0;
}
if (isset($data['only_admin'])) {
$data['only_admin'] = 1;
} else {
$data['only_admin'] = 0;
}
if (isset($data['required'])) {
$data['required'] = 1;
} else {
$data['required'] = 0;
}
if (isset($data['show_on_pdf'])) {
if (in_array($data['fieldto'], $this->pdf_fields)) {
$data['show_on_pdf'] = 1;
} else {
$data['show_on_pdf'] = 0;
}
} else {
$data['show_on_pdf'] = 0;
}
if ($data['field_order'] == '') {
$data['field_order'] = 0;
}
if (isset($data['show_on_client_portal'])) {
if (in_array($data['fieldto'], $this->client_portal_fields)) {
$data['show_on_client_portal'] = 1;
} else {
$data['show_on_client_portal'] = 0;
}
} else {
$data['show_on_client_portal'] = 0;
}
if (isset($data['show_on_table'])) {
$data['show_on_table'] = 1;
} else {
$data['show_on_table'] = 0;
}
if (!isset($data['display_inline'])) {
$data['display_inline'] = 0;
}
if (!isset($data['show_on_ticket_form'])) {
$data['show_on_ticket_form'] = 0;
}
if ($data['fieldto'] == 'company') {
$data['show_on_pdf'] = 1;
$data['show_on_client_portal'] = 1;
$data['show_on_table'] = 1;
$data['only_admin'] = 0;
$data['disalow_client_to_edit'] = 0;
} else if ($data['fieldto'] == 'items') {
$data['show_on_pdf'] = 1;
$data['show_on_client_portal'] = 1;
$data['show_on_table'] = 1;
$data['only_admin'] = 0;
$data['disalow_client_to_edit'] = 0;
}
$this->db->where('id', $id);
$this->db->update(db_prefix() . ($playground ? 'playground_' : '') . 'customfields', $data);
if ($this->db->affected_rows() > 0) {
log_activity('Custom Field Updated [' . $data['name'] . ']');
if ($data['type'] == 'checkbox' || $data['type'] == 'select' || $data['type'] == 'multiselect') {
if (trim($data['options']) != trim($original_field->options)) {
$options_now = explode(',', $data['options']);
foreach ($options_now as $key => $val) {
$options_now[$key] = trim($val);
}
$options_before = explode(',', $original_field->options);
foreach ($options_before as $key => $val) {
$options_before[$key] = trim($val);
}
$removed_options_in_use = [];
foreach ($options_before as $option) {
if (!in_array($option, $options_now) && total_rows(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues', ['fieldid' => $id, 'value' => $option, ])) {
array_push($removed_options_in_use, $option);
}
}
if (count($removed_options_in_use) > 0) {
$this->db->where('id', $id);
$this->db->update(db_prefix() . ($playground ? 'playground_' : '') . 'customfields', ['options' => implode(',', $options_now) . ',' . implode(',', $removed_options_in_use), ]);
return ['cant_change_option_custom_field' => true, ];
}
}
}
return true;
}
return false;
}
/**
* @param integer
* @return boolean
* Delete Custom fields
* All values for this custom field will be deleted from database
*/
public function delete($id, $playground = false) {
$this->db->where('id', $id);
$this->db->delete(db_prefix() . ($playground ? 'playground_' : '') . 'customfields');
if ($this->db->affected_rows() > 0) {
// Delete the values
$this->db->where('fieldid', $id);
$this->db->delete(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues');
log_activity('Custom Field Deleted [' . $id . ']');
return true;
}
return false;
}
public function get_custom_data($data, $custom_field_type, $id = '', $is_invoice_item = false, $playground = false)
{
$this->db->where('active', 1);
$this->db->where('fieldto', $custom_field_type);
$this->db->order_by('field_order', 'asc');
$fields = $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'customfields')->result_array();
$customfields = [];
if ('' === $id) {
foreach ($data as $data_key => $value) {
$data[$data_key]['customfields'] = [];
$value_id = $value['id'] ?? '';
if ('customers' == $custom_field_type) {
$value_id = $value['userid'];
}
if ('tickets' == $custom_field_type) {
$value_id = $value['ticketid'];
}
if ('staff' == $custom_field_type) {
$value_id = $value['staffid'];
}
foreach ($fields as $key => $field) {
$customfields[$key] = new StdClass();
$customfields[$key]->label = $field['name'];
if ('items' == $custom_field_type && !$is_invoice_item) {
$custom_field_type = 'items_pr';
$value_id = $value['itemid'] ?? $value['id'];
}
$customfields[$key]->value = $this->custom_fields_model->get_custom_field_value($value_id, $field['id'], $custom_field_type, false, $playground);
}
$data[$data_key]['customfields'] = $customfields;
}
}
if ('' !== $id && is_numeric($id)) {
$data->customfields = new StdClass();
foreach ($fields as $key => $field) {
$customfields[$key] = new StdClass();
$customfields[$key]->label = $field['name'];
if ('items' == $custom_field_type && !$is_invoice_item) {
$custom_field_type = 'items_pr';
}
$customfields[$key]->value = $this->custom_fields_model->get_custom_field_value($id, $field['id'], $custom_field_type, false, $playground);
}
$data->customfields = $customfields;
}
return $data;
}
/**
* Change custom field status / active / inactive
* @param mixed $id customfield id
* @param integer $status active or inactive
*/
public function change_custom_field_status($id, $status, $playground = false) {
$this->db->where('id', $id);
$this->db->update(db_prefix() . ($playground ? 'playground_' : '') . 'customfields', ['active' => $status, ]);
log_activity('Custom Field Status Changed [FieldID: ' . $id . ' - Active: ' . $status . ']');
}
public function get_relation_data_api($type, $search = '', $playground = false)
{
$q = '';
if ('' != $search) {
$q = $search;
$q = trim(urldecode($q));
}
$this->load->model('clients_model');
$this->load->model('misc_model');
$this->load->model('payment_modes_model');
$data = [];
if ('customer' == $type || 'customers' == $type) {
$where_clients = db_prefix() . ($playground ? 'playground_' : '') . 'clients.active=1';
if ($q) {
$where_clients .= ' AND (';
$where_clients .= 'company LIKE "%'.$q.'%" OR CONCAT(firstname, " ", lastname) LIKE "%'.$q.'%" OR email LIKE "%'.$q.'%"';
$fields = $this->get_custom_fields('customers', [], false, $playground);
foreach ($fields as $key => $value) {
$this->db->join(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues as ctable_'.$key.'', db_prefix() . ($playground ? 'playground_' : '') . 'clients.userid = ctable_'.$key.'.relid and ctable_'.$key.'.fieldto="customers" AND ctable_'.$key.'.fieldid='.$value['id'], 'LEFT');
$where_clients .= ' OR ctable_'.$key.'.value LIKE "%'.$q.'%"';
}
$where_clients .= ')';
}
$data = $this->clients_model->get('', $where_clients);
} else if ('contacts' == $type) {
$where_clients = db_prefix() . ($playground ? 'playground_' : '') . 'clients.active=1';
if ($q) {
$where_clients .= ' AND (';
$where_clients .= ' company LIKE "%'.$this->db->escape_like_str($q).'%" ESCAPE \'!\' OR CONCAT(firstname, " ", lastname) LIKE "%'.$this->db->escape_like_str($q).'%" ESCAPE \'!\' OR email LIKE "%'.$this->db->escape_like_str($q).'%" ESCAPE \'!\'';
$fields = $this->get_custom_fields('contacts', [], false, $playground);
foreach ($fields as $key => $value) {
$this->db->join(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues as ctable_'.$key.'', db_prefix() . ($playground ? 'playground_' : '') . 'contacts.id = ctable_'.$key.'.relid and ctable_'.$key.'.fieldto="contacts" AND ctable_'.$key.'.fieldid='.$value['id'], 'LEFT');
$where_clients .= ' OR ctable_'.$key.'.value LIKE "%'.$q.'%"';
}
$where_clients .= ') AND '.db_prefix() . ($playground ? 'playground_' : '') . 'clients.active = 1';
}
$this->db->select('contacts.id AS id,clients.*,contacts.*');
$this->db->join(db_prefix() . ($playground ? 'playground_' : '') . 'clients', ''.db_prefix() . ($playground ? 'playground_' : '') . 'contacts.userid = '.db_prefix() . ($playground ? 'playground_' : '') . 'clients.userid', 'left');
$data = $this->clients_model->get_contacts('', $where_clients, [], $playground);
// echo $this->db->last_query();
} else if ('ticket' == $type) {
$search = $this->_search_tickets($q, 0, true, $playground);
$data = $search['result'];
} else if ('lead' == $type || 'leads' == $type) {
$search = $this->_search_leads($q, 0, ['junk' => 0,], true, $playground);
$data = $search['result'];
} else if ('invoice' == $type || 'invoices' == $type) {
$search = $this->_search_invoices($q, 0, [], true, $playground);
$data = $search['result'];
} else if ('invoice_items' == $type) {
$fields = $this->get_custom_fields('items', [], false, $playground);
$this->db->select('rate, items.id, description as name, long_description as subtext');
$this->db->like('description', $q);
$this->db->or_like('long_description', $q);
foreach ($fields as $key => $value) {
$this->db->join(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues as ctable_'.$key.'', db_prefix() . ($playground ? 'playground_' : '') . 'items.id = ctable_'.$key.'.relid and ctable_'.$key.'.fieldto="items_pr" AND ctable_'.$key.'.fieldid='.$value['id'], 'LEFT');
$this->db->or_like('ctable_'.$key.'.value', $q);
}
$items = $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'items')->result_array();
foreach ($items as $key => $item) {
$items[$key]['subtext'] = strip_tags(mb_substr($item['subtext'], 0, 200)).'...';
$items[$key]['name'] = '('.app_format_number($item['rate']).') '.$item['name'];
}
$data = $items;
} else if ('project' == $type) {
$where_projects = '';
if ($this->input->post('customer_id')) {
$where_projects .= '(clientid='.$this->input->post('customer_id').' or clientid in (select id from tblleads where client_id='.$this->input->post('customer_id').') )';
}
if ($this->input->post('rel_type')) {
$where_projects .= ' and rel_type="'.$this->input->post('rel_type').'" ';
}
$search = $this->misc_model->search_projects($q, 0, $where_projects, $this->input->post('rel_type'), $playground);
$data = $search['result'];
} else if ('staff' == $type) {
$search = $this->misc_model->search_staff($q, 0, $playground);
$data = $search['result'];
} else if ('tasks' == $type) {
$search = $this->misc_model->search_tasks($q, 0, $playground);
$data = $search['result'];
} else if ('payments' == $type) {
$search = $this->payment_modes_model->search($q, 0, $playground);
$data = $search['result'];
} else if ('proposals' == $type) {
$search = $this->misc_model->search_proposals($q, 0, $playground);
$data = $search['result'];
} else if ('estimates' == $type) {
$search = $this->misc_model->search_estimates($q, 0, $playground);
$data = $search['result'];
} else if ('expenses' == $type) {
$search = $this->misc_model->search_expenses($q, 0, $playground);
$data = $search['result'];
} else if ('creditnotes' == $type) {
$search = $this->misc_model->search_credit_notes($q, 0, $playground);
$data = $search['result'];
} else if ('milestones' == $type) {
$where_milestones = '';
if ($q) {
$where_milestones .= '(name LIKE "%'.$q.'%" OR id LIKE "%'.$q.'%")';
}
$data = $this->misc_model->get_milestones('', $where_milestones, $playground);
}
return $data;
}
/**
* Check for custom fields, update on $_POST
* @param mixed $rel_id the main ID from the table
* @param array $custom_fields all custom fields with id and values
* @return boolean
*/
public function handle_custom_fields_post($rel_id, $custom_fields, $is_cf_items = false, $playground = false)
{
$affectedRows = 0;
foreach ($custom_fields as $key => $fields) {
foreach ($fields as $field_id => $field_value) {
$this->db->where('relid', $rel_id);
$this->db->where('fieldid', $field_id);
$this->db->where('fieldto', ($is_cf_items ? 'items_pr' : $key));
$row = $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues')->row();
if (!is_array($field_value)) {
$field_value = trim($field_value);
}
// Make necessary checkings for fields
if (!defined('COPY_CUSTOM_FIELDS_LIKE_HANDLE_POST')) {
$this->db->where('id', $field_id);
$field_checker = $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'customfields')->row();
if ($field_checker->type == 'date_picker') {
$field_value = to_sql_date($field_value);
} else if ($field_checker->type == 'date_picker_time') {
$field_value = to_sql_date($field_value, true);
} else if ($field_checker->type == 'textarea') {
$field_value = nl2br($field_value);
} else if ($field_checker->type == 'checkbox' || $field_checker->type == 'multiselect') {
if ($field_checker->disalow_client_to_edit == 1 && is_client_logged_in()) {
continue;
}
if (is_array($field_value)) {
$v = 0;
foreach ($field_value as $chk) {
if ($chk == 'cfk_hidden') {
unset($field_value[$v]);
}
$v++;
}
$field_value = implode(', ', $field_value);
}
}
}
if ($row) {
$this->db->where('id', $row->id);
$this->db->update(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues', [
'value' => $field_value,
]);
if ($this->db->affected_rows() > 0) {
$affectedRows++;
}
} else {
if ($field_value != '') {
$this->db->insert(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues', [
'relid' => $rel_id,
'fieldid' => $field_id,
'fieldto' => $is_cf_items ? 'items_pr' : $key,
'value' => $field_value,
]);
$insert_id = $this->db->insert_id();
if ($insert_id) {
$affectedRows++;
}
}
}
}
}
if ($affectedRows > 0) {
return true;
}
return false;
}
/**
* Get custom fields
* @param string $field_to
* @param array $where
* @param boolean $exclude_only_admin
* @return array
*/
public function get_custom_fields($field_to, $where = [], $exclude_only_admin = false, $playground = false)
{
$is_admin = is_admin();
$this->db->where('fieldto', $field_to);
if ((is_array($where) && count($where) > 0) || (!is_array($where) && $where != '')) {
$this->db->where($where);
}
if (!$is_admin || $exclude_only_admin == true) {
$this->db->where('only_admin', 0);
}
$this->db->where('active', 1);
$this->db->order_by('field_order', 'asc');
$results = $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'customfields')->result_array();
foreach ($results as $key => $result) {
$results[$key]['name'] = _maybe_translate_custom_field_name(e($result['name']), $result['slug']);
}
return $results;
}
/**
* Get custom field value
* @param mixed $rel_id the main ID from the table, e.q. the customer id, invoice id
* @param mixed $field_id_or_slug field id, the custom field ID or custom field slug
* @param string $field_to belongs to e.q leads, customers, staff
* @param string $format format date values
* @return string
*/
public function get_custom_field_value($rel_id, $field_id_or_slug, $field_to, $format = true, $playground = false)
{
$this->db->select(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues.value,' . db_prefix() . ($playground ? 'playground_' : '') . 'customfields.type');
$this->db->join(db_prefix() . ($playground ? 'playground_' : '') . 'customfields', db_prefix() . ($playground ? 'playground_' : '') . 'customfields.id=' . db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues.fieldid');
$this->db->where(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues.relid', $rel_id);
if (is_numeric($field_id_or_slug)) {
$this->db->where(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues.fieldid', $field_id_or_slug);
} else {
$this->db->where(db_prefix() . ($playground ? 'playground_' : '') . 'customfields.slug', $field_id_or_slug);
}
$this->db->where(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues.fieldto', $field_to);
$row = $this->db->get(db_prefix() . ($playground ? 'playground_' : '') . 'customfieldsvalues')->row();
$result = '';
if ($row) {
$result = $row->value;
if ($format == true) {
if ($row->type == 'date_picker') {
$result = _d($result);
} elseif ($row->type == 'date_picker_time') {
$result = _dt($result);
}
}
}
return $result;
}
/**
* Return field where Shown on PDF is allowed
* @return array
*/
public function get_pdf_allowed_fields() {
return $this->pdf_fields;
}
/**
* Return fields where Show on customer portal is allowed
* @return array
*/
public function get_client_portal_allowed_fields() {
return $this->client_portal_fields;
}
/**
* Return fields where are editable in customers area
* @return array
*/
public function get_client_editable_fields() {
return $this->client_editable_fields;
}
}