Проверка по таблице адресов массовой регистрации

Автор:tema
Дата:19.10.2016
Просмотров:2757
Скачиваний:505
Оценка: - , Оценок - 0
Скачать (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 файла. Если дата-время файла больше значения настройки, то происходмит загрузка и значение обновляется. При штатной работе вмешательство не требуется.


Текст примера

 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