1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  package org.kuali.ole.vnd.batch.dataaccess;
17  
18  import java.util.ArrayList;
19  import java.util.List;
20  
21  import org.apache.commons.lang.StringUtils;
22  import org.kuali.ole.vnd.businessobject.DebarredVendorMatch;
23  import org.kuali.ole.vnd.businessobject.VendorAddress;
24  import org.kuali.ole.vnd.document.service.VendorService;
25  import org.kuali.rice.core.framework.persistence.jdbc.dao.PlatformAwareDaoBaseJdbc;
26  import org.springframework.jdbc.support.rowset.SqlRowSet;
27  
28  public class DebarredVendorDaoJdbc extends  PlatformAwareDaoBaseJdbc implements DebarredVendorDao {
29      private VendorService vendorService;
30      private DebarredVendorMatchDao debarredVendorMatchDao;
31  
32      @Override
33      public List<DebarredVendorMatch> match() {
34          String active = "dtl.DOBJ_MAINT_CD_ACTV_IND = 'Y'";
35          String joinDtl = " INNER JOIN pur_vndr_dtl_t dtl";
36          String joinExcl = " INNER JOIN PUR_VNDR_EXCL_MT excl";
37          String where = " WHERE " + active;
38          String eplsFields = "excl.VNDR_EXCL_ID, excl.VNDR_EXCL_LOAD_DT, excl.VNDR_EXCL_NM, excl.VNDR_EXCL_LN1_ADDR, excl.VNDR_EXCL_LN2_ADDR, excl.VNDR_EXCL_CTY_NM" +
39          		", excl.VNDR_EXCL_ST_CD, excl.VNDR_EXCL_PRVN_NM, excl.VNDR_EXCL_ZIP_CD, excl.VNDR_EXCL_OTHR_NM, excl.VNDR_EXCL_DESC_TXT";
40  
41          String selectName = "SELECT dtl.VNDR_HDR_GNRTD_ID, dtl.VNDR_DTL_ASND_ID, " + eplsFields + " , 0 VNDR_ADDR_GNRTD_ID";
42          String fromName = " FROM pur_vndr_dtl_t dtl";
43          String name = filter("dtl.VNDR_NM", "., ");
44          String eplsName = filter("excl.VNDR_EXCL_NM", "., ");
45          String onName = " ON " + compare(name, eplsName, false); 
46          String sqlName = selectName + fromName + joinExcl + onName + where;
47  
48          String selectAlias = "SELECT als.VNDR_HDR_GNRTD_ID, als.VNDR_DTL_ASND_ID, " + eplsFields + " , 0 VNDR_ADDR_GNRTD_ID";
49          String fromAlias = " FROM pur_vndr_alias_t als";
50          String onAlsDtl = " ON als.VNDR_HDR_GNRTD_ID = dtl.VNDR_HDR_GNRTD_ID AND als.VNDR_DTL_ASND_ID = dtl.VNDR_DTL_ASND_ID";
51          String alias = filter("als.VNDR_ALIAS_NM", "., ");
52          String eplsAlias = filter("excl.VNDR_EXCL_NM", "., ");
53          String onAlias = " ON " + compare(alias, eplsAlias, false); 
54          String sqlAlias = selectAlias + fromAlias + joinDtl + onAlsDtl + joinExcl + onAlias + where;
55  
56          String selectAddr = "SELECT addr.VNDR_HDR_GNRTD_ID, addr.VNDR_DTL_ASND_ID, " + eplsFields + " , addr.VNDR_ADDR_GNRTD_ID";
57          String fromAddr = " FROM pur_vndr_addr_t addr";
58          String onAddrDtl = " ON addr.VNDR_HDR_GNRTD_ID = dtl.VNDR_HDR_GNRTD_ID AND addr.VNDR_DTL_ASND_ID = dtl.VNDR_DTL_ASND_ID";
59          
60          String addr1 = filter("addr.VNDR_LN1_ADDR", ".,# ");
61          String eplsAddr1 = filter("excl.VNDR_EXCL_LN1_ADDR", ".,# ");
62          String cmpAddr1 = compare(addr1, eplsAddr1, true); 
63          
64          String city = filter("addr.VNDR_CTY_NM", "., ");
65          String eplsCity = filter("excl.VNDR_EXCL_CTY_NM", "., ");
66          String cmpCity = compare(city, eplsCity, false); 
67          
68          String state = "upper(addr.VNDR_ST_CD)";
69          String eplsState = "upper(excl.VNDR_EXCL_ST_CD)";
70          String cmpState = compare(state, eplsState, false); 
71          
72          String zip = filter("addr.VNDR_ZIP_CD", "-");
73          String eplsZip = filter("excl.VNDR_EXCL_ZIP_CD", "-");
74          String cmpZip = compare(zip, eplsZip, false); 
75          String fullZip = "length(addr.VNDR_ZIP_CD) > 5";
76          
77          String onAddr = " ON (" + cmpAddr1 + " OR " + cmpZip + " AND " + fullZip + ") AND " + cmpCity + " AND " + cmpState;
78          String sqlAddr = selectAddr + fromAddr + joinDtl + onAddrDtl + joinExcl + onAddr + where;
79  
80          String max = ", MAX(VNDR_ADDR_GNRTD_ID)";
81          String selectFields = "VNDR_HDR_GNRTD_ID, VNDR_DTL_ASND_ID, VNDR_EXCL_ID, VNDR_EXCL_LOAD_DT, VNDR_EXCL_NM, VNDR_EXCL_LN1_ADDR, VNDR_EXCL_LN2_ADDR, VNDR_EXCL_CTY_NM" +
82                  ", VNDR_EXCL_ST_CD, VNDR_EXCL_PRVN_NM, VNDR_EXCL_ZIP_CD, VNDR_EXCL_OTHR_NM, VNDR_EXCL_DESC_TXT";
83          String select = "SELECT " + selectFields + max;
84          String subqr = sqlName + " UNION " + sqlAlias + " UNION " + sqlAddr;
85          String from = " FROM (" + subqr + ")";
86          String group = " GROUP BY " + selectFields;
87          String sql = select + from + group;
88  
89  
90          List<DebarredVendorMatch> matches = new ArrayList<DebarredVendorMatch>();
91          try {
92              SqlRowSet rs = getJdbcTemplate().queryForRowSet(sql);
93              DebarredVendorMatch match;
94  
95              while(rs.next()) {
96                  match = new DebarredVendorMatch();
97                  match.setVendorHeaderGeneratedIdentifier(new Integer(rs.getInt(1)));
98                  match.setVendorDetailAssignedIdentifier(new Integer(rs.getInt(2)));
99                  match.setLoadDate(rs.getDate(4));
100                 match.setName(rs.getString(5));
101                 match.setAddress1(rs.getString(6));
102                 match.setAddress2(rs.getString(7));
103                 match.setCity(rs.getString(8));
104                 match.setState(rs.getString(9));
105                 match.setProvince(rs.getString(10));
106                 match.setZip(rs.getString(11));
107                 match.setAliases(rs.getString(12));
108                 match.setDescription(rs.getString(13));
109                 match.setAddressGeneratedId(rs.getLong(14));
110                 
111                 if (match.getAddressGeneratedId() == 0) {
112                     match.setAddressGeneratedId(getMatchAddressId(match));
113                 }
114 
115                 DebarredVendorMatch oldMatch = debarredVendorMatchDao.getPreviousVendorExcludeConfirmation(match);
116                 if (oldMatch == null) {
117                     
118                     match.setConfirmStatusCode("U"); 
119                     matches.add(match);
120                 }
121             }
122         } catch (Exception e) {
123             
124             throw new RuntimeException(e);
125         }
126 
127         return matches;
128     }
129 
130     
131 
132 
133 
134 
135     protected long getMatchAddressId(DebarredVendorMatch match) {
136         long bestid = 0;
137         long defaultId = 0;
138         int maxPriority = 0;
139         List<VendorAddress> addresses = vendorService.getVendorDetail(match.getVendorHeaderGeneratedIdentifier(),
140                 match.getVendorDetailAssignedIdentifier()).getVendorAddresses();
141         if (addresses == null ) {
142             return bestid;
143         }
144 
145         for (VendorAddress address : addresses) {
146             if (address.isVendorDefaultAddressIndicator()) {
147                 defaultId = address.getVendorAddressGeneratedIdentifier();
148             }
149             
150             int priority = 0;
151             String vendorAddr1 = StringUtils.replaceChars(address.getVendorLine1Address(), ".,# ", "");
152             String eplsAddr1 = StringUtils.replaceChars(match.getAddress1(), ".,# ", "");
153             if (StringUtils.equalsIgnoreCase(vendorAddr1, eplsAddr1)) {
154                 priority++;
155             }
156             String vendorCity = StringUtils.replaceChars(address.getVendorCityName(), "., ", "");
157             String eplsCity = StringUtils.replaceChars(match.getCity(), "., ", "");
158             if (StringUtils.equalsIgnoreCase(vendorCity, eplsCity)) {
159                 priority++;
160             }
161             if (StringUtils.equalsIgnoreCase(address.getVendorStateCode(), match.getState())) {
162                 priority++;
163             }
164             String vendorZip = StringUtils.substring(address.getVendorZipCode(), 0, 5);
165             String eplsZip = StringUtils.substring(match.getZip(), 0, 5);
166             if (StringUtils.equals(vendorZip, eplsZip)) {
167                 priority++;
168             }
169             if (priority >= maxPriority) {
170                 bestid = address.getVendorAddressGeneratedIdentifier();
171                 maxPriority = priority;
172             }
173         }
174         if (bestid == 0) {
175             bestid = defaultId;
176         }
177         return bestid;
178     }
179 
180     protected String filter(String field, String charset) {
181         
182         String upper = "upper(" + field + ")";
183         if (charset == null)
184             return upper;
185 
186         
187         String replace = upper;
188         char[] chararr = charset.toCharArray();
189         for (char ch : chararr) {
190             
191             replace = "replace(" + replace + ", '" + ch + "', '')";
192         }
193         return replace;
194     }
195 
196     protected String compare(String fieldl, String fieldr, boolean useLike) {
197         String cmpstr = "";
198 
199         
200         String notnulll = fieldl + " IS NOT NULL";
201         String notnullr = fieldr + " IS NOT NULL";
202 
203         if (useLike) {
204             
205             String like1 = notnullr + " AND " + fieldl + " LIKE '%'||" + fieldr + "||'%'";
206             String like2 = notnulll + " AND " + fieldr + " LIKE '%'||" + fieldl + "||'%'";
207             cmpstr += "(" + like1 + " OR " + like2 + ")"; 
208         }
209         else {
210             
211             cmpstr = notnulll + " AND " + fieldl + " = " + fieldr;
212         }
213 
214         return cmpstr;
215     }
216 
217     
218 
219 
220 
221     public VendorService getVendorService() {
222         return vendorService;
223     }
224 
225     
226 
227 
228 
229     public void setVendorService(VendorService vendorService) {
230         this.vendorService = vendorService;
231     }
232 
233     
234 
235 
236 
237     public DebarredVendorMatchDao getDebarredVendorMatchDao() {
238         return debarredVendorMatchDao;
239     }
240 
241     
242 
243 
244 
245     public void setDebarredVendorMatchDao(DebarredVendorMatchDao debarredVendorMatchDao) {
246         this.debarredVendorMatchDao = debarredVendorMatchDao;
247     }
248 
249 }