Проверка уникальности контрагента по паспортным данным

Материал из BiTel WiKi

Перейти к: навигация, поиск

При редактировании параметров с паспортными данными, датой рождения производится проверка на совпадения. В случае их нахождения - выводится предупреждение и похожие контрагенты открываются.

Класс-обработчик указывается для всех контроллируемых параметров. Коды параметров указываются в константах.

package ru.bgcrm.dyn.ufanet;
 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;
 
import ru.bgcrm.dao.ParamValueDAO;
import ru.bgcrm.dao.Tables;
import ru.bgcrm.event.Event;
import ru.bgcrm.event.ParamChangingEvent;
import ru.bgcrm.event.client.CustomerOpenEvent;
import ru.bgcrm.event.listener.DynamicEventListener;
import ru.bgcrm.model.BGException;
import ru.bgcrm.model.BGMessageException;
import ru.bgcrm.struts.form.DynActionForm;
import ru.bgcrm.util.TimeUtils;
import ru.bgcrm.util.sql.ConnectionSet;
 
/**
 * При правке параметров контрагента.
 * Если вводят в 74 параметр серию и номер парспорта другого контрагента - кидать ошибку и открывать контрагента у кого уже стоят такие серия и номер.
 * Если вводят в ключевые параметры 73, 75, 77 значение идентичное с другим контрагентом с таким же наименованием кидать сообщение, что подозрительное совпадение полей и открывать так же этого контрагента, но при этом сохранять значения.
 * @author danion
 *
 */
public class DuplicateCustomerCreationBlocker
	extends DynamicEventListener
{
	private static int CUSTOMER_PASSPORT_NUMBER_PARAM_ID = 74;
	private static int CUSTOMER_BIRTHDAY_PARAM_ID = 73;
	private static int CUSTOMER_PASSPORT_DATE_PARAM_ID = 75;
	private static int CUSTOMER_ADDRESS = 77;
 
	@Override
	public void notify( Event e, ConnectionSet connectionSet )
		throws BGMessageException, BGException
	{
		if( !(e instanceof ParamChangingEvent) )
		{
			return;
		}
 
		try
		{
			ParamChangingEvent event = (ParamChangingEvent)e;
			Connection con = connectionSet.getConnection();
			ParamValueDAO paramValueDAO = new ParamValueDAO( con );
			DynActionForm form = event.getForm();
			int paramId = event.getParameter().getId();
			int customerId = event.getObjectId();
 
			if( paramId == CUSTOMER_PASSPORT_NUMBER_PARAM_ID )
			{
				String value = (String)event.getValue();
 
				String sql = " SELECT * FROM " + Tables.TABLE_CUSTOMER + " AS c " +
							 " INNER JOIN " + Tables.TABLE_PARAM_TEXT + " AS pt ON c.id=pt.id AND pt.param_id=" + CUSTOMER_PASSPORT_NUMBER_PARAM_ID +
							 " WHERE pt.value=? AND c.id<>? ";
 
				PreparedStatement ps = con.prepareStatement( sql );
				ps.setString( 1, value );
				ps.setInt( 2, customerId );
 
				ResultSet rs = ps.executeQuery();
 
				StringBuilder duplicateCustomerInformation = new StringBuilder();
				while( rs.next() )
				{
					int id = rs.getInt( "c.id" );
					String title = rs.getString( "c.title" );
 
					duplicateCustomerInformation.append( id + " [" + title + "]\n");
 
					form.getResponse().addEvent( new CustomerOpenEvent( id ) );
				}
 
				if( duplicateCustomerInformation.length() > 0 )
				{
					throw new BGMessageException( "Существуют контрагенты с похожими данными:\n" + duplicateCustomerInformation.toString() );
				}
			}
 
			if( paramId == CUSTOMER_BIRTHDAY_PARAM_ID || paramId == CUSTOMER_PASSPORT_DATE_PARAM_ID || paramId == CUSTOMER_ADDRESS )
			{
				Date customerBirthDate = paramValueDAO.getParamDate( customerId, CUSTOMER_BIRTHDAY_PARAM_ID );
				Date customerPassportDate = paramValueDAO.getParamDate( customerId, CUSTOMER_PASSPORT_DATE_PARAM_ID );
				String customerAddressValue = paramValueDAO.getParamText( customerId, CUSTOMER_ADDRESS );
 
				String sql = " SELECT * FROM " + Tables.TABLE_CUSTOMER + " AS c " +
							 " INNER JOIN " + Tables.TABLE_PARAM_DATE + " AS b ON c.id=b.id AND b.param_id=" + CUSTOMER_BIRTHDAY_PARAM_ID +
							 " INNER JOIN " + Tables.TABLE_PARAM_DATE + " AS pd ON c.id=pd.id AND pd.param_id=" + CUSTOMER_PASSPORT_DATE_PARAM_ID +
							 " INNER JOIN " + Tables.TABLE_PARAM_TEXT + " AS pt ON c.id=pt.id AND pt.param_id=" + CUSTOMER_ADDRESS +
							 " WHERE b.value=? AND pd.value=? AND pt.value=? AND c.id<>? ";
 
				PreparedStatement ps = con.prepareStatement( sql );
				ps.setDate( 1, TimeUtils.convertDateToSqlDate( customerBirthDate ) );
				ps.setDate( 2, TimeUtils.convertDateToSqlDate( customerPassportDate ) );
				ps.setString( 3, customerAddressValue );
				ps.setInt( 4, customerId );
 
				StringBuilder sb = new StringBuilder();
 
				ResultSet rs = ps.executeQuery();
				while( rs.next() )
				{
					int id = rs.getInt( "c.id" );
					String title = rs.getString( "c.title" );
 
					sb.append( "(ID: " ).append( id ).append( ") " );
					sb.append( title ).append( "\n" );
 
					form.getResponse().addEvent( new CustomerOpenEvent( id ) );
				}
 
				form.getResponse().setStatus( "message" );
				form.getResponse().setMessage( "Сущесвует контрагент с похожими данными!" );
			}
		}
		catch( SQLException ex )
		{
			throw new BGException( ex );
		}
	}
}
Личные инструменты