Проверка уникальности контрагента по паспортным данным
Материал из 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 ); } } }