ОКВЭД -> ОКВЭД2

Автор:tema
Дата:25.09.2016
Просмотров:1982
Скачиваний:473
Оценка:, Оценок - 1
Скачать (zip-файл; Размер - 51391)

Обсудить в форуме

Описание

Класс для преобразования ОКВЭД в ОКВЭД2.
Основой служат ключи, которые надо скачать с сайта Минфина
http://economy.gov.ru/minec/activity/sections/classificators
Файл ключей надо сохранить в открытом формате ods или xlsx
Путь по умолчанию Import\OKVED\ОКВЭД_ОКВЭД2.xlsx

В архиве вспомогательные макросы, включаемве через import и таблица ОКВЭД2 из К+

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

 import "okved_cnv_class.mac";

var fClient=TBFile("client.dbt","R",0,null,"bank.def");
var cnv=TOkvedConverter();

while(fClient.Next)
    cnv.ProcessClient(fClient.rec.Client);
end;

[Клиентов у котрых код ОКВЭД2 уже установлен                    ######](cnv.cntYet2);
[Клиентов у котрых нет кодов ОКВЭД                              ######](cnv.cntClientNoOkved);
[Клиентов у котрых коды ОКВЭД2 установлен на основе кодов ОКВЭД ######](cnv.cntClientCnv);
[Всего установлено категорий (кодов ОКВЭД2)                     ######](cnv.cntCtgSet);

//// okved_cnv_class.mac:
import CtgInter, ClnInter;
IMPORT "odsimportclass.mac";
import "boostbmp.d32";

Class TOkvedConverter
    private var ClientID;
    var aOkvedCnvTable=TAssArraySO;
    var operDate={curdate};
    var cntYet2=0;
    var cntClientCnv=0;
    var cntClientNoOkved=0;
    var cntCtgSet=0;

    private macro ImportOkvedCnvTable
              var objImport=ODSImport();
              objImport.ForceString=true;
              objImport.strAppName="OKVED OKVED2 KEY";
              objImport.SkipTopRow=2;
              var aXlsTable=objImport.GetTable("..\\Import\\OKVED\\ОКВЭД_ОКВЭД2.xlsx");
              if((ValType(aXlsTable) == V_GENOBJ) and IsEqClass("TArray", aXlsTable) and (aXlsTable.Size>0))
                  var a;
                  var okved1, okved2;
                  var aObj;
                  for (a,aXlsTable)
                      if (ValType(a[0])!=V_UNDEF)
                          okved1=a[0];
                      end;
                      okved2=a[2];
                      aObj=aOkvedCnvTable.Get(okved1);
                      if (ValType(aObj)==V_UNDEF)
                          aObj=GenObject("TARRAY");
                          aOkvedCnvTable.Insert(okved1,aObj);
                      end;
                      aObj[aObj.Size]=okved2;
                      //PrintLN(okved1,"\t",okved2);
                  end;
              end;
    end; //macro 

    /*-----------------------------------------------------------------------*/
    private macro SetOkved2(v)

        if ((ValType(v)==V_STRING) and (trim(v)==""))
            return;
        end;

        if (SetCtgVal(OBJTYPE_CLIENT, 397, GetClientId(ClientID), v, operDate))
            cntCtgSet=cntCtgSet+1;
        else
            PrintLn("Клиент "+ClientID+". "+"Ошибка установки категории 397 (ОКВЭД2) в значение ["+v+"]");
        end;
    end; /* macro SetCtg */

    /*-----------------------------------------------------------------------*/

    macro ConvertOkved(okved1)
        var okved2=aOkvedCnvTable.Get(okved1);
        if (ValType(okved2)==V_UNDEF)
            PrintLn("Клиент "+ClientID+". "+"Не найдены соответствия для ОКВЭД "+okved1);
        else
            //PrintLn(Implode(okved2));
            return okved2;
        end;
    end;

    /*-----------------------------------------------------------------------*/

    private macro GetClientCtg(iCtgId)
       var aVal=TArray();
       if (GetCtgVal (OBJTYPE_CLIENT, 
                    iCtgId, 
                    GetClientId(ClientID),
                    aVal
                    ))
            return aVal;
        else
            return null;
        end;
    end; /* macro GetClientCtg */

    /*-----------------------------------------------------------------------*/

    macro ProcessClient(ClientID_)
        var elem;

        if ((ValType(ClientID_)==V_UNDEF) or (ClientID_==0))
            return;
        end;
        ClientID=ClientID_;


        var aOkved=GetClientCtg(397);
        if ((ValType(aOkved)==V_UNDEF) or (aOkved.Size==0))
            aOkved=TArray();
            var aOkved1=GetClientCtg(301);
            var a2, elem2;
            if ((ValType(aOkved1)==V_GENOBJ) and (aOkved1.Size>0))
                for (elem, aOkved1)
                    a2=COnvertOkved(elem);
                    if (ValType(a2)==V_GENOBJ)
                        for (elem2, a2)
                            aOkved[aOkved.Size]=elem2;
                        end;
                    end;
                end;

                var aOkvedUnique=TAssArrayS();

                for (elem, aOkved)
                    if ((ValType(elem)==V_UNDEF) or (elem==""))
                    elif (aOkvedUnique.Exist(elem)) //защита от задвоения
                        //PrintLn("Skip "+elem);
                    else
                        SetOkved2(elem);
                        aOkvedUnique.Insert(elem);
                    end;
                end;

                if (aOkved.Size>0)
                    cntClientCnv=cntClientCnv+1;
                end;
            else
                cntClientNoOkved=cntClientNoOkved+1;
            end;
        else
            cntYet2=cntYet2+1;
        end;
    end;

    ImportOkvedCnvTable();

end;