@prefix adms: <http://www.w3.org/ns/adms#> .
@prefix dbo: <https://dbpedia.org/ontology/> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix locn: <http://www.w3.org/ns/locn#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix rr: <http://www.w3.org/ns/r2rml#> .
@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix legal: <http://www.w3.org/ns/legal#> .
@prefix m8g: <http://data.europa.eu/m8g/> .

######## D2RML NAMESPACES ###########

@prefix dr: <http://islab.ntua.gr/ns/d2rml#> .
@prefix drop: <http://islab.ntua.gr/ns/d2rml-op#> .
@prefix dris: <http://islab.ntua.gr/ns/d2rml-is#> .

######## STIRDATA TMP NAMESPACES ###########

@prefix nuts-item: <http://data.europa.eu/nuts/code/> .
@prefix lau-item: <https://w3id.org/stirdata/resource/lau/item/> .

@prefix sd-voc: <https://w3id.org/stirdata/vocabulary/> .
@prefix sd-voc-adminlevel: <https://w3id.org/stirdata/resource/adminUnitLevel/> .

@prefix sd-agency-fr: <http://fr.data.stirdata.eu/resource/agency/> .
@prefix sd-organization-fr: <http://fr.data.stirdata.eu/resource/organization/> .
@prefix sd-unit-fr: <http://fr.data.stirdata.eu/resource/unit/> .
@prefix sd-site-fr: <http://fr.data.stirdata.eu/resource/site/> .
@prefix sd-address-fr: <http://fr.data.stirdata.eu/resource/address/> .
@prefix sd-identifier-fr: <http://fr.data.stirdata.eu/resource/identifier/> .

@prefix sd-companytype-item-fr: <http://fr.data.stirdata.eu/resource/companyType/item/> .
@prefix sd-companystatus-item-fr: <http://fr.data.stirdata.eu/resource/companyStatus/item/> .

@prefix sd-nace-item-fr:    <http://fr.data.stirdata.eu/resource/nace/naf-rev2/item/> .

######## EXECUTION ORDER ###########

<#Order>
   a dr:LogicalDatasetOrder ;
   dr:logicalDatasets ( <#LegalUnitsMapping> ) .

######## DATA SOURCES ###########

<#LegalUnitsSource>
   a dris:HTTPSource ;
   dris:uri "https://files.data.gouv.fr/insee-sirene/StockUniteLegale_utf8.zip" ;
   dris:inContainerPath "StockUniteLegale_utf8.csv" .
#   a dris:FileSource ;
#   dris:path "D:/data/stirdata/data/fr/StockUniteLegale_utf8.csv" .

######## MAIN DATASETS AND MAPPINGS ###########

<#LegalUnitsMapping>  

# ++ siren
#    statutDiffusionUniteLegale
# ++ unitePurgeeUniteLegale
# ++ dateCreationUniteLegale
# ++ sigleUniteLegale
# ++ sexeUniteLegale
# ++ prenom1UniteLegale
# ++ prenom2UniteLegale
# ++ prenom3UniteLegale
# ++ prenom4UniteLegale
# ++ prenomUsuelUniteLegale
#    pseudonymeUniteLegale
# ++ identifiantAssociationUniteLegale
#    trancheEffectifsUniteLegale
#    anneeEffectifsUniteLegale
#    dateDernierTraitementUniteLegale
#    nombrePeriodesUniteLegale
#    categorieEntreprise
#    anneeCategorieEntreprise
# ++ dateDebut
#    etatAdministratifUniteLegale
# ++ nomUniteLegale
# ++ nomUsageUniteLegale
# ++ denominationUniteLegale
# ++ denominationUsuelle1UniteLegale
# ++ denominationUsuelle2UniteLegale
# ++ denominationUsuelle3UniteLegale
# ++ categorieJuridiqueUniteLegale
# ++ activitePrincipaleUniteLegale
# ++ nomenclatureActivitePrincipaleUniteLegale
#    nicSiegeUniteLegale
#    economieSocialeSolidaireUniteLegale
#    caractereEmployeurUniteLegale
   
   rr:logicalTable [ 
      a dr:CSVTable;
      dr:source <#LegalUnitsSource> ;
      dr:delimiter ",";
      dr:quoteCharacter "\"" ;
      dr:headerRecord true ;
#      dr:offset 15 ;
#      dr:limit 10;
   ] ;
   
   # ID - CLASS  # keep only dissolved after 2000-01-01
   rr:subjectMap [ 
      rr:template  "{@sd-organization-fr}{siren}" ;
      rr:class legal:LegalEntity ;
      dr:condition [
		 rr:column "unitePurgeeUniteLegale" ;
		 drop:eq "";
         dr:booleanOperator drop:or ;
         dr:condition [
		    rr:column "unitePurgeeUniteLegale" ;
		    drop:eq "true";
		    dr:booleanOperator drop:and ;
		    dr:condition [
			   rr:column "dateDebut" ;
			   rr:datatype xsd:date ;
			   drop:geq "2000-01-01" ;
			] ;
		 ]
      ] ;      
   ] ;   
   
#   # SYSTEM IDENTIFIER
#   rr:predicateObjectMap [ 
#      rr:predicate  dct:identifier ;
#      rr:objectMap  [ 
#         rr:column "siren" ;
#         rr:termType  rr:Literal ;
#      ] ;
#   ] ;   
   
#   # THIRD PARTY WEBPAGES 
#   rr:predicateObjectMap [ 
#      rr:predicate  owl:sameAs ;
#      rr:objectMap  [ 
#         rr:template "https://opencorporates.com/companies/fr/{siren}" ;
#         rr:termType rr:IRI ;
#      ] ;   
#   ] ;      
   
   # SIREN REGISTRATION IDENTIFIER
   rr:predicateObjectMap [
      rr:predicate legal:legalIdentifier ;
      rr:objectMap [
         rr:parentTriplesMap [
            rr:subjectMap [
               rr:template "{@sd-identifier-fr}{siren}" ;
               rr:class adms:Identifier ;
            ] ;

            # REGISTRATION NUMBER 
            rr:predicateObjectMap [
            rr:predicate skos:notation;
               rr:objectMap [
                  rr:column "siren" ;
                  rr:termType rr:Literal;
               ] ;
            ] ;

            # ISSUING BODY
            rr:predicateObjectMap [
               rr:predicate dct:creator;
               rr:objectMap [
                  rr:constant sd-agency-fr:siren ;
               ] ;
            ] ;
         ] ;
	  
         rr:objectMap [
            rr:subjectMap [
               rr:template "{@sd-identifier-fr}{siren}" ;
               rr:class adms:Identifier ;
            ] ;

            # REGISTRATION NUMBER 
            rr:predicateObjectMap [
            rr:predicate skos:notation;
               rr:objectMap [
                  rr:column "identifiantAssociationUniteLegale" ;
                  rr:termType rr:Literal;
               ] ;
            ] ;

            # ISSUING BODY
            rr:predicateObjectMap [
               rr:predicate dct:creator;
               rr:objectMap [
                  rr:constant sd-agency-fr:rna ;
               ] ;
            ] ;
         ] ;
      ] ;
   ] ;   

#   # JURISDICTION (ASSUME FRANCE FOR ALL)
#   rr:predicateObjectMap [ 
#      rr:predicate  dbo:jurisdiction ;
#      rr:objectMap  [ 
#         rr:constant <http://publications.europa.eu/resource/authority/country/FRA> ;
#         rr:termType  rr:IRI ;
#      ] ;
#   ] ;  
   
   # COMPANY NAME
   rr:predicateObjectMap [ 
      rr:predicate  legal:legalName ;
      rr:objectMap  [ 
	     dr:cases ( [
            rr:template "MONSIEUR <<{prenom1UniteLegale} >><<{prenom2UniteLegale} >><<{prenom3UniteLegale} >><<{prenom4UniteLegale}>>{nomUniteLegale}" ;
            rr:termType  rr:Literal ;
		    dr:condition [
			   rr:column "sexeUniteLegale" ;
			   drop:eq "M" ;
			 ] 
		 ] [
            rr:template "MADAME <<{prenom1UniteLegale} >><<{prenom2UniteLegale} >><<{prenom3UniteLegale} >><<{prenom4UniteLegale}>>{nomUniteLegale}" ;
            rr:termType  rr:Literal ;
		    dr:condition [
			   rr:column "sexeUniteLegale" ;
			   drop:eq "F" ;
			 ] 
	     ] )
      ] ;
      rr:objectMap  [ 
         rr:column "denominationUniteLegale" ;
         rr:termType  rr:Literal ;
      ] ;
   ] ;     
   
   rr:predicateObjectMap [ 
      rr:predicate  sd-voc:abbreviatedName ;
      rr:objectMap  [ 
         rr:column "sigleUniteLegale" ;
         rr:termType  rr:Literal ;
      ] ;
   ] ;      
   
   rr:predicateObjectMap [ 
      rr:predicate  sd-voc:tradingName ;
      rr:objectMap  [ 
	     dr:cases ( [
            rr:template "MONSIEUR <<{prenomUsuelUniteLegale} >>{nomUsageUniteLegale}" ;
            rr:termType  rr:Literal ;
		    dr:condition [
			   rr:column "sexeUniteLegale" ;
			   drop:eq "M" ;
			   dr:booleanOperator drop:and ;
			   dr:operand [
			      rr:column "nomUsageUniteLegale";
				  drop:neq "";
			   ]
			 ] 
		 ] [
            rr:template "MONSIEUR <<{prenomUsuelUniteLegale} >>{nomUniteLegale}" ;
            rr:termType  rr:Literal ;
		    dr:condition [
			   rr:column "sexeUniteLegale" ;
			   drop:eq "M" ;
			   dr:booleanOperator drop:and ;
			   dr:operand [
			      rr:column "prenom2UniteLegale";
				  drop:neq "";
			   ]
			 ] 
		 ] [
            rr:template "MADAME <<{prenomUsuelUniteLegale} >>{nomUsageUniteLegale}" ;
            rr:termType  rr:Literal ;
		    dr:condition [
			   rr:column "sexeUniteLegale" ;
			   drop:eq "F" ;
               dr:booleanOperator drop:and ;
			   dr:operand [
			      rr:column "nomUsageUniteLegale";
				  drop:neq "";
			   ]			   
			 ] 
	     ] [
            rr:template "MADAME <<{prenomUsuelUniteLegale} >>{nomUniteLegale}" ;
            rr:termType  rr:Literal ;
		    dr:condition [
			   rr:column "sexeUniteLegale" ;
			   drop:eq "F" ;
               dr:operand [
			      rr:column "prenom2UniteLegale";
				  drop:neq "";
			   ]			   
			] 
	     ] )
      ] ;
   ] ; 
   
   rr:predicateObjectMap [ 
      rr:predicate  sd-voc:tradingName ;
      rr:objectMap  [ 
         rr:column "denominationUsuelle1UniteLegale" ;
         rr:termType  rr:Literal ;
      ] ;
      rr:objectMap  [ 
         rr:column "denominationUsuelle2UniteLegale" ;
         rr:termType  rr:Literal ;
      ] ;
      rr:objectMap  [ 
         rr:column "denominationUsuelle3UniteLegale" ;
         rr:termType  rr:Literal ;
      ] ;
   ] ;   
   
   # LEGAL FORM (TEMPORARY UNTIL SKOS VOCABULARY DECIDED)
   rr:predicateObjectMap [ 
      rr:predicate  legal:companyType ;
      rr:objectMap  [ 
         rr:template "{@sd-companytype-item-fr}{categorieJuridiqueUniteLegale}" ;
         rr:termType  rr:IRI ;
      ] ;
   ] ;

   
   # FOUNDATION DATE 
   rr:predicateObjectMap [ 
      rr:predicate  m8g:registrationDate ;
      rr:objectMap  [ 
         rr:column "dateCreationUniteLegale" ;
         rr:datatype xsd:date ;
      ] ;      
   ] ;    
   
   # DISSOLUTION DATE 
   rr:predicateObjectMap [ 
      rr:predicate  schema:dissolutionDate ;
      rr:objectMap  [ 
         rr:column "dateDebut" ;
         rr:datatype xsd:date ;
		 dr:condition [
		    rr:column "unitePurgeeUniteLegale" ;
			drop:eq "true";
		 ]
      ] ;      
   ] ;     

   
   
   # ACTIVITY   
   rr:predicateObjectMap [
      rr:predicate legal:companyActivity, sd-voc:primaryActivity ;
      rr:objectMap [
	     dr:cases ( [
            rr:template "{@sd-nace-item-fr}{activitePrincipaleUniteLegale}" ;
            rr:termType rr:IRI ;
		    dr:condition [
		       rr:column "nomenclatureActivitePrincipaleUniteLegale" ;
			   drop:eq "NAFRev2" ;
		    ] ;
#	    ] [
#            rr:template "{@nafrev1-code-fr}{activitePrincipaleUniteLegale}" ;
#            rr:termType rr:IRI ;
#		    dr:condition [
#		       rr:column "nomenclatureActivitePrincipaleUniteLegale" ;
#			   drop:eq "NAFRev1" ;
#		    ] ;
#	    ] [
#            rr:template "{@naf1993-code-fr}{activitePrincipaleUniteLegale}" ;
#            rr:termType rr:IRI ;
#		    dr:condition [
#		       rr:column "nomenclatureActivitePrincipaleUniteLegale" ;
#			   drop:eq "NAF1993" ;
#		    ] ;
#	    ] [
#            rr:template "{@nap-code-fr}{activitePrincipaleUniteLegale}" ;
#            rr:termType rr:IRI ;
#		    dr:condition [
#		       rr:column "nomenclatureActivitePrincipaleUniteLegale" ;
#			   drop:eq "NAP" ;
#		    ] ;
	    ] )
	  ] ;
   ]  ;  

