Проверка по таблице адресов массовой регистрации
Скачать (zip-файл; Размер - 297595)Обсудить в форуме
Описание
(в архиве класс, пример, документация, зависимости)
Адреса массовой регистрации
Макросы:
massaddr_class_free.mac — библиотека для работы с адресами массовой регистрации, содержит основную логику
massaddr_free_check.mac — рабочий пример, проверяет всех клиентов ЮЛ
Завсисимости библиотеки:
DLM
* boostre
RSL
* regcls
* odsimportclass
Таблицы
* massaddr.dbt из massaddr.def
Класс TMassAddrParserFree
Методы
Конструктор
Конструктор не имеет параметров. В конструкторе проверяется актуальность данных, если xls-файл новее, то происходит его загрузка в таблицу.
CompareAddr
CompareAddr(record_client_addr) проверяет адрес, записанный в структуру на соответствие адресам массовой регистрации. Возвращает true или false
Применение
Скачать xls файл со страницы Адреса указанные при государственной регистрации в качестве места нахождения несколькими юридическими лицами. Требуется ввести капчу.
Положить в каталог указанный в настройках. Импорт произойдёт автоматически при первом применении.
Пример
var arAdr=TArray(), adr;
GetClientAddresses (ClientID,arAdr);
for(adr,arAdr)
if(p.CompareAddr(adr.rec))
MsgBox("Обнаружен адрес массовой регистрации");
break;
end;
end;
Настройки
MyBank.ini
Настройка
Текущее значение
Описание
MASSADDR_FILE
..\Import\addrfind.xlsx
Путь и имя файла, скачиваемого с сайта налоговой
Реестр
USER_MAC\АДРЕСА МАССОВОЙ РЕГИСТРАЦИИ\LAST FILE DATE
Для пользователя 0 здесь сохраняется дата-время последнего загруженного xlsx файла. Если дата-время файла больше значения настройки, то происходмит загрузка и значение обновляется. При штатной работе вмешательство не требуется.
Адреса массовой регистрации
Макросы:
massaddr_class_free.mac — библиотека для работы с адресами массовой регистрации, содержит основную логику
massaddr_free_check.mac — рабочий пример, проверяет всех клиентов ЮЛ
Завсисимости библиотеки:
DLM
* boostre
RSL
* regcls
* odsimportclass
Таблицы
* massaddr.dbt из massaddr.def
Класс TMassAddrParserFree
Методы
Конструктор
Конструктор не имеет параметров. В конструкторе проверяется актуальность данных, если xls-файл новее, то происходит его загрузка в таблицу.
CompareAddr
CompareAddr(record_client_addr) проверяет адрес, записанный в структуру на соответствие адресам массовой регистрации. Возвращает true или false
Применение
Скачать xls файл со страницы Адреса указанные при государственной регистрации в качестве места нахождения несколькими юридическими лицами. Требуется ввести капчу.
Положить в каталог указанный в настройках. Импорт произойдёт автоматически при первом применении.
Пример
var arAdr=TArray(), adr;
GetClientAddresses (ClientID,arAdr);
for(adr,arAdr)
if(p.CompareAddr(adr.rec))
MsgBox("Обнаружен адрес массовой регистрации");
break;
end;
end;
Настройки
MyBank.ini
Настройка
Текущее значение
Описание
MASSADDR_FILE
..\Import\addrfind.xlsx
Путь и имя файла, скачиваемого с сайта налоговой
Реестр
USER_MAC\АДРЕСА МАССОВОЙ РЕГИСТРАЦИИ\LAST FILE DATE
Для пользователя 0 здесь сохраняется дата-время последнего загруженного xlsx файла. Если дата-время файла больше значения настройки, то происходмит загрузка и значение обновляется. При штатной работе вмешательство не требуется.
Текст примера
IMPORT "odsimportclass.mac"; import boostre; import ClnInter; import regcls; class TMassAddrParserFree var rAddr = TRecHandler("address.dbt", "bank.def"); var fSNP = TBFile ("snp.dbt", "R", 3, "snp.dbt", "bank.def"); var fSocr = TBFile ("clsdata.dbt", "R", 1, "clsdata.dbt", "bank.def"); var iElem=0; var addr_arr=TArray(); var aPart2pref=TArray(); aPart2pref[0]="дом (владение)"; aPart2pref[1]="корпус (строение)"; aPart2pref[2]="квартира (офис)"; var HBA:TArray; var fMassAddr; var CompareType; var str_num; var srcFilePath=GetIniString ("MASSADDR_FILE", "mybank.ini");// "..\\Import\\addrfind.xlsx"; /* Разделение строки */ private MACRO split(s:string,delim):TArray var part :TArray = TArray(), pos :integer, delim_len:integer; if (ValType(delim)==V_UNDEF) delim=","; end; delim_len = StrLen(delim); part.size = 0; if(not s) part.Value(part.Size) = ""; else while(s) pos = Index(s, delim); if(pos > 0) part.Value(part.Size) = SubStr(s, 1, pos-1); s = SubStr(s, pos+delim_len); if(not s) part.Value(part.Size) = ""; end; else part.Value(part.Size) = s; s = ""; end; end; end; return part; end; macro rec2key(r) var delim=","; return StrUpr( String(Int(r.Region):o:2) +delim+r.AreaKind +delim+r.Area +delim+r.CityKind +delim+r.City +delim+r.Place +delim+r.Settlement +delim+r.StreetKind +delim+r.Street); end; macro ProcessAddr(sAddr) var addr_elem:Tarray; const delim = ","; const дом_владение="дом (владение)"; addr_arr.Size=0; iElem=0; HBA=TArray(); HBA[0]=HBA[1]=HBA[2]=""; var Region /* = addr_arr(0)*/; var Area = ""; //1 var City = ""; //2 var Place = ""; var Street = ""; var House = ""; //дом var Building = ""; //корпус var Apartment = ""; //офис macro CreateFileW() fMassAddr = TBFile("massaddr.dbt", "WP+", 0, null, "massaddr.def"); end; private MACRO re_split(s:string):TArray var aMatch=TArray(); var strErr:String; var r= boostre_match_2("\\s*([^,]+)", s, strErr, aMatch, "a"); var a; var ret=TArray(); for(a, aMatch) ret[ret.Size]=a[1]; end; return ret; end; macro SplitElem(s, s1:@String, s2:@String) var i; s1=s2=""; for (i,StrLen(s),1,-1) if (SubStr(s,i,1)==" ") s1=SubStr(s,1,i-1); s2=SubStr(s,i+1); return; end; end; end; /* macro SplitElem(s, s1:@String, s2:@String) var aMatch=TArray(); var strErr:String; var i; s1=s2=""; if (boostre_match("\\b(.+)\\b\\s+([^ ]+)", s, strErr, aMatch)>0) s1=aMatch[1]; s2=aMatch[2]; end; DebugBreak; end; */ macro rec2val(r) return r.House +"\t"+r.Building +"\t"+r.Apartment; end; macro val2arr(s) var aMatch=TArray(); var strErr:String; var a1=split(s,"\t"); var elem, a2=TArray(); var i; for (i,0,2) a2[i]=split(a1," "); end; end; macro GetAddrElem(iLevel) if (iElem>=addr_arr.Size) return false; end; var Main:String,Part:String; var sElem=addr_arr(iElem); //else SplitElem(sElem, @Main, @Part); fSNP.rec.Level = iLevel; fSNP.rec.Name = Main; var ok=fSNP.GetEQ; if (not ok) //PrintLn("Не шашли сокращения для "+Part +" ("+fSNP.rec.SocrID+")"); return true; end; while(ok and (StrUpr(fSNP.rec.Name)== StrUpr(Main))) fSocr.rec.ClsID = 40; fSocr.rec.RecID = fSNP.rec.SocrID; if (fSocr.GetEQ()) if ((StrUpr(Part)==StrUpr(fSocr.rec.Code)) or (StrUpr(Part)==StrUpr(fSocr.rec.Name))) //Ура! if (2==iLevel) rAddr.rec.Region = fSNP.rec.Code; elif (3==iLevel) rAddr.rec.AreaKind = fSocr.rec.Code; rAddr.rec.Area = fSNP.rec.Name; elif (4==iLevel) rAddr.rec.CityKind = fSocr.rec.Code; rAddr.rec.City = fSNP.rec.Name; elif (5==iLevel) rAddr.rec.Place = fSocr.rec.Code; rAddr.rec.Settlement = fSNP.rec.Name; elif (6==iLevel) rAddr.rec.StreetKind = fSocr.rec.Code; rAddr.rec.Street = fSNP.rec.Name; else DebugBreak(); end; iElem=iElem+1; return true; end; end; ok=fSNP.Next; end; return true; //end; end; //macro GetAddrElem macro GetAddElem2(s,iLevel) var i; for (i,0,2) if(aPart2pref[i]==SubStr(s,1,StrLen(aPart2pref[i]))) HBA[i]=Trim(SubStr(s,StrLen(aPart2pref[i])+2)); if (0==i) HBA[i]=boostre_replace("\\bД (\\d+)","$1",HBA[i]); HBA[i]=boostre_replace("(\\d+) /(\\d+)","$1/$2",HBA[i]); HBA[i]=boostre_replace("(\\d+) ([А-Я])","$1$2",HBA[i]); end; break; end; end; end; //------------------- ClearRecord(rAddr); var ip2=Index(sAddr,", "+дом_владение); if (ip2>0) var sAddrPart1=SubStr(sAddr, 1,ip2-1); //addr_arr = split(sAddrPart1, delim); addr_arr = re_split(sAddrPart1); var r; var iLevel=1; for (iLevel,2,6) if (not GetAddrElem(iLevel)) break; end; end; var aPart2=re_split(SubStr(sAddr, ip2+2)); for (iLevel,0,aPart2.size-1,1) GetAddElem2(aPart2[iLevel],iLevel); end; rAddr.rec.House = HBA[0]; //дом rAddr.rec.Building = HBA[1]; //корпус rAddr.rec.Apartment = HBA[2]; //офис if (ValType(fMassAddr)==V_UNDEF) CreateFileW(); end; fMassAddr.rec.FromRegionToStreet=rec2key(rAddr.rec); fMassAddr.rec.House = StrUpr(HBA[0]); //дом fMassAddr.rec.Building = StrUpr(HBA[1]); //корпус fMassAddr.rec.Apartment = StrUpr(HBA[2]); //офис fMassAddr.rec.XlsStrNum = Int(str_num); fMassAddr.InSert; else PrintLn("Не найдено ["+дом_владение+"] в адресе "+sAddr); end; end; //method macro CompareAddr(rca) var sKey=rec2key(rca); var sVal; CompareType=""; macro CheckArrayField(a,f) var i; if ((a.Size==0) and (""==f)) return 0; end; for(i,0,a.size-1,1) if (a[i]==StrUpr(f)) return i+1; end; end; return -1; end; if (ValType(fMassAddr)==V_UNDEF) fMassAddr = TBFile("massaddr.dbt", "R", 0, null, "derzhava.def"); end; fMassAddr.rec.FromRegionToStreet=sKey; var ok=fMassAddr.GetGE(); while (ok and (fMassAddr.rec.FromRegionToStreet==sKey)) //простое совпадение if ( (fMassAddr.rec.House == rca.House) and (((fMassAddr.rec.Building == rca.Building) and ("" == rca.Building2)) or ((fMassAddr.rec.Building == rca.Building2) and ("" == rca.Building))) and (fMassAddr.rec.Apartment == rca.Apartment) ) CompareType="простое совпадение"; return true; else var aHouse =split(fMassAddr.rec.House ," "); var aBuilding =split(fMassAddr.rec.Building ," "); var aApartment=split(fMassAddr.rec.Apartment," "); if ((aHouse.Size>1) or (aBuilding.Size>1) or (aApartment.Size>1)) var iHouse=CheckArrayField(aHouse,rca.House); if (iHouse>-1) if((""==fMassAddr.rec.Building) and (""==fMassAddr.rec.Apartment) and (""==rca.Building) and ("" == rca.Building2) and (""==rca.Apartment)) CompareType="совпадение дома из списка"; return true; end; if (iHouse==aHouse.Size) //последний дом var iBuilding=CheckArrayField(aBuilding,rca.Building); if (iBuilding>-1) if ((""==rca.Building2) and (fMassAddr.rec.Apartment==rca.Apartment)) CompareType="совпадение дома из списка и корпуса"; return true; end; if (iBuilding==aBuilding.Size) //последний корпус var iApartment=CheckArrayField(aApartment,rca.Apartment); if (iApartment>-1) CompareType="совпадение дома из списка и корпуса из списка"; return true; end; end; end; iBuilding=CheckArrayField(aBuilding,rca.Building2); if (iBuilding>-1) if ((""==rca.Building) and (fMassAddr.rec.Apartment==rca.Apartment)) CompareType="совпадение дома из списка и корпуса из списка и апартаментов"; return true; end; if (iBuilding==aBuilding.Size) //последний корпус iApartment=CheckArrayField(aApartment,rca.Apartment); if (iApartment>-1) CompareType="совпадение дома из списка и корпуса из списка и апартаментов из списка"; return true; end; end; end; elif ((aHouse.Size>1) and (iHouse<aHouse.Size)) // не последний дом if ((""==rca.Building) and ("" == rca.Building2) and (""==rca.Apartment)) CompareType="совпадение не последнего дома из списка"; return true; end; end; end; end; end; ok=fMassAddr.next(); end; return false; end; //macro CompareAddr macro GetCurrentRecord return fMassAddr.rec.FromRegionToStreet+"," +fMassAddr.rec.House +"," +fMassAddr.rec.Building +"," +fMassAddr.rec.Apartment end; macro ReadTable var cntLeft=0; var objImport=ODSImport(); objImport.ForceString=true; objImport.SkipTopRow=5; var aXlsTable=objImport.GetTable(srcFilePath); var row; var sAddr; //var oAddr; var iProgress=0; var timeSave=Time(); InitProgress(aXlsTable.Size(),null,"Преобразование таблицы адресов"); for (row, aXlsTable) sAddr =row[1]; str_num=row[0]; PrintLn(sAddr); ProcessAddr(sAddr); if (iElem!=addr_arr.size) PrintLn("адрес разобран не до конца"); cntLeft=cntLeft+1; end; UseProgress(iProgress); iProgress=iProgress+1; end; RemProgress(); PrintLN("Время парсинга: "+String(Time()-timeSave)); [недоразобрано #####](cntLeft); end; macro CheckFileDate var dt:date, tm:time; var reg=TReg("USER_MAC\\АДРЕСА МАССОВОЙ РЕГИСТРАЦИИ\\"); var lastDate=reg.Get("LAST FILE DATE","00000000 00:00:00"); if (GetFileInfo (srcFilePath, @dt, @tm)) var d=String(dt:f); d=SubStr(d,7,4)+SubStr(d,4,2)+SubStr(d,1,2); d=d+" "+String(tm); if (d>lastDate) ReadTable(); reg.Set("LAST FILE DATE",d,null,true); end; else msgbox("Не найден файл "+srcFilePath); end; end; // macro CheckFileDate //----- Конструктор CheckFileDate(); end; //class