+ All Categories
Home > Documents > CrefoPort web service access - Creditreform · iOS based devices. Large or medium size ... Service...

CrefoPort web service access - Creditreform · iOS based devices. Large or medium size ... Service...

Date post: 29-May-2018
Category:
Upload: dinhlien
View: 217 times
Download: 0 times
Share this document with a friend
65
CrefoPort web service access Creditreform, s.r.o. November 12, 2013
Transcript

CrefoPort web service access

Creditreform, s.r.o.

November 12, 2013

Contents

Introduction 4

CrefoPort Architecture 5

Use case scenarios . . . . . . . . . . . . . . . . . . . . . . 5

CrefoPort client application 7

CrefoPort manager service 8

Service access and security . . . . . . . . . . . . . . . . . . 9

Session management . . . . . . . . . . . . . . . . . . . . . 9

Company search . . . . . . . . . . . . . . . . . . . . . . . 10

Business reports . . . . . . . . . . . . . . . . . . . . . . . 13

Online delivery . . . . . . . . . . . . . . . . . . . . . 13

Offline delivery . . . . . . . . . . . . . . . . . . . . . 14

Suported formats . . . . . . . . . . . . . . . . . . . . 16

Orders management . . . . . . . . . . . . . . . . . . . . . 16

CRE support . . . . . . . . . . . . . . . . . . . . . . . . . 18

Debt collection management . . . . . . . . . . . . . . . . . 18

Marketing selections . . . . . . . . . . . . . . . . . . . . . 19

Monitoring . . . . . . . . . . . . . . . . . . . . . . . . . . 21

Further resources . . . . . . . . . . . . . . . . . . . . . . . 24

CrefoPort internal services 24

2

Datamodel service . . . . . . . . . . . . . . . . . . . . . . 24

Decision service . . . . . . . . . . . . . . . . . . . . . . . . 25

Risk Model service . . . . . . . . . . . . . . . . . . . . . . 27

Model development . . . . . . . . . . . . . . . . . . . 29

Calibration . . . . . . . . . . . . . . . . . . . . . . . 29

Construction of Creditreform solvency index . . . . . 31

Report generator service . . . . . . . . . . . . . . . . . . . 32

Frameworks and tools used . . . . . . . . . . . . . . . . . 34

CrefoPort network participation 34

CrefoPort Participation requirements . . . . . . . . . . . . 36

VVC BIGNet / mailbox integration 37

Appendix 37

XML schema in RNC format . . . . . . . . . . . . . . . . 37

XML schema in RNC format . . . . . . . . . . . . . . . . 45

Note this document may be considered confidential and shouldnot be freely distributed.

Introduction

CrefoPort is both distributed network of data provider servicesand client’s web application. Communication in the CrefoPortproviders network is based on SOAP based web service technology.CrefoPort provider interface is therefore implementation indepen-dent, free and open for all participants. Any participant who imple-ments CrefoPort interface becomes part of the provider’s networkand any customer, who has rights, can use its CrefoPort services.

CrefoPort client application implemented in Adobe Flex frame-work allowing an access to data providers of all CrefoPort networkparticipants in one place. CrefoPort client application is availablethree different forms: web application (in browser), standalone na-tive application (installable on Windows or Mac OS systems) andsimplified mobile application for Android, Blackbery OS and AppleiOS based devices.

Large or medium size organizations which becomes customer ofCrefoPort portal can integrate theirs own information systems withCrefoPort services using public and open CrefoPort web serviceinterface - the same which CrefoPort client application is using.This approach has advantage for these customers if they do notwant to use new application for accessing CrefoPort services butthey need to extend their own existing applications already in use.

The following services are now supported within CrefoPort:

• International business search of companies

• International business reports in various product lines, for-mats and languages

• Business data monitoring

• Debt collection management

• Marketing selections

4

This document describes the architecture of CrefoPort project, ap-plication programming interface (API) for data interchange for cus-tomers and API for Creditreform offices and their partners whichallows them to participate in the CrefoPort network.

CrefoPort Architecture

CrefoPort data provider is implemented as collection of SOAPbased services which cooperates to serve international productsfor CrefoPort customers. There are two kinds of services in eachCrefoPort data provider instance. Public interface accessible viaInternet for all local customers called CrefoManager service andCrefoPort internal services which is accessible only through VPNbetween CrefoPort network participants (for example Creditreformoffices in different countries).

CrefoPort architecture consists of distributed network of CrefoPortservice provider instances. There is no central point which all otherinstances depend on.

Use case scenarios

Lets suppose the customer’s information system needs to order areport about Creditreform company itself in XML. The followingsteps will lead to the result:

1. Open session in CrefoPort portal

2. Search for a Creditreform company

3. Select the target company from the received hitlist

4. Requests the list of available reports for the selected company

5. In case the online report is available - download it

5

Figure 1: CrefoPort instance architecture based on public Crefo-Port manager and internal services

6. If the desired online report is not available - sends an orderto do offline research for the target company

7. Close the session

Lets suppose a few offline orders have been made for companiesfor which an online report was not available at the time of request.Now it is time to check which reports are already available.

1. Open session in CrefoPort portal

2. Request the list of offline orders for a specific date/time range

3. Check which reports are already available

4. Download these reports from the archive

6

5. Close the session

Figure 2: CrefoPort use case - ordering foreign business reportproduct

CrefoPort client application

Each Crefoport instance has two main parts: web application clientand server. Crefoport client application is implemented in modernAdobe Flex framework. It has the following features:

• Runs flawlessly in all modern browsers.

• Can be installed also as native application on Microsoft Win-dows or Mac OS operating systems.

7

CrefoPort client application requires enabled internet access onstandard communication ports: 80 and 443 for flash plugin inbrowsers or on desktop computer if installed as standalone AdobeAir application.

For downloading and opening documents it also requires AdobeAcrobat Reader (or similar application for PDF files) and MicrosoftExcel (or any other application like Libre Office to open XLS files).

Figure 3: List of framework logos used in CrefoPort project

CrefoPort manager service

CrefoPort manager service is the only interface to consume Cre-foPort services for customers. It is publicly available on Internet.CrefoPort manager service has only two main purposes. One of

8

them is to provide authentication of the customers and to check ifcustomer has rights for requested service.

Second important task for CrefoPort manager service is to assem-ble responses to customer requests using private calls of internalCrefoPort services possible in different CrefoPort instances in othercountries or offices. For example when customer orders a businessreport from foreign country then two different internal datamodelservices are used - local and foreign - to register the business reportorder.

Service access and security

API is publicly exposed in the form of SOAP based web servicevia https transfer protocol. Almost all methods requires openedsession with valid sessionID.

SOAP based CrefoManager web service can be accessed from thefollowing form of URL:

https://www.crefoport.[country domain]/manager/cxf/ManagerService

Web service description is accessible via:

https://www.crefoport.[country domain]/manager/cxf/ManagerService?wsdl

All service requests are logged with IP of the requestor.

Session management

For calling most of the methods in the CrefoPort service SessionIDidentification is required as one parameter of the call.

To open a session use the following method:

Session openSession(String username,

9

String password,

String countryCode)

The list of possible country codes are in the appendix.

To get information about current session you can use the followingmethod:

Session getSessionInfo(String sessionId)

To close the session use the following method:

void closeSession(String sessionId)

Company search

Each country supports the full text search over the database ofcompanies. The current version of full text search is based on asingle query term however in next version also advanced searchcontaining different kinds of fields like company name, statisticalnr., zip code and city will be available.

To access the search engine the following two methods are availablein public CrefoPort manager service.

Result of the search. For support paging there is a web servicemethod searchCompaniesSize. This method is also for checkingof limit for search to protect possibility abuse. Search itself isrepresented with searchRequest which contains properties:

• advanceSearchActive - use false for simple search (if you wantto search by name or statistical nr. or crefo or registrationnr.) For extended search set this property to true

10

• searchNameGeneral - fill company name for simple searchor company name, statistical nr., crefo, registration for ex-tended search.

• city,zipCode, street, houseNr, phone, id (which means crefo),statisticalNr, vatNr, web, email (some bignet countries maynot allow some of this properties)

• legalForm, registerType, registerNr - (this properties are alowedonly in few bignet countries like DE, AT, LU

Note for extended search : In all bignet countries are also notavailable - vatNr and StatisticalNr.

Also if you search in extended search mode, you have to fill atleast one of ”must fields” which are - searchNameGeneral, vatNr,statisticalNr, id (which means crefo)

List<Company> searchCompanies(SearchRequest searchRequest,

String countryCode,

String langId,

String sessionId,

int from,

int size)

long searchCompaniesSize(String search,

String countryCode,

String sessionId)

These methods can be used for retrieving paged result set of thesearch. Search term can contain the part of the company’s nameor address or any local legal identification number.

Paging is controled by parameters from and size.

Search is requested in target country selected by countryCode pa-rameter. List of available countryCodes you can see appendix.

11

Result set contains basic information about the company includingaddress and even a few information about available informationsabout this company like:

• name

• street

• houseNr

• city

• zip

• phone

• email

• country

• statisticalNr - identification of the company in statisticaloffice registry

• registrationNr - identification of the company at court

• taxNr identification of the company in tax authority

• lastModDate - date of last modification of the data

• controlDate - date of last full research of the company

• lastBalanceDate - date of last available balance

• balanceCount - number of balances available

• crefo - unique Creditreform’s identification of the company

12

Business reports

Based on the search one or more companies are selected to re-trieve the business report for them. All business retrieval methodsrequires unique Creditreform identifier of the company which iscalled crefo. This identifier is part of the search result set.

For given company there can be available different products. Set ofavailable business report products can be obtained by the followingfunction call:

List<CustomerCrefoProduct> getCustomerCrefoProducts(

String crefo,

String sessionID

String langid,

String providerCountryCode,

String providerIsoCode)

Result set contains general information about available productslike productCrefoPortCode which can be used later for reportrequest, productName productSpeed particulary usefull for offline(individualy researched) products, product price properties: value,VATvalue, grossValue and currency.

Business reports can be requested and delivered in two possiblemodes: Online for immediate download and Offline ordered forindividualy made research.

Online delivery

Online delivery means that report is immediately available and canbe downloaded just after a business report request.

For Online delivery there is the following method available:

13

String generateReport(String reportId,

String crefo,

String langid,

String format,

String sessionId,

String refnr1,

String refnr2,

String comment,

String providerCountryCode,

String providerIsoCode)

• reportId is the unique identification of the product

• crefo is the Creditreform’s unique identification of the com-pany

• langid is report’s language identification, e.g. ’EN’, ’DE’,’SI’, ...

• format is one of the following values: ’PDF’, ’XML’

• sessionId is open session identification returned by openSession

method

• refnr1 and refnr2 are customer’s own identifications of theorder

• comment is arbitrary customer’s comment

This method synchronously generates the report and returns theURL of the generated report. Note if foreing report is requestedthen the URL is linked to foreign creditreform domain.

Offline delivery

Offline delivery order means that report is not ready to be immedi-ately downloaded and the company has to be further investigated

14

by Creditreform’s experienced researchers. In this case the order isjust sent to Creditreform and placed in the customer’s orders list.

The report can be download after it is researched through customerorder database. Customer has several ways how to be informedthat report is ready.

To request the offline research the following method has to be used:

String orderReportResearch(

String reportId,

Company company,

String providerCountryCode,

String providerCountryISO,

String langid,

String format,

String sessionId,

String refnr1,

String refnr2,

String comment,

byte[] attachedDocumentData)

• reportID is the unique identification of the product

• company structure contains all available information aboutrequested company

• langid is report’s language identification, e.g. ’EN’, ’DE’,’SI’, ...

• format is one of the following values: ’PDF’, ’XML’

• sessionId is open session identification returned by openSession

method

• refnr1 and refnr2 are customer’s own identifications of theorder

15

• comment is arbitrary customer’s comment

• attachedDocumentData contains any attachment as an inputfor the research

Note for this type of order it is not mandatory to know the Crefo

number. During individual research an attempt of company iden-tification based on the properties given is made.

The method returns unique identification of the order. This orderidentification can then be used for checking the state of the orderand downloading report when it is ready.

Suported formats

For report generation CrefoPort supports PDF file format com-monly used for printing the reports, XML reports for automaticprocessing to integrate CrefoPort report’s data into by Customer’sown information systems and TXT format having 80 charactersper each row from historical reasons.

XML format is described by the XML Schema in the appendix.

Orders management

All orders both online and offline and downloaded report are reg-istered and stored in the Creditreform’s internal database. Cus-tomer’s information system can at any time asks which offline or-ders are still active (research still in progress) or which is alreadydone. The following method is available for query the orders:

List<CustomerOrder> getCustomerCrefoOrders(

String sessionId,

CustomerOrdersCriteria criteria,

String langid)

16

• sessionId is open session identification returned by openSession

method

• criteria structure represents filter over customer orders likeorder dates, reference numbers, order id.

• langid is report’s language identification, e.g. ’EN’, ’DE’,’SI’, ...

Any report downloaded in past or report which was researched inoffline mode can be downloaded from Creditreform’s report storagewhen the report is created.

List<CustomerOrderDocument> getCustomerOrderDocuments(

String orderId,

String sessionId)

• sessionId is open session identification returned by openSession

method

• orderId is Creditreform’s unique identification of the cus-tomer’s order

CustomerOrderDocument structure contains amongs others: doc-ument unique url CrefoPort’s document store and type of thereport content mimeType.

For analysis purposes to generate a graph of customer orders intime there is the following method. Get statistical data aboutCrefoPort usage to be presented in bar chart graph.

List<AnalysisGraphData> getCustomerAnalysisGraphData(

String graphName,

String customerID,

String sessionId)

17

CRE support

There is the following method to support generating relation graphbetween companies which has some relationships.

String getCrefoRelations(

String crefo,

String sessionId,

String langid,

String providerCountryCode)

Debt collection management

Creditreform’s debt collection services cover the full process cycle -from timly reminders, to amicable and if necessary legal collectionor debt monitoring. They are adapted to the specific requirementsand processes of each local jurisdiction, market and industry toachieve the most effective results.

Nowadays customers can use CrefoPort manager service just tosend their new debt cases to be managed by the Creditreform office.

There is only one method available for that purpose:

void registerNewDebtCase(

DebtCase debtCase,

List<DebtInvoice> invoices,

String langid,

String sessionId)

Genearal data about the debt case is registered in debtCase struc-ture. Invoices for this debt case are send as a list in invoices

parameter.

18

Marketing selections

In times of growing competition it is increasingly difficult to attractnew customers. Risk management starts with selecting the rightcustomers.

Due to this CrefoPort offers a solution in selecting the right targetgroup of companies with top-quality business addresses of activeand solvency checked companies.

All marketing selections are stored in CrefoPort’s database for fur-ther use. Customers can generate marketing selection with samefine-tuned set of criteria more times to check and update theirmarketing portfolios. The method following method can be usedto save or update a marketing selection criteria:

void saveMarketingSelectionCriteria(

MarketingCriteria mc,

String sessionId)

MarketingCriteria structure contains general information suchas criteria selection id selectionID and marketing selection name

and also a set of selection criterions like turnover and employeeranges, set of activities, set of legal forms or a flag to deafalted orinactive companies.

List of registered marketing selections can be obtained by the fol-lowing call. Method for handling marketing selections. Retrievesall defined marketing selection criteria for the given user.

List<MarketingCriteria> getMarketingSelectionCriteria(

String sessionId,

String langid)

Marketing selection can be deleted by the following function:

19

void deleteMarketingSelectionCriteria(

MarketingCriteria mc

String sessionId)

Probably the most important function is used for generating mar-keting selection’s list of companies:

String generateMarketingSelectionWithSelectedItems(

String reportId,

MarketingCriteria criteria,

String countryCode,

String langid,

String format,

String sessionId,

String refnr1,

String refnr2,

String note,

List<ExportField> columns)

Where reportId is just a constant representing marketing selec-tion report: ‘‘marketingSelection’’. Parameter criteria rep-resents the criteria for the company selection. Note that the crite-ria do not need to be stored in the CrefoPort’s database. ParametercountryCode represents a CrefoPort’s code of country. In currentimplementation it must be code of country in which the CrefoMan-ager service is used. Parameter langid represents a language usedin generated report.

Result of the function call is unique URL which links to generatedreport file.

Note that currently only XLS format is supported. Generated XLSfile has two sheets. On first sheet it contains the list of selectedcompanies satisfying the given criteria and on the second sheetthere is the full set of active - used criterions.

20

Generated marketing selection report is stored in CrefoPort’s doc-ument store and any generated marketing selection can be laterdownloaded again through the marketing selection order archive.

The following two methods can be used to obtain paged list ofmarketing selections order by the customer:

List<MarketingSelectionOrder> getMarketingSelectionExports(

String langid,

String sessionID,

MarketingSelectionOrderCriteria criteria,

int from,

int size)

long getMarketingSelectionExportsCount(

String langid,

String sessionID,

MarketingSelectionOrderCriteria criteria)

Monitoring

Companies in monitoring service are organized into set of compa-nies called portfolios. Each customer can define its own portfoliosand set specific fields to be monitored.

Examples of monitored fields are changes in trade register, new bal-ance sheets, solvency index change or negative events however setof available fields for monitoring can be different in each CrefoPortcountry.

The following service manager’s method can be used to create newportfolio:

Portfolio addPortfolio(Portfolio portfolio, String sessionId)

21

Portfolio class contains basic data about created portfolio such asits name and type. To get list of available portfolio types usedwhen creating new portfolio.

List<CrefoDataType>

getPortfolioTypes(String sessionId,

String langid)

To get list of available payment experiences when adding new com-pany to portfolio.

List<CrefoDataType>

getPaymentExperienceTypes(String sessionId,

String langid)

When portfolio is registered it can be updated or deleted:

Portfolio updatePortfolio(Portfolio portfolio, String sessionId)

Portfolio deletePortfolio(Portfolio portfolio, String sessionId)

List of registered portfolios can be obtained via:

public List<Portfolio> getPortfolios(

Portfolio example,

String langid,

String sessionId)

Those methods above do not allow to add new companies to theportfolio for that purpose the following methods can be used.

To upload data given as byte array containing XLS format. Eachrow represents a company data to be added. Result of the call isurl for changed XLS file. Last added column in this file representsthe status of adding a company.

22

List<CompanyMonitor> uploadMonitoringPortfolioCompanies(

String sessionId,

String porfolioID,

byte[] excelFileData)

To add only one already identified company by unique crefo num-ber use the following method.

void addPortfolioCrefo(

Portfolio portfolio, @WebParam(name = "crefo") String crefo,

String sessionId)

To remove one already identified company by unique crefo numberuse the following method. Portfolio identified from portfolioId.

void removePortfolioCrefo(

String portfolioId,

String crefo,

String sessionId)

List of all companies registered in a given portfolio including thechanges can be obtained by the following method. PortfolioFilterstructure can contain various criteria to filterout the companies inthe result set. This structure includes also PortfolioID.

List<CompanyMonitor> getPortfolioCompanies(

PortfolioFilter filter,

String sessionId,

String langid,

int from,

int size)

Similar method can be used to obtain number of result set fromprevious method which is used for result set paging.

23

List<CompanyMonitor> getPortfolioCompaniesCount(

PortfolioFilter filter,

String sessionId,

String langid)

Get list of legal forms in given country in selected language forfilter purposes can be obtained by the following method.

List<CrefoDataType> getCountryLegalForms(

String countryCode,

String langid,

String sessionId)

Further resources

For further details about the methods used in the CrefoPort Webservice please check CrefoPort project JavaDoc.

CrefoPort internal services

This chapter is particulary important when new CrefoPort instanceis considered to be implmented in new country or office.

Datamodel service

Purpose of datamodel functions is to provide an abstraction overlocal data structure and database used. Datamodel functions aresupposed to be called in general from different parts of the Crefo-Port services at least from the client application through securedManagerService or from Report Generator service. There are alsooptinal services which can use datamodel abstraction layer like

24

credit risk and credit check services. Thus you can view the datamodel as a set of functions which provide common interface tosmall pieces of information which can be used in other CrefoPortservices.

There is no full blown XML file which can be used to retrieve thedata. Main reason for it is that from various services we need justfew data and it is not efficient to retrieve the whole XML datajust for these few information. Retrieving the data by atomic dataaccess functions seems to be more general because when needed(for example for XML CrefoPort report product) full XML datacan be easily generated using the data model functions. Althoughif you have already some full blown XML structure in which youcan transfer the data datamodel implementation can be preparedbased on this XML file which downloads and cache the full reportdata and then use it to provide the data in our ”atomic” way.

From the customer point of view there is XML report productwhich contains some of business data in XML form and there isalso XSD specification for this file however it is only a subset ofdata model set of functions - only data about companies used inbusiness report products.

The datamodel service is the only interface which must be imple-mented when new office wants to participate in CrefoPort network.When the office implements this interface the CrefoPort instancecan be started with only a few changes in the configuration.

The data model interface can be implemented for example in thelocal database via stored procedures / functions and then for exam-ple MyBatis framework can be used to map data to object model.

Decision service

Decision service is implemented as an expert system. The expertknowledge is formalized in first order predicate logic theory. Deci-

25

sion results are obtained by first order queries. Logic programminglanguage used is Prolog.

All data which is needed for decision is accessible through otherconnected services like Data Model service or Risk Index Modelservice.

Currently there is available an expert knowledge for SyntheticBonitats Index (known from Atradius project) and Quick Checkdecisions.

This service is Implemented as generic reusable service, i.e. lo-cal Creditreform office can reuse reference implementation of theservice and only can provide its own decision theory.

Example of bonitats index knowledge

% Defines subindices like: Business development,

% Business course, Payment experience, Credit Opinion.

% Main rating index is calculated as in InfoCIS

business_development(40) :- last_turnovers([T0,T1,T2]),

T0<T1, T1<T2.

credit_opinion(41) :- own_capital(OC),

company_capital(CC),

OC < 0.6*CC.

credit_opinion(11) :- payment_experience(PD),

business_development(BD),

business_course(BC),

PD =< 19, BC =< 29, BD =< 29,

own_capital(OC),

external_capital(EC),

OC > EC, has_current_balances.

Example of Quick check knowledge

26

% Note all data used in rules is requested from

% other services and thus can be synthetic

decision(green) :- bonitats_index(BI), BI < 250.

decision(yellow) :- credit_opinion(CR), 32 >= CR, CR >= 1.

decision(orange) :- last_balance(ratio(debt),DR), DR > 0.9

decision(orange) :- namirweb(paid,0), namirweb(closed,1).

decision(yellow).

Risk Model service

Risk model service exposes a scoring model built for predicting riskof bankruptcy in one year horizon for given participant’s country’seconomic environment.

The prediction of bankruptcy for companies has been extensivelyresearched area since late 60’s. There are many studies showinghow to predict the credit risk for a company based on its historicaldata. The techniques used have its background in statistic theory,artificial intelligence, data mining and machine learning. To listsome of them:

• Linear Discriminant Analysis (firstly introduced by Altmanin credit risk prediction),

• Logistic regression,

• Artificial Neural Networks based systems,

• Fuzzy Neural Systems,

• Decision trees and rules induction

27

• Random forests

• Instance based learning such as k-nearest neighbours,

• Support vector machines,

• Genetic algorithms and genetic programming,

• Hybrid approaches - combination of previously mentionedtechniques.

As follow from many different papers in credit risk field there isstill no model which is significantly and consitently better thanthe others in terms of discriminatory power. Researchers appliedmany techniques mentioned above in the credit risk field to foundthat many of them has similar potential.

Risk model used in the service has the following properties.

• Powerful model in discrimination positive and negative sam-ples.

• Method of risk calculation is well interpretable and transpar-ent for end users.

• Based on robust statistical theory.

• Does not tend to over fit the training data and fail out ofsample.

• Is already commonly used by rating agencies and banks ascommon standard verified method.

These features mentioned above suggest to use logistic regressionparticularly its generalization form called Generalized AdditiveModel (GAM for short).

28

Model development

Generalized additive model (GAM for short) is well interpretableand has good discrimination power and does not tend to over fit atraining data set. The complete model description and its use forbankruptcy prediction can be found in [?].

The GAM model has the following general form:

Φ

(n∑

i=1

fi(Xi)

)

where Φ : R→ <0, 1> is the well known logit link function, Xi, i ∈1..n are explanatory variables and fi : R→ R, i ∈ 1..n are derivedsmooth spline functions which model nonlinear ratio to bankruptcydependencies.

The result of the model calculation Φ(X1, ..., Xn) ∈ <0, 1> is anunadjusted probability of bankruptcy or risk score which dependson the selected statistical file of observations (training data set)used for model derivation.

Selected set of explanatory variables used in the model is supposedto be different in each country / environment / economy.

Calibration

We have now powerful model in terms of discrimination positiveand negative samples however result of model calculation - riskscore Φ(X1, ..., Xn) - can not be directly interpreted as a real prob-ability of default. One of the reasons is that the training data sethas usualy different positive to negative sample ratio than the ratiofound in real economic environment.

Thus the next step in modeling bankruptcy risk is model calibra-

29

Figure 4: Example of GINI curve in out of sample test of Russiamodel

tion. Isotonic regression [?] can be used for this purpose particu-larly PAV algorithm for mapping GAM risk score to real probabil-ities of bankruptcy. The procedure is as follows.

• Firstly we randomly select the data set to contain real ratioof positive / negative samples.

• Then we use isotonic regression over risk scores obtained fromthe GAM model to get nonparametric mapping from riskscore to real probabilities of default:

Ψ : <0, 1>→ <0, 1>

Now we can calculate real probability of bankruptcy for each com-pany where there are available all needed input variables X1, ..., Xn

as follows

30

Ψ (Φ (X1, ..., Xn))

Figure 5: Example of calibration function in Russia

Construction of Creditreform solvency index

Last step which is needed for using the model in Creditreform officeis to construct a Creditreform standardized solvency index. FromIBIX project we can get the mappings between real probability ofdefault / bankruptcy and Creditreform standard solvency indexscale. For example the following mapping can be used:

PD 0.000 0.003 0.007 0.015 0.030 0.080 1.000

Solvency index 100 174 220 260 307 366 499

31

Now spline interpolation for the points above can be used to obtainnonparametric mapping

Θ : <0, 1>→ <100, 499>

from probabilities of default / bankruptcy to Creditreform’s stan-dardized solvency index.

Finally Creditreform solvency index has been constructed by com-position of all already defined mappings as follows:

Θ (Ψ (Φ (X1, ..., Xn)))

Report generator service

Report generator is flexible service which can be fully reused inother Creditreform offices as is. Reports are based on simple opentemplate language (see Freemarker template engine project formore details).

Each tuple (product, format) has its own template definition.

All the data which is needed for report generation are requestedthrough other services partially the data model service.

Product templates which is already available:

• Basic information report

• Quick check decision report

• Full synthetic report

Template engine itself generates text outputs. These texts canbe interpreted in several ways. For example processed by LATEXtogenerate PDF files (including various graph inserted into it), loaded

32

Figure 6: First two pages of eReport product

into excel as CSV format or processed by other information systemsas XML file. Currently the following formats are supported asbusiness report output:

• XML - fully structured - for further handling by customer’sown information system

• PDF - for printing - typesetting is done by LaTeX

• TXT - formated text report 80 columns wide - due to histor-ical reasons

This service is Implemented as generic reusable service, i.e. lo-cal Creditreform office can reuse reference implementation of the

33

service and only configuration of data sources is needed.

Example of the template which integrates several other services fordata retrieval follows:

<#assign company=dmal.getCompany(crefo,langid)>

<#assign addresses=dmal.getRepresentativeAddress(crefo,langid)>

<#assign rc=risk.getRiskClass(crefo,langid)>

<company name="${company.name}" riskClass="${rc.index}"

riskClassName="${rc.name}">

<#list addresses as address>

<address street="${address.street}" .../>

</#list>

</company>

This template can generate the following XML output:

<company name="Idea, ltd."

riskClass="1"

riskClassName="Very risky">

<address street= "Shiran tower 4" .../>

</company>

Note the variable dmal represents Data Model Abstraction serviceand the variable risk represents Risk Index Model service

Frameworks and tools used

CrefoPort network participation

Each CrefoPort instance is simply a set of SOAP based web serviceswhich are connected together. Each of these web services can be

34

Figure 7: List of framework logos used in CrefoPort project

implemented in any programming language or framework whichyou prefer or use in your office.

The simplest way how new participants can connect to CrefoPortnetwork is by reusing almost all CrefoPort services except the data-model service which need to be implemented on the participantsite.

Datamodel service provides abstraction over country or office spe-cific data structure. Datamodel service provides common unifiedinterface used by other CrefoPort services. Datamodel service co-tains the following functional categories:

• Authentication

• Business report data access

• Marketing selection support

• Monitoring support

All other services which are used now in CrefoPort can be reused.

35

It means we can just install and configure them. There is no re-quirement to maintain or develop these CrefoPort services.

Datamodel service can be implemented in any programming lan-guage in which SOAP based web services can be build. Fur-thermore CrefoPort network participant can decide to provide re-stricted access to the database with only rights to execute somespecific (possibly newly added) stored procedures which will pro-vide the data needed in the datamodel service then the existingCrefoPort datamodel can be used and only configured to use thesestored procedures.

Although in case of need any other internal CrefoPort service canbe reimplemented because all required CrefoPort services are im-plemented as SOAP based services.

CrefoPort Participation requirements

• Order a domain like crefoport.it

• Buy a ”server” (note this can be today’s average computerwith at least two hard drives with same capacity to buildSW RAID 1 disk array - no real enterprise server is neededand at least 2 GB of RAM) and install debian linux on it. Ifyou already have a linux server it could be used but I wouldrecommend to install to new server.

• Install CrefoPort instance services on the linux server.

• Setup DNS at your internet connection provider and internalfirewall rules to forward HTTPS requests to www.crefoport.itto the new linux server

• Configure VPN connections to other countries which youwant to cooperate with.

• Implement datamodel service over your own data structureand database as described above.

36

VVC BIGNet / mailbox integration

Current version of CrefoPort integrates all VVC countries. Tech-nicaly there are two classes of providers: CrefoPort native providerand VVC WebService based provider.

CrefoPort provider contains full functionality including companysearch, business reports, debt collection, marketing and monitor-ing.

VVC Webservice nowadays can be used only for company searchand downloading and ordering business report. VVC business re-ports are now generated remotely however in next version of Cre-foPort structured company data in XML format will be used togenerate standard PDF reports also for VVC based countries.

Appendix

XML schema in RNC format

default namespace = ""

start =

element company {

attribute crefoid { xsd:integer },

attribute legalFormText { text },

attribute registration { text },

attribute registrationNr { text },

attribute statisticalNr { text },

attribute status { text },

attribute taxNr { text },

element identifiers { t_identifier* },

element names { t_name* },

element activities { t_activity* },

37

element addresses { t_address* },

element contacts { t_contact* },

element economicSituation {

element ratings { t_index* },

t_credit_limit},

element banks { t_bank* },

element capitals { t_capital* },

element employees { t_employee* },

element employeesConsolidated { t_employee* },

element owners { t_owner* },

element leaders { t_leader* },

element subsidiaries { t_subsidiary* },

element events { t_event* },

element exports { t_country_amount* },

element imports { t_country_amount* },

element profits { t_profit* },

element registrations { t_registration* },

element turnovers { t_turnover* },

element turnoversConsolidated { t_turnover* },

element financials { t_financial_set* },

element financialRatios { t_ratio_set* },

element freetexts { t_chapter* },

element standardttexts { t_chapter* },

element executions { t_execution* }

}

## -------------------------------------------------------------

t_activity =

element activity {

attribute activityClass { text },

attribute activityID { xsd:integer },

attribute description { text },

attribute mainActivity { "0" | "1" },

attribute validFrom { xsd:date | empty },

38

attribute validUntil { xsd:date | empty }

}

t_index =

element index {

attribute indexName { text },

attribute indexValueText { text },

attribute indexValue { text }

}

t_identifier =

element identifier {

attribute identifierTypeCode { text },

attribute identifierTypeText { text },

attribute identifier { text },

attribute validFrom { xsd:date | empty },

attribute validUntil { xsd:date | empty }

}

t_address =

element address {

attribute addressTypeCode { text },

attribute addressTypeText { text },

attribute city { text },

attribute countryISO { text },

attribute countryText { text },

attribute description { text },

attribute door { text },

attribute floor { text },

attribute houseNr { text },

attribute street { text },

attribute validFrom { text },

attribute validUntil { text },

attribute zipCode { text }

}

39

t_contact =

element contact {

attribute contactID { text },

attribute contactTypeCode { text },

attribute contactTypeText { text },

attribute contact { text },

attribute mainContact { "0" | "1" },

attribute description { text },

attribute validFrom { xsd:date | empty },

attribute validUntil { xsd:date | empty }

}

t_name =

element name {

attribute languageISO { text },

attribute languageText { text },

attribute name { text },

attribute nameTypeCode { text },

attribute nameTypeText { text },

attribute validFrom { xsd:date | empty },

attribute validUntil { xsd:date | empty }

}

t_credit_limit =

element creditLimit {

attribute currency { text },

attribute limit { xsd:integer }

}

t_bank =

element bank {

attribute accountNr { text },

attribute address { text },

attribute name { text }

40

}

t_capital =

element capital {

attribute currency { xsd:NCName },

attribute date { xsd:NMTOKEN },

attribute status { text },

attribute value { text }

}

t_employee =

element employee {

attribute date { xsd:date | empty },

attribute employee { xsd:integer }

}

t_owner =

element owner {

attribute typeCode { text },

attribute typeText { text },

attribute address { text },

attribute birthDate { text },

attribute crefoID { xsd:integer },

attribute name { text },

attribute sharePercent { xsd:integer }?,

(attribute shareValue { xsd:integer },

attribute shareCurrency { text })?,

attribute validFrom { text }

}

t_leader =

element leader {

attribute typeCode { text },

attribute typeText { text },

attribute address { text },

41

attribute authorization { text },

attribute birthDate { xsd:NMTOKEN },

attribute crefoID { xsd:integer },

attribute name { text },

attribute validFrom { text }

}

t_subsidiary =

element subsidiary {

attribute address { text },

attribute crefoID { xsd:integer },

attribute lastEventDate { text },

attribute name { text },

attribute ownershipTypeCode { text },

attribute ownershipTypeText { text },

attribute sharePercent { xsd:integer }?,

(attribute shareValue { xsd:integer },

attribute shareCurrency { text })?,

attribute validFrom { text },

attribute validUntil { text }

}

t_event =

element event {

attribute courtName { text },

attribute eventDate { xsd:date | empty },

attribute eventEndDate { xsd:date | empty },

attribute validFrom { xsd:date | empty },

attribute validUntil { xsd:date | empty },

attribute eventTypeCode { text },

attribute eventTypeText { text },

attribute priority { xsd:integer },

attribute remarks { text }

}

42

t_execution =

element execution {

attribute actionNumber { text },

attribute beginDate { text },

attribute comments { text },

attribute courtName { text },

attribute disposerName { text },

attribute endDate { text },

attribute eventDate { xsd:date | empty },

attribute eventEndDate { xsd:date | empty },

attribute eventTypeCode { text },

attribute eventTypeText { text },

attribute priority { xsd:integer },

attribute registryJournalTitle { text },

attribute remarks { text }

}

t_country_amount =

element countryAmount {

attribute percent { xsd:decimal },

attribute countryName { text },

attribute countryCode { text }

}

t_profit =

element profit {

attribute profitDate { xsd:date | empty },

attribute profitText { text },

attribute profitCurrency { text },

attribute profitValue { xsd:decimal }

}

t_registration =

element registration {

attribute foundedDate { xsd:NMTOKEN },

43

attribute legalForm { text },

attribute registrationDate { text },

attribute registrationNr { text },

attribute registryCourt { text }

}

t_turnover =

element turnover {

attribute date { xsd:date | empty },

attribute text { text },

attribute currency { text },

attribute value { xsd:decimal }

}

t_chapter =

element chapter {

attribute code { xsd:integer },

attribute text { text },

element paragraph { attribute text { text } }*

}

t_financial_set =

element financialSet {

attribute consolidated { "0" | "1" },

attribute startDate { xsd:date | empty },

attribute endDate { xsd:date | empty },

t_finrow*

}

t_finrow =

element finrow {

attribute abstractCode { text },

attribute code { text },

attribute financialValue { xsd:decimal },

attribute orderNr { xsd:integer },

44

attribute valueLabel { text },

attribute valueText { text },

attribute type { "A" | "B" }

}

t_ratio_set =

element ratioSet {

attribute endDate { xsd:date | empty },

attribute startDate { xsd:date | empty },

element ratio {

attribute code { xsd:integer },

attribute text { text },

attribute value { text }

}*

}

XML schema in RNC format

<?xml version="1.0" encoding="UTF-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

<xs:element name="company">

<xs:complexType>

<xs:sequence>

<xs:element ref="identifiers"/>

<xs:element ref="names"/>

<xs:element ref="activities"/>

<xs:element ref="addresses"/>

<xs:element ref="contacts"/>

<xs:element ref="economicSituation"/>

<xs:element ref="banks"/>

<xs:element ref="capitals"/>

<xs:element ref="employees"/>

<xs:element ref="employeesConsolidated"/>

<xs:element ref="owners"/>

45

<xs:element ref="leaders"/>

<xs:element ref="subsidiaries"/>

<xs:element ref="events"/>

<xs:element ref="exports"/>

<xs:element ref="imports"/>

<xs:element ref="profits"/>

<xs:element ref="registrations"/>

<xs:element ref="turnovers"/>

<xs:element ref="turnoversConsolidated"/>

<xs:element ref="financials"/>

<xs:element ref="financialRatios"/>

<xs:element ref="freetexts"/>

<xs:element ref="standardttexts"/>

<xs:element ref="executions"/>

</xs:sequence>

<xs:attribute name="crefoid" use="required" type="xs:integer"/>

<xs:attribute name="legalFormText" use="required"/>

<xs:attribute name="registration" use="required"/>

<xs:attribute name="registrationNr" use="required"/>

<xs:attribute name="statisticalNr" use="required"/>

<xs:attribute name="status" use="required"/>

<xs:attribute name="taxNr" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="identifiers">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="identifier"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="names">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="name"/>

46

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="activities">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="activity"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="addresses">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="address"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="contacts">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="contact"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="economicSituation">

<xs:complexType>

<xs:sequence>

<xs:element ref="ratings"/>

<xs:element ref="creditLimit"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="ratings">

<xs:complexType>

<xs:sequence>

47

<xs:element minOccurs="0" maxOccurs="unbounded" ref="index"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="banks">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="bank"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="capitals">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="capital"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="employees">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="employee"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="employeesConsolidated">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="employee"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="owners">

<xs:complexType>

<xs:sequence>

48

<xs:element minOccurs="0" maxOccurs="unbounded" ref="owner"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="leaders">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="leader"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="subsidiaries">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="subsidiary"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="events">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="event"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="exports">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="countryAmount"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="imports">

<xs:complexType>

<xs:sequence>

49

<xs:element minOccurs="0" maxOccurs="unbounded" ref="countryAmount"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="profits">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="profit"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="registrations">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="registration"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="turnovers">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="turnover"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="turnoversConsolidated">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="turnover"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="financials">

<xs:complexType>

<xs:sequence>

50

<xs:element minOccurs="0" maxOccurs="unbounded" ref="financialSet"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="financialRatios">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="ratioSet"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="freetexts">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="chapter"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="standardttexts">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="chapter"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="executions">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="execution"/>

</xs:sequence>

</xs:complexType>

</xs:element>

<xs:element name="activity">

<xs:complexType>

<xs:attribute name="activityClass" use="required"/>

51

<xs:attribute name="activityID" use="required" type="xs:integer"/>

<xs:attribute name="description" use="required"/>

<xs:attribute name="mainActivity" use="required">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:enumeration value="0"/>

<xs:enumeration value="1"/>

</xs:restriction>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="validFrom" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="validUntil" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

</xs:complexType>

</xs:element>

<xs:element name="index">

52

<xs:complexType>

<xs:attribute name="indexName" use="required"/>

<xs:attribute name="indexValueText" use="required"/>

<xs:attribute name="indexValue" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="identifier">

<xs:complexType>

<xs:attribute name="identifierTypeCode" use="required"/>

<xs:attribute name="identifierTypeText" use="required"/>

<xs:attribute name="identifier" use="required"/>

<xs:attribute name="validFrom" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="validUntil" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

</xs:complexType>

</xs:element>

53

<xs:element name="address">

<xs:complexType>

<xs:attribute name="addressTypeCode" use="required"/>

<xs:attribute name="addressTypeText" use="required"/>

<xs:attribute name="city" use="required"/>

<xs:attribute name="countryISO" use="required"/>

<xs:attribute name="countryText" use="required"/>

<xs:attribute name="description" use="required"/>

<xs:attribute name="door" use="required"/>

<xs:attribute name="floor" use="required"/>

<xs:attribute name="houseNr" use="required"/>

<xs:attribute name="street" use="required"/>

<xs:attribute name="validFrom" use="required"/>

<xs:attribute name="validUntil" use="required"/>

<xs:attribute name="zipCode" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="contact">

<xs:complexType>

<xs:attribute name="contactID" use="required"/>

<xs:attribute name="contactTypeCode" use="required"/>

<xs:attribute name="contactTypeText" use="required"/>

<xs:attribute name="contact" use="required"/>

<xs:attribute name="mainContact" use="required">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:enumeration value="0"/>

<xs:enumeration value="1"/>

</xs:restriction>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="description" use="required"/>

<xs:attribute name="validFrom" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

54

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="validUntil" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

</xs:complexType>

</xs:element>

<xs:element name="name">

<xs:complexType>

<xs:attribute name="languageISO" use="required"/>

<xs:attribute name="languageText" use="required"/>

<xs:attribute name="name" use="required"/>

<xs:attribute name="nameTypeCode" use="required"/>

<xs:attribute name="nameTypeText" use="required"/>

<xs:attribute name="validFrom" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

55

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="validUntil" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

</xs:complexType>

</xs:element>

<xs:element name="creditLimit">

<xs:complexType>

<xs:attribute name="currency" use="required"/>

<xs:attribute name="limit" use="required" type="xs:integer"/>

</xs:complexType>

</xs:element>

<xs:element name="bank">

<xs:complexType>

<xs:attribute name="accountNr" use="required"/>

<xs:attribute name="address" use="required"/>

<xs:attribute name="name" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="capital">

<xs:complexType>

<xs:attribute name="currency" use="required" type="xs:NCName"/>

<xs:attribute name="date" use="required" type="xs:NMTOKEN"/>

<xs:attribute name="status" use="required"/>

56

<xs:attribute name="value" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="employee">

<xs:complexType>

<xs:attribute name="date" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="employee" use="required" type="xs:integer"/>

</xs:complexType>

</xs:element>

<xs:element name="owner">

<xs:complexType>

<xs:attribute name="typeCode" use="required"/>

<xs:attribute name="typeText" use="required"/>

<xs:attribute name="address" use="required"/>

<xs:attribute name="birthDate" use="required"/>

<xs:attribute name="crefoID" use="required" type="xs:integer"/>

<xs:attribute name="name" use="required"/>

<xs:attribute name="sharePercent" type="xs:integer"/>

<xs:attribute name="shareValue" type="xs:integer"/>

<xs:attribute name="shareCurrency"/>

<xs:attribute name="validFrom" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="leader">

<xs:complexType>

57

<xs:attribute name="typeCode" use="required"/>

<xs:attribute name="typeText" use="required"/>

<xs:attribute name="address" use="required"/>

<xs:attribute name="authorization" use="required"/>

<xs:attribute name="birthDate" use="required" type="xs:NMTOKEN"/>

<xs:attribute name="crefoID" use="required" type="xs:integer"/>

<xs:attribute name="name" use="required"/>

<xs:attribute name="validFrom" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="subsidiary">

<xs:complexType>

<xs:attribute name="address" use="required"/>

<xs:attribute name="crefoID" use="required" type="xs:integer"/>

<xs:attribute name="lastEventDate" use="required"/>

<xs:attribute name="name" use="required"/>

<xs:attribute name="ownershipTypeCode" use="required"/>

<xs:attribute name="ownershipTypeText" use="required"/>

<xs:attribute name="sharePercent" type="xs:integer"/>

<xs:attribute name="shareValue" type="xs:integer"/>

<xs:attribute name="shareCurrency"/>

<xs:attribute name="validFrom" use="required"/>

<xs:attribute name="validUntil" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="event">

<xs:complexType>

<xs:attribute name="courtName" use="required"/>

<xs:attribute name="eventDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

58

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="eventEndDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="validFrom" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="validUntil" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

59

</xs:simpleType>

</xs:attribute>

<xs:attribute name="eventTypeCode" use="required"/>

<xs:attribute name="eventTypeText" use="required"/>

<xs:attribute name="priority" use="required" type="xs:integer"/>

<xs:attribute name="remarks" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="execution">

<xs:complexType>

<xs:attribute name="actionNumber" use="required"/>

<xs:attribute name="beginDate" use="required"/>

<xs:attribute name="comments" use="required"/>

<xs:attribute name="courtName" use="required"/>

<xs:attribute name="disposerName" use="required"/>

<xs:attribute name="endDate" use="required"/>

<xs:attribute name="eventDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="eventEndDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

60

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="eventTypeCode" use="required"/>

<xs:attribute name="eventTypeText" use="required"/>

<xs:attribute name="priority" use="required" type="xs:integer"/>

<xs:attribute name="registryJournalTitle" use="required"/>

<xs:attribute name="remarks" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="countryAmount">

<xs:complexType>

<xs:attribute name="percent" use="required" type="xs:decimal"/>

<xs:attribute name="countryName" use="required"/>

<xs:attribute name="countryCode" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="profit">

<xs:complexType>

<xs:attribute name="profitDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="profitText" use="required"/>

<xs:attribute name="profitCurrency" use="required"/>

<xs:attribute name="profitValue" use="required" type="xs:decimal"/>

</xs:complexType>

</xs:element>

61

<xs:element name="registration">

<xs:complexType>

<xs:attribute name="foundedDate" use="required" type="xs:NMTOKEN"/>

<xs:attribute name="legalForm" use="required"/>

<xs:attribute name="registrationDate" use="required"/>

<xs:attribute name="registrationNr" use="required"/>

<xs:attribute name="registryCourt" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="turnover">

<xs:complexType>

<xs:attribute name="date" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="text" use="required"/>

<xs:attribute name="currency" use="required"/>

<xs:attribute name="value" use="required" type="xs:decimal"/>

</xs:complexType>

</xs:element>

<xs:element name="chapter">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="paragraph"/>

</xs:sequence>

<xs:attribute name="code" use="required" type="xs:integer"/>

<xs:attribute name="text" use="required"/>

</xs:complexType>

62

</xs:element>

<xs:element name="paragraph">

<xs:complexType>

<xs:attribute name="text" use="required"/>

</xs:complexType>

</xs:element>

<xs:element name="financialSet">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="finrow"/>

</xs:sequence>

<xs:attribute name="consolidated" use="required">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:enumeration value="0"/>

<xs:enumeration value="1"/>

</xs:restriction>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="startDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="endDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

63

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

</xs:complexType>

</xs:element>

<xs:element name="finrow">

<xs:complexType>

<xs:attribute name="abstractCode" use="required"/>

<xs:attribute name="code" use="required"/>

<xs:attribute name="financialValue" use="required" type="xs:decimal"/>

<xs:attribute name="orderNr" use="required" type="xs:integer"/>

<xs:attribute name="valueLabel" use="required"/>

<xs:attribute name="valueText" use="required"/>

<xs:attribute name="type" use="required">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:enumeration value="A"/>

<xs:enumeration value="B"/>

</xs:restriction>

</xs:simpleType>

</xs:attribute>

</xs:complexType>

</xs:element>

<xs:element name="ratioSet">

<xs:complexType>

<xs:sequence>

<xs:element minOccurs="0" maxOccurs="unbounded" ref="ratio"/>

</xs:sequence>

<xs:attribute name="endDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

64

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

<xs:attribute name="startDate" use="required">

<xs:simpleType>

<xs:union memberTypes="xs:date">

<xs:simpleType>

<xs:restriction base="xs:token">

<xs:length value="0"/>

</xs:restriction>

</xs:simpleType>

</xs:union>

</xs:simpleType>

</xs:attribute>

</xs:complexType>

</xs:element>

<xs:element name="ratio">

<xs:complexType>

<xs:attribute name="code" use="required" type="xs:integer"/>

<xs:attribute name="text" use="required"/>

<xs:attribute name="value" use="required"/>

</xs:complexType>

</xs:element>

</xs:schema>

65


Recommended