Jump to content

Определение уникальности ввода ИНН в карточке Контрагента в SuiteCRM


Recommended Posts

Хочу разместить тут одну из вариаций решения задачи: При добавлении нового Контрагента, если заполнено поле "ИНН", надо определить, нет ли в базе уже существующего Контрагента с таким же ИНН. И если есть - не дать сохранить выведя соответствующую надпись о этом.

Реализация сделана на странице добавления новой записи в модуле Accounts.

Если в вкратце, то алгоритм следующий:

  1. Добавляем на страницу создания/редактирования карточки Accounts произвольный js-файл
  2. В этом js-файле для кнопки "Сохранить" прописываем свой обработчик.
  3. Когда пользователь нажимает кнопку "Сохранить" обработчик получает введенное значение из поля "ИНН", и отправляет AJAX-запрос на сервер с этим ИНН, чтобы проверить его в базе.
  4. Если ИНН в базе найден, то подсвечиваем красным поле с ИНН и пишем о том, что введенное значение не уникально
  5. Если ИНН не найден, то продолжаем стандартное сохранение карточки.

Теперь давайте более предметно посмотрим, как это работает.

В meta-файле, описывающем editview для Account custom/modules/Accounts/metadata/editviewdefs.php, добавляем блок, который подключит js-файл:

<?php
$viewdefs ['Accounts'] =
    array (
        'EditView' =>
        array (
            'templateMeta' =>
            array (
                'form' =>
                array (
                    'enctype' => 'multipart/form-data',
                    'buttons' =>
                    array (
                        0 => 'SAVE',
                        1 => 'CANCEL',
                    ),
                ),
                'maxColumns' => '2',
                'widths' =>
                array (
                    0 =>
                    array (
                        'label' => '10',
                        'field' => '30',
                    ),
                    1 =>
                    array (
                        'label' => '10',
                        'field' => '30',
                    ),
                ),
                'includes' =>
                array (
                    1 =>
                    array (
                        'file' => 'modules/Accounts/Account.js',
                    ),
                    2 =>
                    array (
                        'file' => 'modules/Accounts/edit.view.js',
                    ),
                ),
            ),

Это лишь кусок файла с мета-данными. Непосредственно наша вставка, это:

2 =>
                    array (
                        'file' => 'modules/Accounts/edit.view.js',
                    ),

Таким образом нам надо добавить пустой файл modules/Accounts/edit.view.js,  и заполнить его примерно так:

$(document).ready(function(){

    // Ставим для кнопки Сохранения свой обработчик
    $('#EditView').find('input[type=submit][id=saveButton]').click(function(){
        // Ставим действие после срабатывания формы
        $('#EditView').find('input[type=hidden][name=action]').val('Save');
        var checkForm = check_form('EditView');

        if($('#inn').val() != '') {
            // Проверям на уникальность ИНН
            $.ajax({
                url: "index.php",
                type: "POST",
                data: {
                    module: 'Accounts',
                    action: 'checkINN',
                    record: $('#EditView').find('input[name=record]').val(),
                    inn: $('#inn').val(),
                    to_pdf: true
                }
            }).done(function(responce) {
                    // Обработка полученных данных
                    var accounts = jQuery.parseJSON(responce);
                    if(accounts.length > 0) {
                        // Найдены дубликаты
                        var list = '';
                        for(var i = 0; i < accounts.length; i++) {
                            list += '<li><A href="index.php?module=Accounts&action=DetailView&record='+accounts[i]['id']+'" style="color: red;" target="_blank">'+accounts[i]['name']+'</A></li>';
                        }
                        list = '<B>Найдены дубликаты по ИНН</B>:<BR>' + list;
                        if(isAccessDoubleINN) {
                            list += '<BR>Если желаете все равно сохранить Контрагента с текущим ИНН нажмите кнопку: <button class="button" onclick="if(check_form(\'EditView\')){$(\'#EditView\').submit();}">Пропустить</button>';
                        }
                        add_error_style('EditView','inn', list);
                    } else {
                        // Дубликатов по ИНН нет, можем прождолжать
                        // Стандартная проверка остальных полей
                        if(checkForm) {
                            $('#EditView').submit();
                        }
                    }
                });
        } else {
            if(checkForm) {
                $('#EditView').submit();
            }
        }


        return false;
    });
    // Удаляем уже ранее установленный обработчик
    $('#EditView').find('input[type=submit][id=saveButton]').removeAttr("onclick");

});

Здесь в блоке

$.ajax({
                url: "index.php",
                type: "POST",
                data: {
                    module: 'Accounts',
                    action: 'checkINN',
                    record: $('#EditView').find('input[name=record]').val(),
                    inn: $('#inn').val(),
                    to_pdf: true
                }
            })

как раз и происходит AJAX-запрос к серверу на проверку уникальности введенного значения. Запрос происходит к action=checkINN. Нам надо добавить php-файл с таким названием по адресу modules/Accounts/checkINN.php:

<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
/**
 * Created by JetBrains PhpStorm.
 * User: Evgen
 * Date: 22.08.13
 * Time: 12:57
 * To change this template use File | Settings | File Templates.
 */

global $db;

$sql = "
        SELECT
            `id`,
            `name`
        FROM
          `accounts`
        WHERE
          `inn` = '".$_REQUEST["inn"]."'
          AND
          `deleted` = 0
";
if(isset($_REQUEST['record']) AND $_REQUEST['record'] != '') {
    $sql .= " AND `id` != '".$_REQUEST["record"]."' ";
}
$result = $db->query($sql, true);
$return_array = array();
while($row = $db->fetchByAssoc($result)) {
    $return_array[] = $row;
}

$json = new JSON();
echo $json->encode($return_array);

Вот и все! Проверка на уникальность готова.

Link to comment
Share on other sites

  • 1 year later...

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...