Compare commits
108 Commits
3e105855f0
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 953deff41c | |||
| ea7e693759 | |||
| ae2f5bd188 | |||
| aa8a24f81e | |||
| 6b954c7467 | |||
| 71e566da25 | |||
| ad28588b0a | |||
| 2b2805a125 | |||
| fc82e6b1df | |||
| 1775c19c0a | |||
| 49aea6e50a | |||
| ec991b7df9 | |||
| dda6262b23 | |||
| 5094b1a945 | |||
| 0bedbf0764 | |||
| e333b82e96 | |||
| a192520b30 | |||
| 4cd6e7cbae | |||
| 6c0fa1ca27 | |||
| 1e4e8f9ff6 | |||
| d4d4a7be44 | |||
| 5ea1c93d2b | |||
| e325b12546 | |||
| 47bcda41fd | |||
| 3438da3880 | |||
| ebb91f8318 | |||
| 767756acfc | |||
| 84ede82428 | |||
| 5beddc7c1b | |||
| a6f7f3d465 | |||
| 43b060371a | |||
| 71f0aa6cd0 | |||
| 87f8ad7a61 | |||
| 6a29a3f43c | |||
| 3e871a31e6 | |||
| 9c62c99305 | |||
| 8fb0088010 | |||
| 1e810f0ddb | |||
| a54adcdcb8 | |||
| 6b63ae2f52 | |||
| 6851270bd5 | |||
| 739cc89872 | |||
| dffd6a54a3 | |||
| 267c09c064 | |||
| be4524ed67 | |||
| 06ea9474f1 | |||
| c0267fca5e | |||
| 55b97936ab | |||
| adcd51e32b | |||
| 666519df84 | |||
| beb41af562 | |||
| 57dfdaf64f | |||
| f7e3c118e2 | |||
| 2b4adc0db2 | |||
| a0baf985d4 | |||
| 85e9a41fe2 | |||
| 3102dbc053 | |||
| a21be6aef3 | |||
| 4d708ff4ca | |||
| ea1f92c7e2 | |||
| 9e5e8551f0 | |||
| b8b28a673b | |||
| 70c8c26367 | |||
| e1459d85ea | |||
| f927db064a | |||
| 0589883f8e | |||
| d73e64dbac | |||
| cf7c3aaeb2 | |||
| cd4fcb7aa0 | |||
| 1e0cfead5b | |||
| 0837d0ce08 | |||
| b58316bb88 | |||
| 209d1cd777 | |||
| 1eb3aeeda0 | |||
| b3c288628c | |||
| d45e01ac85 | |||
| 9bb0cc5c75 | |||
| 3a68fd2ce4 | |||
| fa7421c35b | |||
| 5cb9497163 | |||
| 15cac660bc | |||
| 0feec2982f | |||
| b5ab0772a0 | |||
| f293f65650 | |||
| cfd1104c28 | |||
| 7d64390bae | |||
| 4876d8ab14 | |||
| 2bfb298054 | |||
| 54ef33d1ab | |||
| 3fd779854f | |||
| de2928414b | |||
| 9d6d278d78 | |||
| c8b0457195 | |||
| 9cc74a9a38 | |||
| 8e6168d4ee | |||
| c1a8ce86a6 | |||
| 14feb49dcd | |||
| 39de1c48c0 | |||
| f9e2b32118 | |||
| 3ebb1cf165 | |||
| c84176b8d3 | |||
| 61f4dd513f | |||
| 5e9f437497 | |||
| 69af57f876 | |||
| 56f78e77f3 | |||
| 0c7dc082fd | |||
| 3f5d7e980c | |||
| 87be4e4483 |
@@ -276,4 +276,39 @@ public class CommuneCentreAssignationController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Operation(summary = "Vérifier l'assignation d'un contribuable",description = "permet de vérifier si un contribuable a déjà un centre d'assignation dans la commune de l'utilisateur connecté")
|
||||||
|
@GetMapping("/contribuable/{personneId}")
|
||||||
|
public ResponseEntity<?> getAssignationPersonne(@CurrentUser UserPrincipal currentUser, @PathVariable Long personneId) {
|
||||||
|
try {
|
||||||
|
if(currentUser==null){
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(false, null, "vous ne pouvez pas faire cette action."),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
}
|
||||||
|
User user = currentUser.getUser();
|
||||||
|
|
||||||
|
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(true, communeCentreAssignationService.getCommuneCentreAssignationByPersonneIdCommune(user,personneId).orElse(null), "Assignation chargée avec succès."),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
} catch (HttpClientErrorException.MethodNotAllowed e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "Method POST/GET is required."), HttpStatus.OK);
|
||||||
|
} catch (NotFoundException | BadRequestException | MyFileNotFoundException | ResourceNotFoundException |
|
||||||
|
FileStorageException e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, e.getMessage()), HttpStatus.OK);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "Null value has been detected {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "An error has been occur and the content is {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ public class DeclarationNcController {
|
|||||||
|
|
||||||
|
|
||||||
@PostMapping("/create")
|
@PostMapping("/create")
|
||||||
public ResponseEntity<?> createDeclarationNc(@RequestBody @Valid @Validated DeclarationNcPayloadWeb declarationNcPayloadWeb) {
|
public ResponseEntity<?> createDeclarationNc(@RequestBody DeclarationNcPayloadWeb declarationNcPayloadWeb) {
|
||||||
try {
|
try {
|
||||||
declarationNcPayloadWeb = declarationNcService.createDeclarationNc(declarationNcPayloadWeb);
|
declarationNcPayloadWeb = declarationNcService.createDeclarationNc(declarationNcPayloadWeb);
|
||||||
return new ResponseEntity<>(
|
return new ResponseEntity<>(
|
||||||
|
|||||||
@@ -116,52 +116,52 @@ public class DonneesImpositionTfuController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/all")
|
// @GetMapping("/all")
|
||||||
public ResponseEntity<?> getAllDonneesImpositionTfuList() {
|
// public ResponseEntity<?> getAllDonneesImpositionTfuList() {
|
||||||
try {
|
// try {
|
||||||
return new ResponseEntity<>(
|
// return new ResponseEntity<>(
|
||||||
new ApiResponse<>(true, donneesImpositionTfuService.getDonneesImpositionTfuList(), "Liste des impositions chargée avec succès."),
|
// new ApiResponse<>(true, donneesImpositionTfuService.getDonneesImpositionTfuList(), "Liste des impositions chargée avec succès."),
|
||||||
HttpStatus.OK
|
// HttpStatus.OK
|
||||||
);
|
// );
|
||||||
} catch (HttpClientErrorException.MethodNotAllowed e) {
|
// } catch (HttpClientErrorException.MethodNotAllowed e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, "Method POST/GET is required."), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, "Method POST/GET is required."), HttpStatus.OK);
|
||||||
} catch (NotFoundException | BadRequestException | MyFileNotFoundException | ResourceNotFoundException |
|
// } catch (NotFoundException | BadRequestException | MyFileNotFoundException | ResourceNotFoundException |
|
||||||
FileStorageException e) {
|
// FileStorageException e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, e.getMessage()), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, e.getMessage()), HttpStatus.OK);
|
||||||
} catch (NullPointerException e) {
|
// } catch (NullPointerException e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, "Null value has been detected {" + e.getMessage() + "}."), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, "Null value has been detected {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, "An error has been occur and the content is {" + e.getMessage() + "}."), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, "An error has been occur and the content is {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
@GetMapping("/all-paged")
|
// @GetMapping("/all-paged")
|
||||||
public ResponseEntity<?> getAllDonneesImpositionTfuPaged(@RequestParam int pageNo, @RequestParam int pageSize) {
|
// public ResponseEntity<?> getAllDonneesImpositionTfuPaged(@RequestParam int pageNo, @RequestParam int pageSize) {
|
||||||
try {
|
// try {
|
||||||
Pageable pageable = PageRequest.of(pageNo, pageSize);
|
// Pageable pageable = PageRequest.of(pageNo, pageSize);
|
||||||
return new ResponseEntity<>(
|
// return new ResponseEntity<>(
|
||||||
new ApiResponse<>(true, donneesImpositionTfuService.getDonneesImpositionTfuList(pageable), "Liste des impositions chargée avec succès."),
|
// new ApiResponse<>(true, donneesImpositionTfuService.getDonneesImpositionTfuList(pageable), "Liste des impositions chargée avec succès."),
|
||||||
HttpStatus.OK
|
// HttpStatus.OK
|
||||||
);
|
// );
|
||||||
} catch (HttpClientErrorException.MethodNotAllowed e) {
|
// } catch (HttpClientErrorException.MethodNotAllowed e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, "Method POST/GET is required."), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, "Method POST/GET is required."), HttpStatus.OK);
|
||||||
} catch (NotFoundException | BadRequestException | MyFileNotFoundException | ResourceNotFoundException |
|
// } catch (NotFoundException | BadRequestException | MyFileNotFoundException | ResourceNotFoundException |
|
||||||
FileStorageException e) {
|
// FileStorageException e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, e.getMessage()), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, e.getMessage()), HttpStatus.OK);
|
||||||
} catch (NullPointerException e) {
|
// } catch (NullPointerException e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, "Null value has been detected {" + e.getMessage() + "}."), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, "Null value has been detected {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
logger.error(e.getLocalizedMessage());
|
// logger.error(e.getLocalizedMessage());
|
||||||
return new ResponseEntity<>(new ApiResponse(false, null, "An error has been occur and the content is {" + e.getMessage() + "}."), HttpStatus.OK);
|
// return new ResponseEntity<>(new ApiResponse(false, null, "An error has been occur and the content is {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/all-page/by-imposition-id/{impositionId}")
|
@GetMapping("/all-page/by-imposition-id/{impositionId}")
|
||||||
@@ -333,6 +333,59 @@ public class DonneesImpositionTfuController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Operation(
|
||||||
|
summary = "Générer les données fiscales TFU pour une seule parcelle",
|
||||||
|
description = "Génère les impositions TFU pour une parcelle bâtie donnée"
|
||||||
|
)
|
||||||
|
@PostMapping("/generer-batie/{parcelleId}")
|
||||||
|
public ResponseEntity<?> genererDonneesFiscaleBatieUneParcelle(@CurrentUser UserPrincipal userPrincipal, @RequestBody ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb,@PathVariable Long parcelleId) {
|
||||||
|
try {
|
||||||
|
Optional<ImpositionsTfu> optionalImpositionsTfu =impositionsTfuRepository.findById(impositionsTfuPaylaodWeb.getId());
|
||||||
|
|
||||||
|
if(optionalImpositionsTfu.isEmpty()){
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(false, null, "L'instance d'imposition n'est pas trouvée."),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if(!optionalImpositionsTfu.get().getStatusAvis().equals(StatusAvis.TFU_FNB_GENERE)){
|
||||||
|
// return new ResponseEntity<>(
|
||||||
|
// new ApiResponse<>(false, null, "l'état actuel : "+optionalImpositionsTfu.get().getStatusAvis()+" ne permet pas cette opération."),
|
||||||
|
// HttpStatus.OK
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
if(userPrincipal==null){
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(false, null, "Vous n'êtes pas autorisé à accéder à cette ressource"),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
}
|
||||||
|
impositionsTfuPaylaodWeb=donneesImpositionTfuService.genererDonneesFiscalesParcelleBatieUneParcelle(impositionsTfuPaylaodWeb,userPrincipal.getUser().getId(),parcelleId);
|
||||||
|
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(true,impositionsTfuPaylaodWeb, "Données d'imposition des fonciers batis Générées avec succès."),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
|
||||||
|
} catch (HttpClientErrorException.MethodNotAllowed e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "Method POST/GET is required."), HttpStatus.OK);
|
||||||
|
} catch (NotFoundException | BadRequestException | MyFileNotFoundException | ResourceNotFoundException |
|
||||||
|
FileStorageException e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, e.getMessage()), HttpStatus.OK);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "Null value has been detected {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "An error has been occur and the content is {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Operation(summary = "Générer les données fiscales TFU des parcelle baties")
|
@Operation(summary = "Générer les données fiscales TFU des parcelle baties")
|
||||||
@@ -384,6 +437,59 @@ public class DonneesImpositionTfuController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Operation(
|
||||||
|
summary = "Générer les données fiscales TFU pour une seule parcelle",
|
||||||
|
description = "Génère les impositions TFU pour une parcelle non bâtie donnée"
|
||||||
|
)
|
||||||
|
@PostMapping("/generer-non-batie/{parcelleId}")
|
||||||
|
public ResponseEntity<?> genererDonneesImpositionNonBatiesUneParcelle(@CurrentUser UserPrincipal userPrincipal, @RequestBody ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb, @PathVariable Long parcelleId) {
|
||||||
|
try {
|
||||||
|
Optional<ImpositionsTfu> optionalImpositionsTfu =impositionsTfuRepository.findById(impositionsTfuPaylaodWeb.getId());
|
||||||
|
|
||||||
|
if(optionalImpositionsTfu.isEmpty()){
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(false, null, "L'instance d'imposition n'est pas trouvée."),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// if(!optionalImpositionsTfu.get().getStatusAvis().equals(StatusAvis.GENERATION_AUTORISE)){
|
||||||
|
// return new ResponseEntity<>(
|
||||||
|
// new ApiResponse<>(false, null, "l'état actuel : "+optionalImpositionsTfu.get().getStatusAvis()+" ne permet pas cette opération."),
|
||||||
|
// HttpStatus.OK
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
if(userPrincipal==null){
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(false, null, "Vous n'êtes pas autorisé à accéder à cette ressource"),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
}
|
||||||
|
impositionsTfuPaylaodWeb=donneesImpositionTfuService.genererDonneesFiscalesParcelleNonBatieUneParcelle(impositionsTfuPaylaodWeb,userPrincipal.getUser().getId(),parcelleId);
|
||||||
|
|
||||||
|
return new ResponseEntity<>(
|
||||||
|
new ApiResponse<>(true,impositionsTfuPaylaodWeb, "Données d'imposition pour les fonciers non batis Générées avec succès."),
|
||||||
|
HttpStatus.OK
|
||||||
|
);
|
||||||
|
|
||||||
|
} catch (HttpClientErrorException.MethodNotAllowed e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "Method POST/GET is required."), HttpStatus.OK);
|
||||||
|
} catch (NotFoundException | BadRequestException | MyFileNotFoundException | ResourceNotFoundException |
|
||||||
|
FileStorageException e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, e.getMessage()), HttpStatus.OK);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "Null value has been detected {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
|
} catch (Exception e) {
|
||||||
|
logger.error(e.getLocalizedMessage());
|
||||||
|
return new ResponseEntity<>(new ApiResponse(false, null, "An error has been occur and the content is {" + e.getMessage() + "}."), HttpStatus.OK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Operation(summary = "Récuperer les avis d'id d'une imposition")
|
@Operation(summary = "Récuperer les avis d'id d'une imposition")
|
||||||
@GetMapping("/by-impositions-id/{impositionsId}")
|
@GetMapping("/by-impositions-id/{impositionsId}")
|
||||||
public ResponseEntity<?> getDonneesFiscale(@PathVariable Long impositionsId) {
|
public ResponseEntity<?> getDonneesFiscale(@PathVariable Long impositionsId) {
|
||||||
|
|||||||
@@ -0,0 +1,62 @@
|
|||||||
|
package io.gmss.fiscad.entities.interface_sigibe;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import io.gmss.fiscad.deserializer.LocalDateDeserializer;
|
||||||
|
import io.gmss.fiscad.entities.BaseEntity;
|
||||||
|
import io.gmss.fiscad.entities.decoupage.Quartier;
|
||||||
|
import io.gmss.fiscad.entities.infocad.parametre.Personne;
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class DeclarationSpontaneBien extends BaseEntity implements Serializable {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
private Long idImposition ;
|
||||||
|
private String rImposition ;
|
||||||
|
private String ifu ;
|
||||||
|
private String rCommune ;
|
||||||
|
private String rQuartier ;
|
||||||
|
private String qipQuartier;
|
||||||
|
private String qipIlot;
|
||||||
|
private String qipParcelle;
|
||||||
|
private String nup;
|
||||||
|
private String gpsLatitude;
|
||||||
|
private String gpsLongitude;
|
||||||
|
private String commentaire;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateValidation;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateInformation;
|
||||||
|
private Long valeurBatiment;
|
||||||
|
private Long nub;
|
||||||
|
private Long nul;
|
||||||
|
private Long montantLocatifAnnuel ;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateConstruction;
|
||||||
|
private Float superficieSolBat;
|
||||||
|
private Float superficieSolUlot;
|
||||||
|
private Float superficieParcelle;
|
||||||
|
private String usage;
|
||||||
|
private Boolean bati;
|
||||||
|
@ManyToOne
|
||||||
|
private Personne personne;
|
||||||
|
@ManyToOne
|
||||||
|
private Quartier quartier;
|
||||||
|
}
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package io.gmss.fiscad.entities.interface_sigibe;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import io.gmss.fiscad.deserializer.LocalDateDeserializer;
|
||||||
|
import io.gmss.fiscad.entities.BaseEntity;
|
||||||
|
import io.gmss.fiscad.entities.infocad.parametre.Personne;
|
||||||
|
import io.gmss.fiscad.entities.infocad.parametre.PositionRepresentation;
|
||||||
|
import io.gmss.fiscad.entities.infocad.parametre.TypeContestation;
|
||||||
|
import io.gmss.fiscad.entities.infocad.parametre.TypeRepresentation;
|
||||||
|
import io.gmss.fiscad.enums.SourceDonnee;
|
||||||
|
import io.gmss.fiscad.enums.TypeDroit;
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class EpaiementAcompte extends BaseEntity implements Serializable {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
private Long idPaiementAcompte;
|
||||||
|
private Long idPaiementImpot;
|
||||||
|
private String rDoc;
|
||||||
|
private String rImpot;
|
||||||
|
private String idImpotType;
|
||||||
|
private String idImpotNature;
|
||||||
|
private String ifu;
|
||||||
|
private String rCommune;
|
||||||
|
private String rQuartier;
|
||||||
|
private String qipQuartier;
|
||||||
|
private String qipIlot;
|
||||||
|
private String qipParcelle;
|
||||||
|
private String nup;
|
||||||
|
private Long exercice;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateValidation;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateAvisCredit;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateRapprochement;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateInformation;
|
||||||
|
private Long montantPayer;
|
||||||
|
}
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
package io.gmss.fiscad.entities.interface_sigibe;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import io.gmss.fiscad.deserializer.LocalDateDeserializer;
|
||||||
|
import io.gmss.fiscad.entities.BaseEntity;
|
||||||
|
import io.gmss.fiscad.enums.SourceDonnee;
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class EpaiementRetenu extends BaseEntity implements Serializable {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
private Long idPaiementRetenue;
|
||||||
|
private Long idEdiGenerique;
|
||||||
|
private Long idPaiementImpot;
|
||||||
|
private String rDoc;
|
||||||
|
private String rImpot;
|
||||||
|
private String idImpotType;
|
||||||
|
private String idImpotNature;
|
||||||
|
private String ifuPayeur;
|
||||||
|
private String ifuRetenue;
|
||||||
|
private String rCommune;
|
||||||
|
private String rQuartier;
|
||||||
|
private String qipQuartier;
|
||||||
|
private String qipIlot;
|
||||||
|
private String qipParcelle;
|
||||||
|
private String nup;
|
||||||
|
private Long exercice;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateValidation;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateAvisCredit;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateRapprochement;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateInformation;
|
||||||
|
private Long montantPayer;
|
||||||
|
}
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
package io.gmss.fiscad.entities.interface_sigibe;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
|
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
|
||||||
|
import io.gmss.fiscad.deserializer.LocalDateDeserializer;
|
||||||
|
import io.gmss.fiscad.entities.BaseEntity;
|
||||||
|
import io.gmss.fiscad.enums.SourceDonnee;
|
||||||
|
import jakarta.persistence.*;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.time.LocalDate;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = true)
|
||||||
|
@Entity
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class PaiementAvis extends BaseEntity implements Serializable {
|
||||||
|
@Id
|
||||||
|
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||||
|
private Long id;
|
||||||
|
private Long idPaiementImpot;
|
||||||
|
private Long idAvis;
|
||||||
|
private Long idUniteFoncier;
|
||||||
|
private Long idContribuableFoncier;
|
||||||
|
private String rDoc;
|
||||||
|
private String rImpot;
|
||||||
|
private String idImpotType;
|
||||||
|
private String idImpotNature;
|
||||||
|
private String ifu;
|
||||||
|
private String rCommune;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateValidation;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateAvisCredit;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateRapprochement;
|
||||||
|
@JsonFormat(pattern = "dd-MM-yyyy")
|
||||||
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
|
private LocalDate dateInformation;
|
||||||
|
private Long montantPayer;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -62,4 +62,6 @@ public class CommuneCentreAssignation extends BaseEntity implements Serializable
|
|||||||
private String nc;
|
private String nc;
|
||||||
|
|
||||||
private String ifu;
|
private String ifu;
|
||||||
|
|
||||||
|
private String adresseContact ;
|
||||||
}
|
}
|
||||||
@@ -36,19 +36,22 @@ public class DeclarationNc extends BaseEntity implements Serializable {
|
|||||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
private LocalDate dateDerniereDeclaration;
|
private LocalDate dateDerniereDeclaration;
|
||||||
|
|
||||||
|
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||||
@JsonDeserialize(using = LocalDateDeserializer.class)
|
@JsonDeserialize(using = LocalDateDeserializer.class)
|
||||||
private LocalDate dateDeclarationNc;
|
private LocalDate dateDeclarationNc;
|
||||||
|
|
||||||
private String nc;
|
private String nc;
|
||||||
|
private String q;
|
||||||
|
private String i;
|
||||||
|
private String p;
|
||||||
|
private String numeroTitreFoncier;
|
||||||
|
private String nup;
|
||||||
private String observation;
|
private String observation;
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
private Structure structure;
|
private Structure structure;
|
||||||
|
|
||||||
|
|
||||||
private Long enqueteExternalKey;
|
private Long enqueteExternalKey;
|
||||||
|
|
||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
|
|||||||
@@ -114,6 +114,11 @@ public class DonneesImpositionTfu extends BaseEntity implements Serializable {
|
|||||||
private Float tauxTfu;
|
private Float tauxTfu;
|
||||||
private Long tfuPiscine;
|
private Long tfuPiscine;
|
||||||
private Float montantTaxe;
|
private Float montantTaxe;
|
||||||
|
private Float penalite;
|
||||||
|
private Float retenuIrf ;
|
||||||
|
private Float acompte ;
|
||||||
|
private Float montantRestant ;
|
||||||
|
private Float montantTaxeBrut; //montant de la taxe calculée sans comparaisons avec TFU MINI
|
||||||
private Float tfuCalculeTauxPropParc;
|
private Float tfuCalculeTauxPropParc;
|
||||||
private Float tfuSuperficieAuSolReel;
|
private Float tfuSuperficieAuSolReel;
|
||||||
private Long valeurAdminParcelleNbMetreCarre;
|
private Long valeurAdminParcelleNbMetreCarre;
|
||||||
@@ -146,5 +151,6 @@ public class DonneesImpositionTfu extends BaseEntity implements Serializable {
|
|||||||
@ManyToOne(fetch = FetchType.LAZY)
|
@ManyToOne(fetch = FetchType.LAZY)
|
||||||
private Personne personne ;
|
private Personne personne ;
|
||||||
|
|
||||||
|
private Boolean parcelleContact;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
package io.gmss.fiscad.enums;
|
package io.gmss.fiscad.enums;
|
||||||
|
|
||||||
public enum NatureImpot {
|
public enum NatureImpot {
|
||||||
TFU,
|
FB,
|
||||||
|
FNB,
|
||||||
IRF,
|
IRF,
|
||||||
SRTB
|
SRTB
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import io.gmss.fiscad.persistence.repositories.infocad.parametre.PersonneReposit
|
|||||||
import io.gmss.fiscad.persistence.repositories.infocad.parametre.StructureRepository;
|
import io.gmss.fiscad.persistence.repositories.infocad.parametre.StructureRepository;
|
||||||
import io.gmss.fiscad.persistence.repositories.rfu.metier.CommuneCentreAssignationRepository;
|
import io.gmss.fiscad.persistence.repositories.rfu.metier.CommuneCentreAssignationRepository;
|
||||||
import io.gmss.fiscad.service.EntityFromPayLoadService;
|
import io.gmss.fiscad.service.EntityFromPayLoadService;
|
||||||
|
import jakarta.ws.rs.NotAcceptableException;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
import org.springframework.data.domain.Pageable;
|
import org.springframework.data.domain.Pageable;
|
||||||
@@ -60,7 +61,7 @@ public class CommuneCentreAssignationServiceImpl implements CommuneCentreAssigna
|
|||||||
|
|
||||||
Optional<CommuneCentreAssignationPaylaodWeb> communeCentreAssignationPaylaodWebOptional=communeCentreAssignationRepository.findbyCommuneAndPersonne(user.getStructure().getCommune().getId(),communeCentreAssignationPaylaodWeb.getPersonneId());
|
Optional<CommuneCentreAssignationPaylaodWeb> communeCentreAssignationPaylaodWebOptional=communeCentreAssignationRepository.findbyCommuneAndPersonne(user.getStructure().getCommune().getId(),communeCentreAssignationPaylaodWeb.getPersonneId());
|
||||||
if(communeCentreAssignationPaylaodWeb.getId()==null && communeCentreAssignationPaylaodWebOptional.isPresent()){
|
if(communeCentreAssignationPaylaodWeb.getId()==null && communeCentreAssignationPaylaodWebOptional.isPresent()){
|
||||||
throw new BadRequestException("Impossible de créer une nouvelle assignation de centre: Le contribuable est déjà assigné au centre : "+communeCentreAssignationPaylaodWebOptional.get().getStructureNom());
|
throw new NotAcceptableException("Impossible de créer une nouvelle assignation de centre: Le contribuable est déjà assigné au centre : "+communeCentreAssignationPaylaodWebOptional.get().getStructureNom());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -71,6 +72,9 @@ public class CommuneCentreAssignationServiceImpl implements CommuneCentreAssigna
|
|||||||
return communeCentreAssignationRepository.findUnique(communeCentreAssignation.getId()).orElse(null);
|
return communeCentreAssignationRepository.findUnique(communeCentreAssignation.getId()).orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public CommuneCentreAssignationPaylaodWeb updateCommuneCentreAssignation(Long id,CommuneCentreAssignationPaylaodWeb communeCentreAssignationPaylaodWeb) throws NotFoundException {
|
public CommuneCentreAssignationPaylaodWeb updateCommuneCentreAssignation(Long id,CommuneCentreAssignationPaylaodWeb communeCentreAssignationPaylaodWeb) throws NotFoundException {
|
||||||
if (communeCentreAssignationPaylaodWeb.getId() == null) {
|
if (communeCentreAssignationPaylaodWeb.getId() == null) {
|
||||||
@@ -152,6 +156,29 @@ public class CommuneCentreAssignationServiceImpl implements CommuneCentreAssigna
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Optional<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationByPersonneIdCommune(User user,Long personneId) {
|
||||||
|
|
||||||
|
if (user.getStructure() == null) {
|
||||||
|
throw new BadRequestException("Impossible de récuperer l'assignation: Votre centre doit être précisé.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (user.getStructure().getCommune() == null) {
|
||||||
|
throw new BadRequestException("Impossible de récuperer une assignation: votre commune doit être précisée.");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (personneId == null) {
|
||||||
|
throw new BadRequestException("Impossible de récuperer l'assignation: Le contribuable doit être précisée.");
|
||||||
|
}else {
|
||||||
|
if(!personneRepository.existsById(personneId))
|
||||||
|
throw new BadRequestException("Impossible de récuperer l'assignation: Le contribuable précisée n'existe pas.");
|
||||||
|
}
|
||||||
|
|
||||||
|
Optional<CommuneCentreAssignationPaylaodWeb> communeCentreAssignationPaylaodWebOptional=communeCentreAssignationRepository.findbyCommuneAndPersonne(user.getStructure().getCommune().getId(),personneId);
|
||||||
|
|
||||||
|
return communeCentreAssignationPaylaodWebOptional;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Page<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationListByCentrePageable(Long centreId, Pageable pageable) {
|
public Page<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationListByCentrePageable(Long centreId, Pageable pageable) {
|
||||||
return communeCentreAssignationRepository.findByStructureId(centreId,pageable);
|
return communeCentreAssignationRepository.findByStructureId(centreId,pageable);
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ public class DeclarationNcServiceImpl implements DeclarationNcService {
|
|||||||
if (!structureRepository.existsById(declarationNcPayloadWeb.getStructureId())) {
|
if (!structureRepository.existsById(declarationNcPayloadWeb.getStructureId())) {
|
||||||
throw new BadRequestException("Veuillez préciser le centre.");
|
throw new BadRequestException("Veuillez préciser le centre.");
|
||||||
}
|
}
|
||||||
|
List<DeclarationNcPayloadWeb> declarationNcPayloadWebs= declarationNcRepository.findAllDeclarationNcByNcNotPersonneToDto(declarationNcPayloadWeb.getNc(),declarationNcPayloadWeb.getPersonneId());
|
||||||
|
|
||||||
|
if (!declarationNcPayloadWebs.isEmpty()) {
|
||||||
|
throw new BadRequestException("Ce numéro Contribuable est déjà rattaché à un autre IFU");
|
||||||
|
}
|
||||||
|
|
||||||
DeclarationNc declarationNc= entityFromPayLoadService.getDeclarationNcFromPayLoadWeb(declarationNcPayloadWeb);
|
DeclarationNc declarationNc= entityFromPayLoadService.getDeclarationNcFromPayLoadWeb(declarationNcPayloadWeb);
|
||||||
declarationNc =declarationNcRepository.save(declarationNc);
|
declarationNc =declarationNcRepository.save(declarationNc);
|
||||||
|
|||||||
@@ -109,21 +109,66 @@ public class DonneesImpositionTfuServiceImpl implements DonneesImpositionTfuServ
|
|||||||
return impositionsTfuRepository.findByIdToDto(impositionsTfu.getId()).orElse(null);
|
return impositionsTfuRepository.findByIdToDto(impositionsTfu.getId()).orElse(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleNonBatieUneParcelle(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb, Long userId,Long parcelleId) {
|
||||||
|
Integer nb= donneesImpositionTfuRepository.genererDonneesTfuNonBatie(impositionsTfuPaylaodWeb.getId(),userId,parcelleId);
|
||||||
|
|
||||||
|
ImpositionsTfu impositionsTfu = entityFromPayLoadService.getImpositionsTfuFromPayLoadWeb(impositionsTfuPaylaodWeb);
|
||||||
|
impositionsTfu.setStatusAvis(StatusAvis.TFU_FNB_GENERE);
|
||||||
|
|
||||||
|
impositionsTfu.setNombreAvisFnb(nb);
|
||||||
|
|
||||||
|
impositionsTfuRepository.save(impositionsTfu);
|
||||||
|
|
||||||
|
return impositionsTfuRepository.findByIdToDto(impositionsTfu.getId()).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleBatie(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb, Long userId) {
|
public ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleBatie(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb, Long userId) {
|
||||||
|
|
||||||
Integer nbb= donneesImpositionTfuRepository.genererDonneesTfuBatie(impositionsTfuPaylaodWeb.getId(),userId);
|
Integer nbb= donneesImpositionTfuRepository.genererDonneesTfuBatie(impositionsTfuPaylaodWeb.getId(),userId);
|
||||||
|
|
||||||
|
Integer nbirfbtPlusieursBati = donneesImpositionTfuRepository.majDonneesTfuBatiePlusieursBatiment(impositionsTfuPaylaodWeb.getId());
|
||||||
|
|
||||||
Integer nbulo= donneesImpositionTfuRepository.genererDonneesTfuBatieUniteLogement(impositionsTfuPaylaodWeb.getId(),userId);
|
Integer nbulo= donneesImpositionTfuRepository.genererDonneesTfuBatieUniteLogement(impositionsTfuPaylaodWeb.getId(),userId);
|
||||||
|
|
||||||
Integer nbirfbt= donneesImpositionTfuRepository.genererDonneesIrfBatie(impositionsTfuPaylaodWeb.getId(),userId);
|
Integer nbirfbt= donneesImpositionTfuRepository.genererDonneesIrfBatie(impositionsTfuPaylaodWeb.getId(),userId);
|
||||||
//
|
|
||||||
Integer nbirfulo= donneesImpositionTfuRepository.genererDonneesIrfBatieUniteLogement(impositionsTfuPaylaodWeb.getId(),userId);
|
Integer nbirfulo= donneesImpositionTfuRepository.genererDonneesIrfBatieUniteLogement(impositionsTfuPaylaodWeb.getId(),userId);
|
||||||
//
|
|
||||||
Integer nbsrtbbt= donneesImpositionTfuRepository.genererDonneesSrtbBatie(impositionsTfuPaylaodWeb.getId(),userId);
|
Integer nbsrtbbt= donneesImpositionTfuRepository.genererDonneesSrtbBatie(impositionsTfuPaylaodWeb.getId(),userId);
|
||||||
//
|
|
||||||
Integer nbsrtbulo= donneesImpositionTfuRepository.genererDonneesSrtbBatieUniteLogement(impositionsTfuPaylaodWeb.getId(),userId);
|
|
||||||
|
ImpositionsTfu impositionsTfu = entityFromPayLoadService.getImpositionsTfuFromPayLoadWeb(impositionsTfuPaylaodWeb);
|
||||||
|
impositionsTfu.setStatusAvis(StatusAvis.GENERE);
|
||||||
|
|
||||||
|
impositionsTfu.setNombreAvis(nbb+nbulo+ (impositionsTfu.getNombreAvisFnb()==null?0:impositionsTfu.getNombreAvisFnb()));
|
||||||
|
impositionsTfu.setNombreAvisBatiment(nbb);
|
||||||
|
impositionsTfu.setNombreAvisUniteLog(nbulo);
|
||||||
|
|
||||||
|
impositionsTfuRepository.save(impositionsTfu);
|
||||||
|
|
||||||
|
return impositionsTfuRepository.findByIdToDto(impositionsTfu.getId()).orElse(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleBatieUneParcelle(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb, Long userId, Long parcelleId) {
|
||||||
|
|
||||||
|
Integer nbb= donneesImpositionTfuRepository.genererDonneesTfuBatie(impositionsTfuPaylaodWeb.getId(),userId,parcelleId);
|
||||||
|
|
||||||
|
Integer nbirfbtPlusieursBati = donneesImpositionTfuRepository.majDonneesTfuBatiePlusieursBatiment(impositionsTfuPaylaodWeb.getId(),parcelleId);
|
||||||
|
|
||||||
|
Integer nbulo= donneesImpositionTfuRepository.genererDonneesTfuBatieUniteLogement(impositionsTfuPaylaodWeb.getId(),userId,parcelleId);
|
||||||
|
|
||||||
|
Integer nbirfbt= donneesImpositionTfuRepository.genererDonneesIrfBatie(impositionsTfuPaylaodWeb.getId(),userId,parcelleId);
|
||||||
|
|
||||||
|
Integer nbirfulo= donneesImpositionTfuRepository.genererDonneesIrfBatieUniteLogement(impositionsTfuPaylaodWeb.getId(),userId,parcelleId);
|
||||||
|
|
||||||
|
Integer nbsrtbbt= donneesImpositionTfuRepository.genererDonneesSrtbBatie(impositionsTfuPaylaodWeb.getId(),userId,parcelleId);
|
||||||
|
|
||||||
|
|
||||||
ImpositionsTfu impositionsTfu = entityFromPayLoadService.getImpositionsTfuFromPayLoadWeb(impositionsTfuPaylaodWeb);
|
ImpositionsTfu impositionsTfu = entityFromPayLoadService.getImpositionsTfuFromPayLoadWeb(impositionsTfuPaylaodWeb);
|
||||||
|
|||||||
@@ -28,7 +28,11 @@ public interface CommuneCentreAssignationService {
|
|||||||
|
|
||||||
Optional<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationById(Long id);
|
Optional<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationById(Long id);
|
||||||
|
|
||||||
|
Optional<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationByPersonneIdCommune(User user,Long personneId);
|
||||||
|
|
||||||
|
|
||||||
Page<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationListByCentrePageable(Long centreId, Pageable pageable);
|
Page<CommuneCentreAssignationPaylaodWeb> getCommuneCentreAssignationListByCentrePageable(Long centreId, Pageable pageable);
|
||||||
|
|
||||||
|
|
||||||
|
// public CommuneCentreAssignationPaylaodWeb getCommuneCentreAssignationPersonneCommune(User user, Long personneId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ public interface DonneesImpositionTfuService {
|
|||||||
|
|
||||||
ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleBatie(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb,Long userId);
|
ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleBatie(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb,Long userId);
|
||||||
ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleNonBatie(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb,Long userId);
|
ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleNonBatie(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb,Long userId);
|
||||||
|
public ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleNonBatieUneParcelle(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb, Long userId,Long parcelleId);
|
||||||
List<DonneesImpositionPaylaodWeb> getDonneesFiscalesByImposition(Long impositionsId);
|
List<DonneesImpositionPaylaodWeb> getDonneesFiscalesByImposition(Long impositionsId);
|
||||||
List<DonneesImpositionTfu> getDonneesFiscalesByImpositionArrondissement(Long impositionsId,Long arrondissementId);
|
List<DonneesImpositionTfu> getDonneesFiscalesByImpositionArrondissement(Long impositionsId,Long arrondissementId);
|
||||||
Page<DonneesImpositionPaylaodWeb> getDonneesFiscalesByImpositionTfuIdPageable(Long impositionsTfuId, Pageable pageable);
|
Page<DonneesImpositionPaylaodWeb> getDonneesFiscalesByImpositionTfuIdPageable(Long impositionsTfuId, Pageable pageable);
|
||||||
@@ -47,5 +48,7 @@ public interface DonneesImpositionTfuService {
|
|||||||
|
|
||||||
List<DonneesImpositionPaylaodWeb> getDonneesFiscalesByPersonneId(Long personneId);
|
List<DonneesImpositionPaylaodWeb> getDonneesFiscalesByPersonneId(Long personneId);
|
||||||
|
|
||||||
|
public ImpositionsTfuPaylaodWeb genererDonneesFiscalesParcelleBatieUneParcelle(ImpositionsTfuPaylaodWeb impositionsTfuPaylaodWeb, Long userId, Long parcelleId);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ public class CommuneCentreAssignationPaylaodWeb {
|
|||||||
private String parcelleContactQ;
|
private String parcelleContactQ;
|
||||||
private String parcelleContactI;
|
private String parcelleContactI;
|
||||||
private String parcelleContactP;
|
private String parcelleContactP;
|
||||||
|
private String adresseContact;
|
||||||
|
|
||||||
public CommuneCentreAssignationPaylaodWeb(Long id, String code, String nom, Long communeId, String communeCode, String communeNom, Long structureId, String structureCode, String structureNom, Long personneId, String personneNom, String personnePrenom, String personneRaisonSociale, String personneIfu, String personneNc, String personneNpi, Long parcelleContactId, String parcelleContactQuartierCode, String parcelleContactQ, String parcelleContactI, String parcelleContactP) {
|
public CommuneCentreAssignationPaylaodWeb(Long id, Long communeId, String communeCode, String communeNom, Long structureId, String structureCode, String structureNom, Long personneId, String personneNom, String personnePrenom, String personneRaisonSociale, String personneIfu, String personneNc, String personneNpi, Long parcelleContactId, String parcelleContactQuartierCode, String parcelleContactQ, String parcelleContactI, String parcelleContactP,
|
||||||
|
String adresseContact) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.code = code;
|
|
||||||
this.nom = nom;
|
|
||||||
this.communeId = communeId;
|
this.communeId = communeId;
|
||||||
this.communeCode = communeCode;
|
this.communeCode = communeCode;
|
||||||
this.communeNom = communeNom;
|
this.communeNom = communeNom;
|
||||||
@@ -50,5 +50,6 @@ public class CommuneCentreAssignationPaylaodWeb {
|
|||||||
this.parcelleContactQ = parcelleContactQ;
|
this.parcelleContactQ = parcelleContactQ;
|
||||||
this.parcelleContactI = parcelleContactI;
|
this.parcelleContactI = parcelleContactI;
|
||||||
this.parcelleContactP = parcelleContactP;
|
this.parcelleContactP = parcelleContactP;
|
||||||
|
this.adresseContact=adresseContact;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,11 @@ public class DeclarationNcPayloadWeb {
|
|||||||
private LocalDate dateDerniereDeclaration;
|
private LocalDate dateDerniereDeclaration;
|
||||||
private LocalDate dateDeclarationNc;
|
private LocalDate dateDeclarationNc;
|
||||||
private String nc;
|
private String nc;
|
||||||
|
private String q;
|
||||||
|
private String i;
|
||||||
|
private String p;
|
||||||
|
private String numeroTitreFoncier;
|
||||||
|
private String nup;
|
||||||
private Long structureId;
|
private Long structureId;
|
||||||
private String structureCode;
|
private String structureCode;
|
||||||
private String structureNom;
|
private String structureNom;
|
||||||
@@ -24,7 +29,14 @@ public class DeclarationNcPayloadWeb {
|
|||||||
private String personneRaisonSociale;
|
private String personneRaisonSociale;
|
||||||
private String observation;
|
private String observation;
|
||||||
|
|
||||||
public DeclarationNcPayloadWeb(Long id, LocalDate dateDerniereDeclaration, LocalDate dateDeclarationNc, String nc, Long structureId, String structureCode, String structureNom, Long personneId, String personneNom, String personnePrenom, String personneRaisonSociale, String observation) {
|
public DeclarationNcPayloadWeb(Long id, LocalDate dateDerniereDeclaration, LocalDate dateDeclarationNc, String nc, Long structureId, String structureCode, String structureNom, Long personneId, String personneNom, String personnePrenom, String personneRaisonSociale,
|
||||||
|
String observation,
|
||||||
|
String q,
|
||||||
|
String i,
|
||||||
|
String p,
|
||||||
|
String numeroTitreFoncier,
|
||||||
|
String nup
|
||||||
|
) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.dateDerniereDeclaration = dateDerniereDeclaration;
|
this.dateDerniereDeclaration = dateDerniereDeclaration;
|
||||||
this.dateDeclarationNc = dateDeclarationNc;
|
this.dateDeclarationNc = dateDeclarationNc;
|
||||||
@@ -36,6 +48,11 @@ public class DeclarationNcPayloadWeb {
|
|||||||
this.personneNom = personneNom;
|
this.personneNom = personneNom;
|
||||||
this.personnePrenom = personnePrenom;
|
this.personnePrenom = personnePrenom;
|
||||||
this.personneRaisonSociale = personneRaisonSociale;
|
this.personneRaisonSociale = personneRaisonSociale;
|
||||||
|
this.q = q;
|
||||||
|
this.i = i;
|
||||||
|
this.p = p;
|
||||||
|
this.numeroTitreFoncier = numeroTitreFoncier;
|
||||||
this.observation = observation;
|
this.observation = observation;
|
||||||
|
this.nup = nup;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,497 @@
|
|||||||
|
/*CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_srtb_batie(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_montant_srtb NUMERIC;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
-- récupération de l'année
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
join exercice ex on ex.id =it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
|
||||||
|
select value
|
||||||
|
into STRICT v_montant_srtb
|
||||||
|
from parameters
|
||||||
|
where name ='TAXE_SRTB';
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO donnees_imposition_tfu(
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at ,
|
||||||
|
created_by ,
|
||||||
|
"source",
|
||||||
|
updated_at ,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, ---70% de la surperficie au sol de la parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, ----tfu correspondant au 70%
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, ----------valeur locative administrative
|
||||||
|
tfu_superficie_au_sol_reel, ----tfu correspondant à la superficie au sol reelle
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe, ----tfu finale
|
||||||
|
taux_tfu, ----taux tfu batie
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id,
|
||||||
|
superficie_au_sol_loue
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
pers.ifu,
|
||||||
|
pers.npi,
|
||||||
|
pers.tel1,
|
||||||
|
pers.email,
|
||||||
|
pers.nom,
|
||||||
|
pers.prenom,
|
||||||
|
pers.raison_sociale,
|
||||||
|
pers.adresse,
|
||||||
|
ep.representant_tel,
|
||||||
|
ep.representant_nom,
|
||||||
|
ep.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= ep.date_debut_exemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(ep.date_fin_exemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= eb.date_debut_excemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(eb.date_fin_excemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
eb.nombre_piscine,
|
||||||
|
eb.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'SRTB',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
case -------valeur_batiment
|
||||||
|
WHEN eb.valeur_batiment_reel IS NOT NULL AND eb.valeur_batiment_reel <> 0 THEN eb.valeur_batiment_reel
|
||||||
|
WHEN eb.valeur_batiment_calcule IS NOT NULL AND eb.valeur_batiment_calcule <> 0 THEN eb.valeur_batiment_calcule
|
||||||
|
WHEN eb.valeur_batiment_estime IS NOT NULL AND eb.valeur_batiment_estime <> 0 THEN eb.valeur_batiment_estime
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
brb.valeur_locative,
|
||||||
|
case ----- montant_loyer_annuel
|
||||||
|
WHEN eb.montant_locatif_annuel_declare IS NOT NULL AND eb.montant_locatif_annuel_declare <> 0 THEN eb.montant_locatif_annuel_declare
|
||||||
|
WHEN eb.montant_locatif_annuel_calcule IS NOT NULL AND eb.montant_locatif_annuel_calcule <> 0 THEN eb.montant_locatif_annuel_calcule
|
||||||
|
WHEN eb.montant_locatif_annuel_estime IS NOT NULL AND eb.montant_locatif_annuel_estime <> 0 THEN eb.montant_locatif_annuel_estime
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
false,
|
||||||
|
current_date ,
|
||||||
|
p_user_id ,
|
||||||
|
'FISCAD',
|
||||||
|
current_date ,
|
||||||
|
p_user_id,
|
||||||
|
eb.categorie_usage,
|
||||||
|
0,---superficie_au_sol_70pour100
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
eb.superficie_au_sol * brb.valeur_locative,
|
||||||
|
0, ------ valeur_locative_adm : en attente de update
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
v_montant_srtb,
|
||||||
|
0,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
null,
|
||||||
|
eb.superficie_louee
|
||||||
|
FROM parcelle p
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT DISTINCT ON (parcelle_id)
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
ORDER BY parcelle_id, date_enquete DESC, id DESC
|
||||||
|
) ep ON ep.parcelle_id = p.id
|
||||||
|
LEFT JOIN personne pers
|
||||||
|
ON pers.id = ep.personne_id
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
--JOIN secteur_decoupage sd ON sd.quartier_id = q.id
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (quartier_id)
|
||||||
|
quartier_id,
|
||||||
|
secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
ORDER BY quartier_id
|
||||||
|
) sd ON sd.quartier_id = q.id
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (batiment_id)
|
||||||
|
batiment_id,
|
||||||
|
superficie_au_sol,
|
||||||
|
nombre_piscine,
|
||||||
|
categorie_batiment_id,
|
||||||
|
date_enquete,
|
||||||
|
montant_locatif_annuel_declare,
|
||||||
|
montant_locatif_annuel_calcule,
|
||||||
|
montant_locatif_annuel_estime,
|
||||||
|
date_debut_excemption,
|
||||||
|
date_fin_excemption,
|
||||||
|
valeur_batiment_reel,
|
||||||
|
valeur_batiment_calcule,
|
||||||
|
valeur_batiment_estime,
|
||||||
|
u.categorie_usage,
|
||||||
|
superficie_louee
|
||||||
|
FROM enquete_batiment eb
|
||||||
|
join usage u on u.id=eb.usage_id
|
||||||
|
ORDER BY batiment_id, date_enquete DESC, eb.id DESC
|
||||||
|
) eb ON eb.batiment_id = b.id
|
||||||
|
JOIN categorie_batiment cb
|
||||||
|
ON cb.id = eb.categorie_batiment_id
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul
|
||||||
|
WHERE ul.batiment_id = b.id
|
||||||
|
)
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$; */
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_srtb_batie(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
|
||||||
|
v_montant_srtb NUMERIC;
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- 1. année + structure
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
-- 2. paramètre (une seule requête)
|
||||||
|
SELECT value
|
||||||
|
INTO STRICT v_montant_srtb
|
||||||
|
FROM parameters
|
||||||
|
WHERE name = 'TAXE_SRTB';
|
||||||
|
|
||||||
|
-- 3. INSERT optimisé (SANS DISTINCT ON, SANS UPDATE)
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement, nom_departement,
|
||||||
|
code_commune, nom_commune,
|
||||||
|
code_arrondissement, nom_arrondissement,
|
||||||
|
code_quartier_village, nom_quartier_village,
|
||||||
|
q, ilot, parcelle, nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
ifu, npi, tel_prop, email_prop,
|
||||||
|
nom_prop, prenom_prop, raison_sociale, adresse_prop,
|
||||||
|
tel_sc, nom_sc, prenom_sc,
|
||||||
|
longitude, latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
standing_bat, categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
source,
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc,
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc,
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm,
|
||||||
|
tfu_superficie_au_sol_reel,
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe,
|
||||||
|
taux_tfu,
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id,
|
||||||
|
superficie_au_sol_loue,
|
||||||
|
personne_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code, d.nom,
|
||||||
|
c.code, c.nom,
|
||||||
|
a.code, a.nom,
|
||||||
|
q.code, q.nom,
|
||||||
|
p.q, p.i, p.p, p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
|
||||||
|
pers.ifu, pers.npi, pers.tel1, pers.email,
|
||||||
|
pers.nom, pers.prenom, pers.raison_sociale, pers.adresse,
|
||||||
|
ep.representant_tel, ep.representant_nom, ep.representant_prenom,
|
||||||
|
|
||||||
|
p.longitude, p.latitude,
|
||||||
|
TRUE,
|
||||||
|
|
||||||
|
(v_today BETWEEN ep.date_debut_exemption AND COALESCE(ep.date_fin_exemption, v_today)),
|
||||||
|
(v_today BETWEEN eb.date_debut_excemption AND COALESCE(eb.date_fin_excemption, v_today)),
|
||||||
|
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
|
||||||
|
COALESCE(eb.nombre_piscine, 0),
|
||||||
|
eb.date_enquete,
|
||||||
|
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'SRTB',
|
||||||
|
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
|
||||||
|
-- valeur bâtiment optimisée
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.valeur_batiment_reel,0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule,0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime,0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
|
||||||
|
brb.valeur_locative,
|
||||||
|
|
||||||
|
-- loyer optimisé
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.montant_locatif_annuel_declare,0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule,0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime,0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today, p_user_id, 'FISCAD',
|
||||||
|
v_today, p_user_id,
|
||||||
|
eb.categorie_usage,
|
||||||
|
|
||||||
|
0, 0, 0,
|
||||||
|
|
||||||
|
eb.superficie_au_sol * brb.valeur_locative,
|
||||||
|
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- 🔥 SRTB = valeur directe (pas de calcul)
|
||||||
|
v_montant_srtb,
|
||||||
|
|
||||||
|
0,
|
||||||
|
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
NULL,
|
||||||
|
eb.superficie_louee,
|
||||||
|
ep.personne_id
|
||||||
|
|
||||||
|
FROM parcelle p
|
||||||
|
|
||||||
|
-- dernière enquête parcelle
|
||||||
|
LEFT JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM enquete e
|
||||||
|
WHERE e.parcelle_id = p.id
|
||||||
|
ORDER BY date_enquete DESC, id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) ep ON TRUE
|
||||||
|
|
||||||
|
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
-- structure via secteur
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
WHERE quartier_id = q.id
|
||||||
|
LIMIT 1
|
||||||
|
) sd ON TRUE
|
||||||
|
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN structure st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
|
||||||
|
-- 🔥 remplace DISTINCT ON
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT eb2.*,u.categorie_usage
|
||||||
|
FROM enquete_batiment eb2
|
||||||
|
LEFT JOIN usage u ON u.id = eb2.usage_id
|
||||||
|
WHERE eb2.batiment_id = b.id
|
||||||
|
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eb ON TRUE
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb ON cb.id = eb.categorie_batiment_id
|
||||||
|
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul
|
||||||
|
WHERE ul.batiment_id = b.id
|
||||||
|
)
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,754 @@
|
|||||||
|
/*CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_tfu NUMERIC;
|
||||||
|
v_taux_valeur_locat_prof NUMERIC;
|
||||||
|
v_tfu_piscine_unitaire NUMERIC;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
-- récupération de l'année
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
join exercice ex on ex.id =it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
|
||||||
|
select value
|
||||||
|
into strict v_taux_defaut_sup_sol
|
||||||
|
from parameters
|
||||||
|
where name ='TAUX_DEFAUT_SUPERFICIE_AU_SOL';
|
||||||
|
|
||||||
|
select value
|
||||||
|
into STRICT v_taux_tfu
|
||||||
|
from parameters
|
||||||
|
where name ='TAUX_TFU';
|
||||||
|
|
||||||
|
|
||||||
|
select value
|
||||||
|
into STRICT v_taux_valeur_locat_prof
|
||||||
|
from parameters
|
||||||
|
where name ='TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE';
|
||||||
|
|
||||||
|
select value
|
||||||
|
into STRICT v_tfu_piscine_unitaire
|
||||||
|
from parameters
|
||||||
|
where name ='TFU_PAR_PISCINE';
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO donnees_imposition_tfu(
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at ,
|
||||||
|
created_by ,
|
||||||
|
"source",
|
||||||
|
updated_at ,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, ---70% de la surperficie au sol de la parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, ----tfu correspondant au 70%
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, ----------valeur locative administrative
|
||||||
|
tfu_superficie_au_sol_reel, ----tfu correspondant à la superficie au sol reelle
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe, ----tfu finale
|
||||||
|
taux_tfu, ----taux tfu batie
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
pers.ifu,
|
||||||
|
pers.npi,
|
||||||
|
pers.tel1,
|
||||||
|
pers.email,
|
||||||
|
pers.nom,
|
||||||
|
pers.prenom,
|
||||||
|
pers.raison_sociale,
|
||||||
|
pers.adresse,
|
||||||
|
ep.representant_tel,
|
||||||
|
ep.representant_nom,
|
||||||
|
ep.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= ep.date_debut_exemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(ep.date_fin_exemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= eb.date_debut_excemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(eb.date_fin_excemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
eb.nombre_piscine,
|
||||||
|
eb.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'TFU',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.valeur_locative,
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
false,
|
||||||
|
current_date ,
|
||||||
|
p_user_id ,
|
||||||
|
'FISCAD',
|
||||||
|
current_date ,
|
||||||
|
p_user_id,
|
||||||
|
eb.categorie_usage,
|
||||||
|
p.superficie*v_taux_defaut_sup_sol/100,---superficie_au_sol_70pour100
|
||||||
|
case ----valeur_locative_adm70pour100
|
||||||
|
when eb.categorie_usage = 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
case ----tfu calcule 70 pour 100 superficie parcelle
|
||||||
|
when eb.categorie_usage= 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative * v_taux_tfu/100
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
case -----valeur_locative_adm_sup_reel
|
||||||
|
when eb.categorie_usage='HABITATION' then eb.superficie_au_sol * brb.valeur_locative
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
0, ------ valeur_locative_adm : en attente de update
|
||||||
|
case -----tfu_superficie_au_sol_reel
|
||||||
|
when eb.categorie_usage='HABITATION' then eb.superficie_au_sol * brb.valeur_locative * v_taux_tfu/100 +eb.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
eb.nombre_piscine * v_tfu_piscine_unitaire,
|
||||||
|
0,
|
||||||
|
v_taux_tfu,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
null
|
||||||
|
FROM parcelle p
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT DISTINCT ON (parcelle_id)
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
ORDER BY parcelle_id, date_enquete DESC, id DESC
|
||||||
|
) ep ON ep.parcelle_id = p.id
|
||||||
|
LEFT JOIN personne pers
|
||||||
|
ON pers.id = ep.personne_id
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
--JOIN secteur_decoupage sd ON sd.quartier_id = q.id
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (quartier_id)
|
||||||
|
quartier_id,
|
||||||
|
secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
ORDER BY quartier_id
|
||||||
|
) sd ON sd.quartier_id = q.id
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (batiment_id)
|
||||||
|
batiment_id,
|
||||||
|
superficie_au_sol,
|
||||||
|
nombre_piscine,
|
||||||
|
categorie_batiment_id,
|
||||||
|
date_enquete,
|
||||||
|
montant_locatif_annuel_declare,
|
||||||
|
montant_locatif_annuel_calcule,
|
||||||
|
montant_locatif_annuel_estime,
|
||||||
|
date_debut_excemption,
|
||||||
|
date_fin_excemption,
|
||||||
|
valeur_batiment_reel,
|
||||||
|
valeur_batiment_calcule,
|
||||||
|
valeur_batiment_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_batiment eb
|
||||||
|
join usage u on u.id=eb.usage_id
|
||||||
|
ORDER BY batiment_id, date_enquete DESC, eb.id DESC
|
||||||
|
) eb ON eb.batiment_id = b.id
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb
|
||||||
|
ON cb.id = eb.categorie_batiment_id
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul
|
||||||
|
WHERE ul.batiment_id = b.id
|
||||||
|
)
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
UPDATE donnees_imposition_tfu dtfu
|
||||||
|
SET
|
||||||
|
valeur_locative_adm =
|
||||||
|
CASE
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat <> 0
|
||||||
|
THEN valeur_locative_adm_sup_reel
|
||||||
|
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat = 0
|
||||||
|
THEN valeur_locative_adm_taux_prop_parc
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0
|
||||||
|
THEN valeur_batiment * (v_taux_valeur_locat_prof/100)
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0
|
||||||
|
THEN montant_loyer_annuel
|
||||||
|
END,
|
||||||
|
|
||||||
|
montant_taxe =
|
||||||
|
CASE
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat <> 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
THEN valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat = 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
THEN valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
||||||
|
THEN valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < montant_loyer_annuel * (v_taux_tfu/100)
|
||||||
|
THEN montant_loyer_annuel * (v_taux_tfu/100)
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
END
|
||||||
|
WHERE impositions_tfu_id = p_impositions_tfu_id
|
||||||
|
AND batie = TRUE
|
||||||
|
AND NOT EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul
|
||||||
|
WHERE ul.batiment_id = dtfu.batiment_id
|
||||||
|
);
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;*/
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_tfu NUMERIC;
|
||||||
|
v_taux_tfu_ratio NUMERIC; -- v_taux_tfu / 100 (pré-calculé)
|
||||||
|
v_taux_valeur_locat_prof NUMERIC;
|
||||||
|
v_taux_vlp_ratio NUMERIC; -- v_taux_valeur_locat_prof / 100 (pré-calculé)
|
||||||
|
v_tfu_piscine_unitaire NUMERIC;
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 1. Récupération de l'année et de la structure (inchangée)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 2. Récupération des 4 paramètres en UNE seule requête
|
||||||
|
-- (évite 4 accès séquentiels à la table parameters)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_DEFAUT_SUPERFICIE_AU_SOL'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_TFU'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TFU_PAR_PISCINE')
|
||||||
|
INTO STRICT
|
||||||
|
v_taux_defaut_sup_sol,
|
||||||
|
v_taux_tfu,
|
||||||
|
v_taux_valeur_locat_prof,
|
||||||
|
v_tfu_piscine_unitaire
|
||||||
|
FROM parameters
|
||||||
|
WHERE name IN (
|
||||||
|
'TAUX_DEFAUT_SUPERFICIE_AU_SOL',
|
||||||
|
'TAUX_TFU',
|
||||||
|
'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE',
|
||||||
|
'TFU_PAR_PISCINE'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Ratios pré-calculés pour éviter la division répétée dans le SELECT
|
||||||
|
v_taux_tfu_ratio := v_taux_tfu / 100.0;
|
||||||
|
v_taux_vlp_ratio := v_taux_valeur_locat_prof / 100.0;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 3. INSERT avec calcul complet de valeur_locative_adm et montant_taxe
|
||||||
|
-- → supprime l'UPDATE post-INSERT (économie d'un second scan de table)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
"source",
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, -- 70 % superficie parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, -- TFU à 70 %
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, -- valeur locative administrative finale
|
||||||
|
tfu_superficie_au_sol_reel,
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe, -- TFU finale
|
||||||
|
taux_tfu,
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id,
|
||||||
|
personne_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
pers.ifu,
|
||||||
|
pers.npi,
|
||||||
|
pers.tel1,
|
||||||
|
pers.email,
|
||||||
|
pers.nom,
|
||||||
|
pers.prenom,
|
||||||
|
pers.raison_sociale,
|
||||||
|
pers.adresse,
|
||||||
|
ep.representant_tel,
|
||||||
|
ep.representant_nom,
|
||||||
|
ep.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
-- exonere parcelle
|
||||||
|
(v_today BETWEEN ep.date_debut_exemption
|
||||||
|
AND COALESCE(ep.date_fin_exemption, v_today)),
|
||||||
|
-- exonere batiment
|
||||||
|
(v_today BETWEEN eb.date_debut_excemption
|
||||||
|
AND COALESCE(eb.date_fin_excemption, v_today)),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
eb.nombre_piscine,
|
||||||
|
eb.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'TFU',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
-- valeur_batiment : première valeur non nulle non zéro
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.valeur_locative,
|
||||||
|
-- montant_loyer_annuel
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
eb.categorie_usage,
|
||||||
|
|
||||||
|
-- superficie_au_sol_taux_prop_parc (70 % parcelle)
|
||||||
|
p.superficie * v_taux_defaut_sup_sol / 100.0,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_taux_prop_parc
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_calcule_taux_prop_parc
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative * v_taux_tfu_ratio
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_sup_reel
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN eb.superficie_au_sol * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 CORRECTION : valeur_locative_adm avec tests explicites
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
CASE
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol <> 0
|
||||||
|
THEN eb.superficie_au_sol * brb.valeur_locative
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol = 0
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_batiment <> 0
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) <> 0
|
||||||
|
THEN COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0)
|
||||||
|
* v_taux_vlp_ratio
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_batiment = 0
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) = 0
|
||||||
|
THEN COALESCE(NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0), 0)
|
||||||
|
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_superficie_au_sol_reel
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN eb.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio * eb.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_piscine
|
||||||
|
eb.nombre_piscine * v_tfu_piscine_unitaire,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
||||||
|
-- Utilise des CTE inline via expression pour éviter la redondance
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
(
|
||||||
|
-- On matérialise valeur_batiment et valeur_locative une seule fois
|
||||||
|
WITH calc AS (
|
||||||
|
SELECT
|
||||||
|
COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) AS vb,
|
||||||
|
COALESCE(NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0), 0) AS loyer,
|
||||||
|
eb.superficie_au_sol * brb.valeur_locative AS vla_reel,
|
||||||
|
(p.superficie * v_taux_defaut_sup_sol / 100.0)
|
||||||
|
* brb.valeur_locative AS vla_70
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol <> 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vla_reel * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire)
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol = 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vla_70 * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire)
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb <> 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vb * v_taux_vlp_ratio * v_taux_tfu_ratio)
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb = 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.loyer * v_taux_tfu_ratio)
|
||||||
|
|
||||||
|
ELSE brb.tfu_minimum
|
||||||
|
END
|
||||||
|
FROM calc
|
||||||
|
),
|
||||||
|
v_taux_tfu,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
NULL,
|
||||||
|
ep.personne_id
|
||||||
|
FROM parcelle p
|
||||||
|
-- Dernière enquête parcelle
|
||||||
|
LEFT JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
WHERE parcelle_id = p.id
|
||||||
|
ORDER BY date_enquete DESC, id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) ep ON TRUE
|
||||||
|
|
||||||
|
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
-- Rattachement structure via secteur (DISTINCT ON → LATERAL plus lisible)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
WHERE quartier_id = q.id
|
||||||
|
ORDER BY quartier_id
|
||||||
|
LIMIT 1
|
||||||
|
) sd ON TRUE
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
-- Bâtiments sans unités logement (anti-join via LEFT JOIN … IS NULL)
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
LEFT JOIN unite_logement ul_filter ON ul_filter.batiment_id = b.id
|
||||||
|
|
||||||
|
-- Dernière enquête bâtiment
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
eb2.batiment_id,
|
||||||
|
eb2.superficie_au_sol,
|
||||||
|
eb2.nombre_piscine,
|
||||||
|
eb2.categorie_batiment_id,
|
||||||
|
eb2.date_enquete,
|
||||||
|
eb2.montant_locatif_annuel_declare,
|
||||||
|
eb2.montant_locatif_annuel_calcule,
|
||||||
|
eb2.montant_locatif_annuel_estime,
|
||||||
|
eb2.date_debut_excemption,
|
||||||
|
eb2.date_fin_excemption,
|
||||||
|
eb2.valeur_batiment_reel,
|
||||||
|
eb2.valeur_batiment_calcule,
|
||||||
|
eb2.valeur_batiment_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_batiment eb2
|
||||||
|
JOIN usage u ON u.id = eb2.usage_id
|
||||||
|
WHERE eb2.batiment_id = b.id
|
||||||
|
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eb ON TRUE
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb ON cb.id = eb.categorie_batiment_id
|
||||||
|
|
||||||
|
-- Barème RFU bâti (inchangé)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND ul_filter.batiment_id IS NULL -- anti-join : pas d'unité logement
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
@@ -0,0 +1,855 @@
|
|||||||
|
/*CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie_unite_logement(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_tfu NUMERIC;
|
||||||
|
v_taux_valeur_locat_prof NUMERIC;
|
||||||
|
v_tfu_piscine_unitaire NUMERIC;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
-- récupération de l'année
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
join exercice ex on ex.id =it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
|
||||||
|
select value
|
||||||
|
into strict v_taux_defaut_sup_sol
|
||||||
|
from parameters
|
||||||
|
where name ='TAUX_DEFAUT_SUPERFICIE_AU_SOL';
|
||||||
|
|
||||||
|
select value
|
||||||
|
into STRICT v_taux_tfu
|
||||||
|
from parameters
|
||||||
|
where name ='TAUX_TFU';
|
||||||
|
|
||||||
|
RAISE NOTICE 'v_taux_tfu = %', v_taux_tfu;
|
||||||
|
|
||||||
|
select value
|
||||||
|
into STRICT v_taux_valeur_locat_prof
|
||||||
|
from parameters
|
||||||
|
where name ='TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE';
|
||||||
|
|
||||||
|
select value
|
||||||
|
into STRICT v_tfu_piscine_unitaire
|
||||||
|
from parameters
|
||||||
|
where name ='TFU_PAR_PISCINE';
|
||||||
|
|
||||||
|
INSERT INTO donnees_imposition_tfu(
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
num_unite_logement,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
unite_logement_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
superficie_au_sol_ulog,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at ,
|
||||||
|
created_by ,
|
||||||
|
"source",
|
||||||
|
updated_at ,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, ---70% de la surperficie au sol de la parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, ----tfu correspondant au 70%
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, ----------valeur locative administrative
|
||||||
|
tfu_superficie_au_sol_reel, ----tfu correspondant à la superficie au sol reelle
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe, ----tfu finale
|
||||||
|
taux_tfu, ----taux tfu batie
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
ul.nul,
|
||||||
|
eul.ifu,
|
||||||
|
eul.npi,
|
||||||
|
eul.tel1,
|
||||||
|
eul.email,
|
||||||
|
eul.nom,
|
||||||
|
eul.prenom,
|
||||||
|
eul.raison_sociale,
|
||||||
|
eul.adresse,
|
||||||
|
eul.representant_tel,
|
||||||
|
eul.representant_nom,
|
||||||
|
eul.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= ep.date_debut_exemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(ep.date_fin_exemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= eb.date_debut_excemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(eb.date_fin_excemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= eul.date_debut_exemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(eul.date_fin_exemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
CASE
|
||||||
|
WHEN eul.nombre_piscine is null then 0
|
||||||
|
else eul.nombre_piscine
|
||||||
|
END,
|
||||||
|
eul.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'TFU',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
eul.superficie_au_sol,
|
||||||
|
CASE -------valeur_batiment
|
||||||
|
WHEN eul.valeur_unite_logement_reel IS NOT NULL AND eul.valeur_unite_logement_reel <> 0 THEN eul.valeur_unite_logement_reel
|
||||||
|
WHEN eul.valeur_unite_logement_calcule IS NOT NULL AND eul.valeur_unite_logement_calcule <> 0 THEN eul.valeur_unite_logement_calcule
|
||||||
|
WHEN eul.valeur_unite_logement_estime IS NOT NULL AND eul.valeur_unite_logement_estime <> 0 THEN eul.valeur_unite_logement_estime
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
brb.valeur_locative,
|
||||||
|
CASE ----- montant_loyer_annuel
|
||||||
|
WHEN eul.montant_locatif_annuel_declare IS NOT NULL AND eul.montant_locatif_annuel_declare <> 0 THEN eul.montant_locatif_annuel_declare
|
||||||
|
WHEN eul.montant_locatif_annuel_calcule IS NOT NULL AND eul.montant_locatif_annuel_calcule <> 0 THEN eul.montant_locatif_annuel_calcule
|
||||||
|
WHEN eul.montant_locatif_annuel_estime IS NOT NULL AND eul.montant_locatif_annuel_estime <> 0 THEN eul.montant_locatif_annuel_estime
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
false,
|
||||||
|
current_date,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
current_date,
|
||||||
|
p_user_id,
|
||||||
|
eul.categorie_usage,
|
||||||
|
p.superficie * v_taux_defaut_sup_sol/100,---superficie_au_sol_70pour100
|
||||||
|
case ----valeur_locative_adm70pour100
|
||||||
|
when eul.categorie_usage = 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
case ----tfu calcule 70 pour 100 superficie parcelle
|
||||||
|
when eul.categorie_usage= 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative * v_taux_tfu/100
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
case -----valeur_locative_adm_sup_reel
|
||||||
|
when eul.categorie_usage='HABITATION' then eul.superficie_au_sol * brb.valeur_locative
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
0, ------ valeur_locative_adm : en attente de update
|
||||||
|
case -----tfu_superficie_au_sol_reel
|
||||||
|
when eul.categorie_usage='HABITATION' then eul.superficie_au_sol * brb.valeur_locative * 6/100
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
CASE
|
||||||
|
WHEN eul.nombre_piscine is null then 0
|
||||||
|
else eul.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
END,
|
||||||
|
0,
|
||||||
|
v_taux_tfu,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
ul.id
|
||||||
|
FROM parcelle p
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT DISTINCT ON (parcelle_id)
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
ORDER BY parcelle_id, date_enquete DESC, id DESC
|
||||||
|
) ep ON ep.parcelle_id = p.id
|
||||||
|
LEFT JOIN personne pers
|
||||||
|
ON pers.id = ep.personne_id
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
--JOIN secteur_decoupage sd ON sd.quartier_id = q.id
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (quartier_id)
|
||||||
|
quartier_id,
|
||||||
|
secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
ORDER BY quartier_id
|
||||||
|
) sd ON sd.quartier_id = q.id
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (batiment_id)
|
||||||
|
batiment_id,
|
||||||
|
superficie_au_sol,
|
||||||
|
nombre_piscine,
|
||||||
|
categorie_batiment_id,
|
||||||
|
date_enquete,
|
||||||
|
montant_locatif_annuel_declare,
|
||||||
|
montant_locatif_annuel_calcule,
|
||||||
|
montant_locatif_annuel_estime,
|
||||||
|
date_debut_excemption,
|
||||||
|
date_fin_excemption,
|
||||||
|
valeur_batiment_reel,
|
||||||
|
valeur_batiment_calcule,
|
||||||
|
valeur_batiment_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_batiment eb
|
||||||
|
join usage u on u.id=eb.usage_id
|
||||||
|
ORDER BY batiment_id, date_enquete DESC, eb.id DESC
|
||||||
|
) eb ON eb.batiment_id = b.id
|
||||||
|
JOIN unite_logement ul on ul.batiment_id = b.id
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (eult.unite_logement_id)
|
||||||
|
eult.unite_logement_id,
|
||||||
|
pers1.id,
|
||||||
|
pers1.ifu,
|
||||||
|
pers1.npi,
|
||||||
|
pers1.tel1,
|
||||||
|
pers1.email,
|
||||||
|
pers1.nom,
|
||||||
|
pers1.prenom,
|
||||||
|
pers1.raison_sociale,
|
||||||
|
pers1.adresse,
|
||||||
|
eult.nombre_piscine,
|
||||||
|
eult.categorie_batiment_id,
|
||||||
|
eult.superficie_au_sol,
|
||||||
|
eult.superficie_louee,
|
||||||
|
eult.nbre_piece,
|
||||||
|
eult.date_enquete,
|
||||||
|
eult.montant_locatif_annuel_calcule,
|
||||||
|
eult.montant_locatif_annuel_declare,
|
||||||
|
eult.montant_locatif_annuel_estime,
|
||||||
|
eult.date_debut_exemption,
|
||||||
|
eult.date_fin_exemption,
|
||||||
|
eult.representant_nom,
|
||||||
|
eult.representant_prenom,
|
||||||
|
eult.representant_tel,
|
||||||
|
eult.valeur_unite_logement_reel,
|
||||||
|
eult.valeur_unite_logement_calcule,
|
||||||
|
eult.valeur_unite_logement_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_unite_logement eult
|
||||||
|
join usage u on u.id=eult.usage_id
|
||||||
|
left join personne pers1 on pers1.id = eult.personne_id
|
||||||
|
ORDER BY unite_logement_id, date_enquete DESC, eult.id DESC
|
||||||
|
) eul ON eul.unite_logement_id = ul.id
|
||||||
|
JOIN categorie_batiment cb
|
||||||
|
ON cb.id = eul.categorie_batiment_id
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul
|
||||||
|
WHERE ul.batiment_id = b.id
|
||||||
|
)
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
UPDATE donnees_imposition_tfu dtfu
|
||||||
|
SET
|
||||||
|
valeur_locative_adm =
|
||||||
|
CASE
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog <> 0
|
||||||
|
THEN valeur_locative_adm_sup_reel
|
||||||
|
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog = 0
|
||||||
|
THEN valeur_locative_adm_taux_prop_parc
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0
|
||||||
|
THEN valeur_batiment * (v_taux_valeur_locat_prof/100)
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0
|
||||||
|
THEN montant_loyer_annuel
|
||||||
|
END,
|
||||||
|
|
||||||
|
montant_taxe =
|
||||||
|
CASE
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog <> 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
THEN valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
|
||||||
|
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog = 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
THEN valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
||||||
|
THEN valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
|
||||||
|
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0 THEN
|
||||||
|
CASE
|
||||||
|
WHEN tfu_minimum < montant_loyer_annuel * (v_taux_tfu/100)
|
||||||
|
THEN montant_loyer_annuel * (v_taux_tfu/100)
|
||||||
|
ELSE tfu_minimum
|
||||||
|
END
|
||||||
|
END
|
||||||
|
WHERE impositions_tfu_id = p_impositions_tfu_id
|
||||||
|
AND batie = TRUE
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul
|
||||||
|
WHERE ul.batiment_id = dtfu.batiment_id
|
||||||
|
);
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;*/
|
||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie_unite_logement(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_tfu NUMERIC;
|
||||||
|
v_taux_tfu_ratio NUMERIC; -- v_taux_tfu / 100 (pré-calculé)
|
||||||
|
v_taux_valeur_locat_prof NUMERIC;
|
||||||
|
v_taux_vlp_ratio NUMERIC; -- v_taux_valeur_locat_prof / 100 (pré-calculé)
|
||||||
|
v_tfu_piscine_unitaire NUMERIC;
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 1. Récupération de l'année et de la structure (inchangée)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 2. Récupération des 4 paramètres en UNE seule requête
|
||||||
|
-- (évite 4 accès séquentiels à la table parameters)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_DEFAUT_SUPERFICIE_AU_SOL'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_TFU'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TFU_PAR_PISCINE')
|
||||||
|
INTO STRICT
|
||||||
|
v_taux_defaut_sup_sol,
|
||||||
|
v_taux_tfu,
|
||||||
|
v_taux_valeur_locat_prof,
|
||||||
|
v_tfu_piscine_unitaire
|
||||||
|
FROM parameters
|
||||||
|
WHERE name IN (
|
||||||
|
'TAUX_DEFAUT_SUPERFICIE_AU_SOL',
|
||||||
|
'TAUX_TFU',
|
||||||
|
'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE',
|
||||||
|
'TFU_PAR_PISCINE'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Ratios pré-calculés pour éviter la division répétée dans le SELECT
|
||||||
|
v_taux_tfu_ratio := v_taux_tfu / 100.0;
|
||||||
|
v_taux_vlp_ratio := v_taux_valeur_locat_prof / 100.0;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 3. INSERT avec calcul complet de valeur_locative_adm et montant_taxe
|
||||||
|
-- → supprime l'UPDATE post-INSERT (économie d'un second scan de table)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
num_unite_logement,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
unite_logement_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
superficie_au_sol_ulog,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
"source",
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, -- 70 % superficie parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, -- TFU à 70 %
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, -- valeur locative administrative finale
|
||||||
|
tfu_superficie_au_sol_reel,
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe, -- TFU finale
|
||||||
|
taux_tfu,
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
ul.nul,
|
||||||
|
eul.ifu,
|
||||||
|
eul.npi,
|
||||||
|
eul.tel1,
|
||||||
|
eul.email,
|
||||||
|
eul.nom,
|
||||||
|
eul.prenom,
|
||||||
|
eul.raison_sociale,
|
||||||
|
eul.adresse,
|
||||||
|
eul.representant_tel,
|
||||||
|
eul.representant_nom,
|
||||||
|
eul.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
-- exonere parcelle
|
||||||
|
(v_today BETWEEN ep.date_debut_exemption
|
||||||
|
AND COALESCE(ep.date_fin_exemption, v_today)),
|
||||||
|
-- exonere batiment
|
||||||
|
(v_today BETWEEN eb.date_debut_excemption
|
||||||
|
AND COALESCE(eb.date_fin_excemption, v_today)),
|
||||||
|
-- exonere unite logement
|
||||||
|
(v_today BETWEEN eul.date_debut_exemption
|
||||||
|
AND COALESCE(eul.date_fin_exemption, v_today)),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
COALESCE(eul.nombre_piscine, 0),
|
||||||
|
eul.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'TFU',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
eul.superficie_au_sol,
|
||||||
|
-- valeur_batiment (unité logement) : première valeur non nulle non zéro
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.valeur_locative,
|
||||||
|
-- montant_loyer_annuel
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
eul.categorie_usage,
|
||||||
|
|
||||||
|
-- superficie_au_sol_taux_prop_parc (70 % parcelle)
|
||||||
|
p.superficie * v_taux_defaut_sup_sol / 100.0,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_taux_prop_parc
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_calcule_taux_prop_parc
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative * v_taux_tfu_ratio
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_sup_reel
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN eul.superficie_au_sol * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- valeur_locative_adm avec tests explicites (corrigée)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
CASE
|
||||||
|
WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
AND eul.superficie_au_sol <> 0
|
||||||
|
THEN eul.superficie_au_sol * brb.valeur_locative
|
||||||
|
|
||||||
|
WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
AND eul.superficie_au_sol = 0
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_unite_logement <> 0
|
||||||
|
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0), 0) <> 0
|
||||||
|
THEN COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0), 0)
|
||||||
|
* v_taux_vlp_ratio
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_unite_logement = 0
|
||||||
|
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0), 0) = 0
|
||||||
|
THEN COALESCE(NULLIF(eul.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime, 0), 0)
|
||||||
|
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- 🔧 CORRECTION : tfu_superficie_au_sol_reel (était hardcodé à 6/100)
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN eul.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_piscine
|
||||||
|
COALESCE(eul.nombre_piscine, 0) * v_tfu_piscine_unitaire,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
(
|
||||||
|
WITH calc AS (
|
||||||
|
SELECT
|
||||||
|
COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0), 0) AS valeur_ul,
|
||||||
|
COALESCE(NULLIF(eul.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime, 0), 0) AS loyer,
|
||||||
|
eul.superficie_au_sol * brb.valeur_locative AS vla_reel,
|
||||||
|
(p.superficie * v_taux_defaut_sup_sol / 100.0)
|
||||||
|
* brb.valeur_locative AS vla_70,
|
||||||
|
COALESCE(eul.nombre_piscine, 0) * v_tfu_piscine_unitaire AS piscine_montant
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE
|
||||||
|
WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
AND eul.superficie_au_sol <> 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vla_reel * v_taux_tfu_ratio
|
||||||
|
+ calc.piscine_montant)
|
||||||
|
|
||||||
|
WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
AND eul.superficie_au_sol = 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vla_70 * v_taux_tfu_ratio
|
||||||
|
+ calc.piscine_montant)
|
||||||
|
|
||||||
|
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.valeur_ul <> 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.valeur_ul * v_taux_vlp_ratio * v_taux_tfu_ratio)
|
||||||
|
|
||||||
|
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.valeur_ul = 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.loyer * v_taux_tfu_ratio)
|
||||||
|
|
||||||
|
ELSE brb.tfu_minimum
|
||||||
|
END
|
||||||
|
FROM calc
|
||||||
|
),
|
||||||
|
|
||||||
|
v_taux_tfu,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
ul.id
|
||||||
|
|
||||||
|
FROM parcelle p
|
||||||
|
|
||||||
|
-- Dernière enquête parcelle
|
||||||
|
LEFT JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
WHERE parcelle_id = p.id
|
||||||
|
ORDER BY date_enquete DESC, id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) ep ON TRUE
|
||||||
|
|
||||||
|
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
-- Rattachement structure via secteur
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
WHERE quartier_id = q.id
|
||||||
|
ORDER BY quartier_id
|
||||||
|
LIMIT 1
|
||||||
|
) sd ON TRUE
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
|
||||||
|
-- Dernière enquête bâtiment
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
eb2.batiment_id,
|
||||||
|
eb2.superficie_au_sol,
|
||||||
|
eb2.nombre_piscine,
|
||||||
|
eb2.categorie_batiment_id,
|
||||||
|
eb2.date_enquete,
|
||||||
|
eb2.montant_locatif_annuel_declare,
|
||||||
|
eb2.montant_locatif_annuel_calcule,
|
||||||
|
eb2.montant_locatif_annuel_estime,
|
||||||
|
eb2.date_debut_excemption,
|
||||||
|
eb2.date_fin_excemption,
|
||||||
|
eb2.valeur_batiment_reel,
|
||||||
|
eb2.valeur_batiment_calcule,
|
||||||
|
eb2.valeur_batiment_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_batiment eb2
|
||||||
|
JOIN usage u ON u.id = eb2.usage_id
|
||||||
|
WHERE eb2.batiment_id = b.id
|
||||||
|
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eb ON TRUE
|
||||||
|
|
||||||
|
JOIN unite_logement ul ON ul.batiment_id = b.id
|
||||||
|
|
||||||
|
-- Dernière enquête unité logement
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
eul2.unite_logement_id,
|
||||||
|
pers1.id,
|
||||||
|
pers1.ifu,
|
||||||
|
pers1.npi,
|
||||||
|
pers1.tel1,
|
||||||
|
pers1.email,
|
||||||
|
pers1.nom,
|
||||||
|
pers1.prenom,
|
||||||
|
pers1.raison_sociale,
|
||||||
|
pers1.adresse,
|
||||||
|
eul2.nombre_piscine,
|
||||||
|
eul2.categorie_batiment_id,
|
||||||
|
eul2.superficie_au_sol,
|
||||||
|
eul2.superficie_louee,
|
||||||
|
eul2.nbre_piece,
|
||||||
|
eul2.date_enquete,
|
||||||
|
eul2.montant_locatif_annuel_calcule,
|
||||||
|
eul2.montant_locatif_annuel_declare,
|
||||||
|
eul2.montant_locatif_annuel_estime,
|
||||||
|
eul2.date_debut_exemption,
|
||||||
|
eul2.date_fin_exemption,
|
||||||
|
eul2.representant_nom,
|
||||||
|
eul2.representant_prenom,
|
||||||
|
eul2.representant_tel,
|
||||||
|
eul2.valeur_unite_logement_reel,
|
||||||
|
eul2.valeur_unite_logement_calcule,
|
||||||
|
eul2.valeur_unite_logement_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_unite_logement eul2
|
||||||
|
JOIN usage u ON u.id = eul2.usage_id
|
||||||
|
LEFT JOIN personne pers1 ON pers1.id = eul2.personne_id
|
||||||
|
WHERE eul2.unite_logement_id = ul.id
|
||||||
|
ORDER BY eul2.date_enquete DESC, eul2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eul ON TRUE
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb ON cb.id = eul.categorie_batiment_id
|
||||||
|
|
||||||
|
-- Barème RFU bâti (inchangé)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul2
|
||||||
|
WHERE ul2.batiment_id = b.id
|
||||||
|
)
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
@@ -70,20 +70,20 @@ FROM impositions_tfu imp
|
|||||||
order by c.code,st.code,r_quartier_contact,i_contact,p_contact;
|
order by c.code,st.code,r_quartier_contact,i_contact,p_contact;
|
||||||
|
|
||||||
|
|
||||||
select * from e_avis_view;
|
|
||||||
|
|
||||||
--left join structure st2 on st2.id=imp.structure_id;
|
--left join structure st2 on st2.id=imp.structure_id; 8263
|
||||||
|
|
||||||
create or replace view e_avis_detail_view as
|
create or replace view e_avis_detail_view as
|
||||||
WITH cca_unique AS (
|
WITH cca_unique AS (
|
||||||
SELECT DISTINCT ON (personne_id, commune_id)
|
SELECT DISTINCT ON (personne_id, commune_id)
|
||||||
structure_id,
|
structure_id,
|
||||||
personne_id,
|
personne_id,
|
||||||
commune_id
|
commune_id,
|
||||||
|
parcelle_id
|
||||||
FROM commune_centre_assignation
|
FROM commune_centre_assignation
|
||||||
ORDER BY commune_id,personne_id,structure_id
|
ORDER BY commune_id,personne_id,structure_id
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT distinct on (exo.annee,dimp.parcelle_id,dimp.nature_impot)
|
||||||
null as id_avis_detail,
|
null as id_avis_detail,
|
||||||
null as id_avis,
|
null as id_avis,
|
||||||
dimp.id as id_externe_ligne_imposition,
|
dimp.id as id_externe_ligne_imposition,
|
||||||
@@ -103,7 +103,11 @@ SELECT
|
|||||||
end as montant_base_imposition,
|
end as montant_base_imposition,
|
||||||
dimp.valeur_locative_adm as montant_valeur_locative,
|
dimp.valeur_locative_adm as montant_valeur_locative,
|
||||||
dimp.taux_tfu as taux,
|
dimp.taux_tfu as taux,
|
||||||
dimp.montant_taxe as montant_du
|
dimp.montant_taxe as montant_du,
|
||||||
|
case
|
||||||
|
when cca.parcelle_id is not null then true
|
||||||
|
else false
|
||||||
|
end as booleen_parcelle_contact
|
||||||
FROM impositions_tfu imp
|
FROM impositions_tfu imp
|
||||||
INNER JOIN donnees_imposition_tfu dimp
|
INNER JOIN donnees_imposition_tfu dimp
|
||||||
ON dimp.impositions_tfu_id = imp.id
|
ON dimp.impositions_tfu_id = imp.id
|
||||||
@@ -114,6 +118,19 @@ FROM impositions_tfu imp
|
|||||||
LEFT JOIN cca_unique cca
|
LEFT JOIN cca_unique cca
|
||||||
ON cca.personne_id = dimp.personne_id
|
ON cca.personne_id = dimp.personne_id
|
||||||
AND cca.commune_id = imp.commune_id
|
AND cca.commune_id = imp.commune_id
|
||||||
|
AND cca.parcelle_id = dimp.parcelle_id
|
||||||
LEFT JOIN structure st
|
LEFT JOIN structure st
|
||||||
ON st.id = cca.structure_id
|
ON st.id = cca.structure_id
|
||||||
where dimp.personne_id is not null ;
|
where dimp.personne_id is not null ;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
---------------------------------------------------
|
||||||
|
select * from e_avis_detail_view
|
||||||
|
where qip_quartier='6431' and qip_ilot='1656' and qip_parcelle='C' ;
|
||||||
|
|
||||||
|
|
||||||
|
'6431', '1656', 'C'
|
||||||
@@ -597,7 +597,7 @@ BEGIN
|
|||||||
JOIN usage u ON u.id = eb2.usage_id
|
JOIN usage u ON u.id = eb2.usage_id
|
||||||
WHERE eb2.batiment_id = b.id
|
WHERE eb2.batiment_id = b.id
|
||||||
-- 🔧 IRF : Filtre spécifique
|
-- 🔧 IRF : Filtre spécifique
|
||||||
AND eb2.superficie_louee * eb2.montant_locatif_annuel_declare > 0
|
AND eb2.superficie_louee * eb2.montant_locatif_annuel_declare > 0 ---s'assurer que la superficie au sol loue est renseignée
|
||||||
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
) eb ON TRUE
|
) eb ON TRUE
|
||||||
|
|||||||
@@ -0,0 +1,350 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_irf_batie_une_parcelle(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT,
|
||||||
|
p_parcelle_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_valeur_locat_prof NUMERIC;
|
||||||
|
v_tfu_piscine_unitaire NUMERIC;
|
||||||
|
v_taux_irf NUMERIC;
|
||||||
|
v_taux_irf_ratio NUMERIC; -- v_taux_irf / 100 (pré-calculé)
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 1. Récupération de l'année et de la structure (inchangée)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 2. Récupération des 4 paramètres en UNE seule requête
|
||||||
|
-- (évite 4 accès séquentiels à la table parameters)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_DEFAUT_SUPERFICIE_AU_SOL'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TFU_PAR_PISCINE'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_IRF')
|
||||||
|
INTO STRICT
|
||||||
|
v_taux_defaut_sup_sol,
|
||||||
|
v_taux_valeur_locat_prof,
|
||||||
|
v_tfu_piscine_unitaire,
|
||||||
|
v_taux_irf
|
||||||
|
FROM parameters
|
||||||
|
WHERE name IN (
|
||||||
|
'TAUX_DEFAUT_SUPERFICIE_AU_SOL',
|
||||||
|
'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE',
|
||||||
|
'TFU_PAR_PISCINE',
|
||||||
|
'TAUX_IRF'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Ratio pré-calculé pour éviter la division répétée dans le SELECT
|
||||||
|
v_taux_irf_ratio := v_taux_irf / 100.0;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 3. INSERT avec calcul direct de valeur_locative_adm et montant_taxe
|
||||||
|
-- → supprime l'UPDATE post-INSERT (économie d'un second scan de table)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
"source",
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, -- 70 % superficie parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, -- 0 pour IRF
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, -- = montant_loyer_annuel pour IRF
|
||||||
|
tfu_superficie_au_sol_reel, -- 0 pour IRF
|
||||||
|
tfu_piscine, -- 0 pour IRF
|
||||||
|
montant_taxe, -- IRF finale = loyer * taux_irf
|
||||||
|
taux_tfu, -- = taux_irf pour IRF
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id,
|
||||||
|
superficie_au_sol_loue,
|
||||||
|
personne_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
pers.ifu,
|
||||||
|
pers.npi,
|
||||||
|
pers.tel1,
|
||||||
|
pers.email,
|
||||||
|
pers.nom,
|
||||||
|
pers.prenom,
|
||||||
|
pers.raison_sociale,
|
||||||
|
pers.adresse,
|
||||||
|
ep.representant_tel,
|
||||||
|
ep.representant_nom,
|
||||||
|
ep.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
-- exonere parcelle
|
||||||
|
(v_today BETWEEN ep.date_debut_exemption
|
||||||
|
AND COALESCE(ep.date_fin_exemption, v_today)),
|
||||||
|
-- exonere batiment
|
||||||
|
(v_today BETWEEN eb.date_debut_excemption
|
||||||
|
AND COALESCE(eb.date_fin_excemption, v_today)),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
eb.nombre_piscine,
|
||||||
|
eb.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'IRF',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
-- valeur_batiment : première valeur non nulle non zéro
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.valeur_locative,
|
||||||
|
-- montant_loyer_annuel
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
-- 🔧 IRF : champs TFU mis à 0
|
||||||
|
0, -- tfu_metre_carre
|
||||||
|
0, -- tfu_minimum
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
eb.categorie_usage,
|
||||||
|
|
||||||
|
-- superficie_au_sol_taux_prop_parc (70 % parcelle)
|
||||||
|
p.superficie * v_taux_defaut_sup_sol / 100.0,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_taux_prop_parc
|
||||||
|
(p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative,
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_calcule_taux_prop_parc → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_sup_reel
|
||||||
|
eb.superficie_au_sol * brb.valeur_locative,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 IRF : valeur_locative_adm = montant_loyer_annuel (calculé directement)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_superficie_au_sol_reel → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_piscine → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 IRF : montant_taxe = montant_loyer_annuel * taux_irf (calculé directement)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
) * v_taux_irf_ratio,
|
||||||
|
|
||||||
|
-- 🔧 IRF : taux_tfu → taux_irf
|
||||||
|
v_taux_irf,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
NULL,
|
||||||
|
eb.superficie_louee,
|
||||||
|
ep.personne_id
|
||||||
|
FROM parcelle p
|
||||||
|
|
||||||
|
-- Dernière enquête parcelle
|
||||||
|
LEFT JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
WHERE parcelle_id = p.id
|
||||||
|
ORDER BY date_enquete DESC, id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) ep ON TRUE
|
||||||
|
|
||||||
|
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
-- Rattachement structure via secteur (DISTINCT ON → LATERAL plus lisible)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
WHERE quartier_id = q.id
|
||||||
|
ORDER BY quartier_id
|
||||||
|
LIMIT 1
|
||||||
|
) sd ON TRUE
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
-- Bâtiments sans unités logement (anti-join via LEFT JOIN … IS NULL)
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
LEFT JOIN unite_logement ul_filter ON ul_filter.batiment_id = b.id
|
||||||
|
|
||||||
|
-- 🔧 IRF : Dernière enquête bâtiment avec filtre spécifique IRF
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
eb2.batiment_id,
|
||||||
|
eb2.superficie_au_sol,
|
||||||
|
eb2.nombre_piscine,
|
||||||
|
eb2.categorie_batiment_id,
|
||||||
|
eb2.date_enquete,
|
||||||
|
eb2.montant_locatif_annuel_declare,
|
||||||
|
eb2.montant_locatif_annuel_calcule,
|
||||||
|
eb2.montant_locatif_annuel_estime,
|
||||||
|
eb2.date_debut_excemption,
|
||||||
|
eb2.date_fin_excemption,
|
||||||
|
eb2.valeur_batiment_reel,
|
||||||
|
eb2.valeur_batiment_calcule,
|
||||||
|
eb2.valeur_batiment_estime,
|
||||||
|
u.categorie_usage,
|
||||||
|
eb2.superficie_louee
|
||||||
|
FROM enquete_batiment eb2
|
||||||
|
JOIN usage u ON u.id = eb2.usage_id
|
||||||
|
WHERE eb2.batiment_id = b.id
|
||||||
|
-- 🔧 IRF : Filtre spécifique
|
||||||
|
AND eb2.superficie_louee * eb2.montant_locatif_annuel_declare > 0 ---s'assurer que la superficie au sol loue est renseignée
|
||||||
|
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eb ON TRUE
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb ON cb.id = eb.categorie_batiment_id
|
||||||
|
|
||||||
|
-- Barème RFU bâti (inchangé)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND ul_filter.batiment_id IS NULL -- anti-join : pas d'unité logement
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
AND p.id=p_parcelle_id
|
||||||
|
AND NOT EXISTS(select 1 from donnees_imposition_tfu dimptfu
|
||||||
|
where dimptfu.parcelle_id=p_parcelle_id
|
||||||
|
AND dimptfu.annee=v_annee
|
||||||
|
AND dimptfu.nature_impot='IRF'
|
||||||
|
AND dimptfu.batiment_id=b.id)
|
||||||
|
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
@@ -0,0 +1,305 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_irf_batie_ulo_une_parcelle(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT,
|
||||||
|
p_parcelle_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_irf NUMERIC;
|
||||||
|
v_taux_irf_ratio NUMERIC;
|
||||||
|
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- 1. année + structure
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
-- 2. paramètres (UNE seule requête)
|
||||||
|
SELECT
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_DEFAUT_SUPERFICIE_AU_SOL'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_IRF')
|
||||||
|
INTO STRICT
|
||||||
|
v_taux_defaut_sup_sol,
|
||||||
|
v_taux_irf
|
||||||
|
FROM parameters
|
||||||
|
WHERE name IN (
|
||||||
|
'TAUX_DEFAUT_SUPERFICIE_AU_SOL',
|
||||||
|
'TAUX_IRF'
|
||||||
|
);
|
||||||
|
|
||||||
|
v_taux_irf_ratio := v_taux_irf / 100.0;
|
||||||
|
|
||||||
|
-- 3. INSERT optimisé
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
num_unite_logement,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop, prenom_prop, raison_sociale, adresse_prop,
|
||||||
|
tel_sc, nom_sc, prenom_sc,
|
||||||
|
longitude, latitude,
|
||||||
|
batie,
|
||||||
|
exonere, batiment_exonere, unite_logement_exonere,
|
||||||
|
standing_bat, categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
superficie_au_sol_ulog,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
source,
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc,
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc,
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm,
|
||||||
|
tfu_superficie_au_sol_reel,
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe,
|
||||||
|
taux_tfu,
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id,
|
||||||
|
superficie_au_sol_loue,
|
||||||
|
personne_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code, d.nom,
|
||||||
|
c.code, c.nom,
|
||||||
|
a.code, a.nom,
|
||||||
|
q.code, q.nom,
|
||||||
|
p.q, p.i, p.p, p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub, ul.nul,
|
||||||
|
|
||||||
|
eul.ifu, eul.npi, eul.tel1, eul.email,
|
||||||
|
eul.nom, eul.prenom, eul.raison_sociale, eul.adresse,
|
||||||
|
eul.representant_tel, eul.representant_nom, eul.representant_prenom,
|
||||||
|
|
||||||
|
p.longitude, p.latitude,
|
||||||
|
TRUE,
|
||||||
|
|
||||||
|
(v_today BETWEEN ep.date_debut_exemption AND COALESCE(ep.date_fin_exemption, v_today)),
|
||||||
|
(v_today BETWEEN eb.date_debut_excemption AND COALESCE(eb.date_fin_excemption, v_today)),
|
||||||
|
(v_today BETWEEN eul.date_debut_exemption AND COALESCE(eul.date_fin_exemption, v_today)),
|
||||||
|
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
|
||||||
|
COALESCE(eul.nombre_piscine, 0),
|
||||||
|
eul.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'IRF',
|
||||||
|
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
eul.superficie_au_sol,
|
||||||
|
|
||||||
|
-- valeur logement
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.valeur_unite_logement_reel,0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule,0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime,0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
|
||||||
|
brb.valeur_locative,
|
||||||
|
|
||||||
|
-- loyer
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.montant_locatif_annuel_declare,0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule,0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime,0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
|
||||||
|
0, 0,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today, p_user_id, 'FISCAD',
|
||||||
|
v_today, p_user_id,
|
||||||
|
eul.categorie_usage,
|
||||||
|
|
||||||
|
p.superficie * v_taux_defaut_sup_sol / 100.0,
|
||||||
|
|
||||||
|
(p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative,
|
||||||
|
|
||||||
|
0,
|
||||||
|
|
||||||
|
eul.superficie_au_sol * brb.valeur_locative,
|
||||||
|
|
||||||
|
-- valeur locative = loyer
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.montant_locatif_annuel_declare,0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule,0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime,0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
|
||||||
|
0, 0,
|
||||||
|
|
||||||
|
-- montant taxe direct (PLUS D'UPDATE)
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.montant_locatif_annuel_declare,0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule,0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime,0),
|
||||||
|
0
|
||||||
|
) * v_taux_irf_ratio,
|
||||||
|
|
||||||
|
v_taux_irf,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
ul.id,
|
||||||
|
eul.superficie_louee,
|
||||||
|
eul.personne_id
|
||||||
|
|
||||||
|
FROM parcelle p
|
||||||
|
|
||||||
|
LEFT JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM enquete e
|
||||||
|
WHERE e.parcelle_id = p.id
|
||||||
|
ORDER BY date_enquete DESC, id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) ep ON TRUE
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
WHERE quartier_id = q.id
|
||||||
|
LIMIT 1
|
||||||
|
) sd ON TRUE
|
||||||
|
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN structure st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
JOIN unite_logement ul ON ul.batiment_id = b.id
|
||||||
|
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT eult.unite_logement_id,
|
||||||
|
pers1.id,
|
||||||
|
pers1.ifu,
|
||||||
|
pers1.npi,
|
||||||
|
pers1.tel1,
|
||||||
|
pers1.email,
|
||||||
|
pers1.nom,
|
||||||
|
pers1.prenom,
|
||||||
|
pers1.raison_sociale,
|
||||||
|
pers1.adresse,
|
||||||
|
eult.nombre_piscine,
|
||||||
|
eult.categorie_batiment_id,
|
||||||
|
eult.superficie_au_sol,
|
||||||
|
eult.superficie_louee,
|
||||||
|
eult.nbre_piece,
|
||||||
|
eult.date_enquete,
|
||||||
|
eult.montant_locatif_annuel_calcule,
|
||||||
|
eult.montant_locatif_annuel_declare,
|
||||||
|
eult.montant_locatif_annuel_estime,
|
||||||
|
eult.date_debut_exemption,
|
||||||
|
eult.date_fin_exemption,
|
||||||
|
eult.representant_nom,
|
||||||
|
eult.representant_prenom,
|
||||||
|
eult.representant_tel,
|
||||||
|
eult.valeur_unite_logement_reel,
|
||||||
|
eult.valeur_unite_logement_calcule,
|
||||||
|
eult.valeur_unite_logement_estime,
|
||||||
|
u.categorie_usage,
|
||||||
|
pers1.id as personne_id
|
||||||
|
FROM enquete_unite_logement eult
|
||||||
|
LEFT JOIN personne pers1 ON pers1.id = eult.personne_id
|
||||||
|
join usage u on u.id=eult.usage_id
|
||||||
|
WHERE eult.unite_logement_id = ul.id
|
||||||
|
AND eult.superficie_louee * eult.montant_locatif_annuel_declare > 0
|
||||||
|
ORDER BY date_enquete DESC, eult.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eul ON TRUE
|
||||||
|
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM enquete_batiment eb2
|
||||||
|
WHERE eb2.batiment_id = b.id
|
||||||
|
ORDER BY date_enquete DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eb ON TRUE
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb ON cb.id = eul.categorie_batiment_id
|
||||||
|
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
AND p.id=p_parcelle_id
|
||||||
|
AND NOT EXISTS(select 1 from donnees_imposition_tfu dimptfu
|
||||||
|
where dimptfu.parcelle_id=p_parcelle_id
|
||||||
|
AND dimptfu.annee=v_annee
|
||||||
|
AND dimptfu.nature_impot='IRF'
|
||||||
|
AND dimptfu.batiment_id=b.id
|
||||||
|
AND dimptfu.unite_logement_id=ul.id)
|
||||||
|
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
@@ -1,315 +1,69 @@
|
|||||||
/*CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_srtb_batie(
|
|
||||||
p_impositions_tfu_id BIGINT,
|
|
||||||
p_user_id BIGINT
|
|
||||||
)
|
|
||||||
RETURNS INTEGER
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS
|
|
||||||
$$
|
|
||||||
DECLARE
|
|
||||||
v_rows_inserted INTEGER;
|
|
||||||
v_annee BIGINT;
|
|
||||||
v_structure_id BIGINT;
|
|
||||||
v_montant_srtb NUMERIC;
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
-- récupération de l'année
|
|
||||||
SELECT ex.annee, it.structure_id
|
|
||||||
INTO STRICT v_annee, v_structure_id
|
|
||||||
FROM impositions_tfu it
|
|
||||||
join exercice ex on ex.id =it.exercice_id
|
|
||||||
WHERE it.id = p_impositions_tfu_id;
|
|
||||||
|
|
||||||
|
|
||||||
select value
|
|
||||||
into STRICT v_montant_srtb
|
|
||||||
from parameters
|
|
||||||
where name ='TAXE_SRTB';
|
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO donnees_imposition_tfu(
|
|
||||||
annee,
|
|
||||||
code_departement,
|
|
||||||
nom_departement,
|
|
||||||
code_commune,
|
|
||||||
nom_commune,
|
|
||||||
code_arrondissement,
|
|
||||||
nom_arrondissement,
|
|
||||||
code_quartier_village,
|
|
||||||
nom_quartier_village,
|
|
||||||
q,
|
|
||||||
ilot,
|
|
||||||
parcelle,
|
|
||||||
nup,
|
|
||||||
titre_foncier,
|
|
||||||
num_batiment,
|
|
||||||
ifu,
|
|
||||||
npi,
|
|
||||||
tel_prop,
|
|
||||||
email_prop,
|
|
||||||
nom_prop,
|
|
||||||
prenom_prop,
|
|
||||||
raison_sociale,
|
|
||||||
adresse_prop,
|
|
||||||
tel_sc,
|
|
||||||
nom_sc,
|
|
||||||
prenom_sc,
|
|
||||||
longitude,
|
|
||||||
latitude,
|
|
||||||
batie,
|
|
||||||
exonere,
|
|
||||||
batiment_exonere,
|
|
||||||
standing_bat,
|
|
||||||
categorie_bat,
|
|
||||||
nombre_piscine,
|
|
||||||
date_enquete,
|
|
||||||
structure_id,
|
|
||||||
zone_rfu_id,
|
|
||||||
nature_impot,
|
|
||||||
superficie_parc,
|
|
||||||
superficie_au_sol_bat,
|
|
||||||
valeur_batiment,
|
|
||||||
valeur_locative_adm_metre_carre,
|
|
||||||
montant_loyer_annuel,
|
|
||||||
tfu_metre_carre,
|
|
||||||
tfu_minimum,
|
|
||||||
impositions_tfu_id,
|
|
||||||
deleted,
|
|
||||||
created_at ,
|
|
||||||
created_by ,
|
|
||||||
"source",
|
|
||||||
updated_at ,
|
|
||||||
updated_by,
|
|
||||||
categorie_usage,
|
|
||||||
superficie_au_sol_taux_prop_parc, ---70% de la surperficie au sol de la parcelle
|
|
||||||
valeur_locative_adm_taux_prop_parc,
|
|
||||||
tfu_calcule_taux_prop_parc, ----tfu correspondant au 70%
|
|
||||||
valeur_locative_adm_sup_reel,
|
|
||||||
valeur_locative_adm, ----------valeur locative administrative
|
|
||||||
tfu_superficie_au_sol_reel, ----tfu correspondant à la superficie au sol reelle
|
|
||||||
tfu_piscine,
|
|
||||||
montant_taxe, ----tfu finale
|
|
||||||
taux_tfu, ----taux tfu batie
|
|
||||||
parcelle_id,
|
|
||||||
batiment_id,
|
|
||||||
unite_logement_id,
|
|
||||||
superficie_au_sol_loue
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
v_annee,
|
|
||||||
d.code,
|
|
||||||
d.nom,
|
|
||||||
c.code,
|
|
||||||
c.nom,
|
|
||||||
a.code,
|
|
||||||
a.nom,
|
|
||||||
q.code,
|
|
||||||
q.nom,
|
|
||||||
p.q,
|
|
||||||
p.i,
|
|
||||||
p.p,
|
|
||||||
p.nup,
|
|
||||||
ep.numero_titre_foncier,
|
|
||||||
b.nub,
|
|
||||||
pers.ifu,
|
|
||||||
pers.npi,
|
|
||||||
pers.tel1,
|
|
||||||
pers.email,
|
|
||||||
pers.nom,
|
|
||||||
pers.prenom,
|
|
||||||
pers.raison_sociale,
|
|
||||||
pers.adresse,
|
|
||||||
ep.representant_tel,
|
|
||||||
ep.representant_nom,
|
|
||||||
ep.representant_prenom,
|
|
||||||
p.longitude,
|
|
||||||
p.latitude,
|
|
||||||
TRUE,
|
|
||||||
(
|
|
||||||
CURRENT_DATE >= ep.date_debut_exemption
|
|
||||||
AND CURRENT_DATE <= COALESCE(ep.date_fin_exemption, CURRENT_DATE)
|
|
||||||
),
|
|
||||||
(
|
|
||||||
CURRENT_DATE >= eb.date_debut_excemption
|
|
||||||
AND CURRENT_DATE <= COALESCE(eb.date_fin_excemption, CURRENT_DATE)
|
|
||||||
),
|
|
||||||
cb.standing,
|
|
||||||
cb.nom,
|
|
||||||
eb.nombre_piscine,
|
|
||||||
eb.date_enquete,
|
|
||||||
st.id,
|
|
||||||
ep.zone_rfu_id,
|
|
||||||
'SRTB',
|
|
||||||
p.superficie,
|
|
||||||
eb.superficie_au_sol,
|
|
||||||
case -------valeur_batiment
|
|
||||||
WHEN eb.valeur_batiment_reel IS NOT NULL AND eb.valeur_batiment_reel <> 0 THEN eb.valeur_batiment_reel
|
|
||||||
WHEN eb.valeur_batiment_calcule IS NOT NULL AND eb.valeur_batiment_calcule <> 0 THEN eb.valeur_batiment_calcule
|
|
||||||
WHEN eb.valeur_batiment_estime IS NOT NULL AND eb.valeur_batiment_estime <> 0 THEN eb.valeur_batiment_estime
|
|
||||||
ELSE 0
|
|
||||||
END,
|
|
||||||
brb.valeur_locative,
|
|
||||||
case ----- montant_loyer_annuel
|
|
||||||
WHEN eb.montant_locatif_annuel_declare IS NOT NULL AND eb.montant_locatif_annuel_declare <> 0 THEN eb.montant_locatif_annuel_declare
|
|
||||||
WHEN eb.montant_locatif_annuel_calcule IS NOT NULL AND eb.montant_locatif_annuel_calcule <> 0 THEN eb.montant_locatif_annuel_calcule
|
|
||||||
WHEN eb.montant_locatif_annuel_estime IS NOT NULL AND eb.montant_locatif_annuel_estime <> 0 THEN eb.montant_locatif_annuel_estime
|
|
||||||
ELSE 0
|
|
||||||
END,
|
|
||||||
brb.tfu_metre_carre,
|
|
||||||
brb.tfu_minimum,
|
|
||||||
p_impositions_tfu_id,
|
|
||||||
false,
|
|
||||||
current_date ,
|
|
||||||
p_user_id ,
|
|
||||||
'FISCAD',
|
|
||||||
current_date ,
|
|
||||||
p_user_id,
|
|
||||||
eb.categorie_usage,
|
|
||||||
0,---superficie_au_sol_70pour100
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
eb.superficie_au_sol * brb.valeur_locative,
|
|
||||||
0, ------ valeur_locative_adm : en attente de update
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
v_montant_srtb,
|
|
||||||
0,
|
|
||||||
p.id,
|
|
||||||
b.id,
|
|
||||||
null,
|
|
||||||
eb.superficie_louee
|
|
||||||
FROM parcelle p
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT DISTINCT ON (parcelle_id)
|
|
||||||
parcelle_id,
|
|
||||||
superficie,
|
|
||||||
personne_id,
|
|
||||||
numero_titre_foncier,
|
|
||||||
date_enquete,
|
|
||||||
representant_tel,
|
|
||||||
representant_nom,
|
|
||||||
representant_prenom,
|
|
||||||
representant_npi,
|
|
||||||
date_debut_exemption,
|
|
||||||
date_fin_exemption,
|
|
||||||
zone_rfu_id
|
|
||||||
FROM enquete
|
|
||||||
ORDER BY parcelle_id, date_enquete DESC, id DESC
|
|
||||||
) ep ON ep.parcelle_id = p.id
|
|
||||||
LEFT JOIN personne pers
|
|
||||||
ON pers.id = ep.personne_id
|
|
||||||
JOIN quartier q ON q.id = p.quartier_id
|
|
||||||
JOIN arrondissement a ON a.id = q.arrondissement_id
|
|
||||||
JOIN commune c ON c.id = a.commune_id
|
|
||||||
JOIN departement d ON d.id = c.departement_id
|
|
||||||
--JOIN secteur_decoupage sd ON sd.quartier_id = q.id
|
|
||||||
JOIN (
|
|
||||||
SELECT DISTINCT ON (quartier_id)
|
|
||||||
quartier_id,
|
|
||||||
secteur_id
|
|
||||||
FROM secteur_decoupage
|
|
||||||
ORDER BY quartier_id
|
|
||||||
) sd ON sd.quartier_id = q.id
|
|
||||||
JOIN secteur sect ON sect.id = sd.secteur_id
|
|
||||||
JOIN section ses ON ses.id = sect.section_id
|
|
||||||
JOIN "structure" st ON st.id = ses.structure_id
|
|
||||||
JOIN batiment b ON b.parcelle_id = p.id
|
|
||||||
JOIN (
|
|
||||||
SELECT DISTINCT ON (batiment_id)
|
|
||||||
batiment_id,
|
|
||||||
superficie_au_sol,
|
|
||||||
nombre_piscine,
|
|
||||||
categorie_batiment_id,
|
|
||||||
date_enquete,
|
|
||||||
montant_locatif_annuel_declare,
|
|
||||||
montant_locatif_annuel_calcule,
|
|
||||||
montant_locatif_annuel_estime,
|
|
||||||
date_debut_excemption,
|
|
||||||
date_fin_excemption,
|
|
||||||
valeur_batiment_reel,
|
|
||||||
valeur_batiment_calcule,
|
|
||||||
valeur_batiment_estime,
|
|
||||||
u.categorie_usage,
|
|
||||||
superficie_louee
|
|
||||||
FROM enquete_batiment eb
|
|
||||||
join usage u on u.id=eb.usage_id
|
|
||||||
ORDER BY batiment_id, date_enquete DESC, eb.id DESC
|
|
||||||
) eb ON eb.batiment_id = b.id
|
|
||||||
JOIN categorie_batiment cb
|
|
||||||
ON cb.id = eb.categorie_batiment_id
|
|
||||||
JOIN LATERAL (
|
|
||||||
SELECT *
|
|
||||||
FROM barem_rfu_bati br
|
|
||||||
WHERE br.categorie_batiment_id = cb.id
|
|
||||||
AND br.arrondissement_id = a.id
|
|
||||||
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
|
||||||
ORDER BY br.quartier_id DESC NULLS LAST
|
|
||||||
LIMIT 1
|
|
||||||
) brb ON TRUE
|
|
||||||
WHERE p.batie = TRUE
|
|
||||||
AND NOT EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM unite_logement ul
|
|
||||||
WHERE ul.batiment_id = b.id
|
|
||||||
)
|
|
||||||
AND st.id = v_structure_id
|
|
||||||
ON CONFLICT DO NOTHING;
|
|
||||||
|
|
||||||
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
|
||||||
|
|
||||||
RETURN v_rows_inserted;
|
|
||||||
END;
|
|
||||||
$$; */
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_srtb_batie(
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_srtb_batie(
|
||||||
p_impositions_tfu_id BIGINT,
|
p_impositions_tfu_id BIGINT,
|
||||||
p_user_id BIGINT
|
p_user_id BIGINT
|
||||||
)
|
)
|
||||||
RETURNS INTEGER
|
RETURNS INTEGER
|
||||||
LANGUAGE plpgsql
|
LANGUAGE plpgsql
|
||||||
AS $$
|
AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
v_rows_inserted INTEGER;
|
v_rows_inserted INTEGER;
|
||||||
v_annee BIGINT;
|
v_annee BIGINT;
|
||||||
v_structure_id BIGINT;
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
v_montant_srtb NUMERIC;
|
v_montant_srtb NUMERIC;
|
||||||
v_today DATE;
|
v_today DATE;
|
||||||
BEGIN
|
BEGIN
|
||||||
|
|
||||||
v_today := CURRENT_DATE;
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
-- 1. année + structure
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 1. Récupération de l'année et de la structure (inchangée)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
SELECT ex.annee, it.structure_id
|
SELECT ex.annee, it.structure_id
|
||||||
INTO STRICT v_annee, v_structure_id
|
INTO STRICT v_annee, v_structure_id
|
||||||
FROM impositions_tfu it
|
FROM impositions_tfu it
|
||||||
JOIN exercice ex ON ex.id = it.exercice_id
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
WHERE it.id = p_impositions_tfu_id;
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
-- 2. paramètre (une seule requête)
|
|
||||||
SELECT value
|
SELECT value
|
||||||
INTO STRICT v_montant_srtb
|
INTO STRICT v_montant_srtb
|
||||||
FROM parameters
|
FROM parameters
|
||||||
WHERE name = 'TAXE_SRTB';
|
WHERE name = 'TAXE_SRTB';
|
||||||
|
|
||||||
-- 3. INSERT optimisé (SANS DISTINCT ON, SANS UPDATE)
|
|
||||||
INSERT INTO donnees_imposition_tfu (
|
INSERT INTO donnees_imposition_tfu (
|
||||||
annee,
|
annee,
|
||||||
code_departement, nom_departement,
|
code_departement,
|
||||||
code_commune, nom_commune,
|
nom_departement,
|
||||||
code_arrondissement, nom_arrondissement,
|
code_commune,
|
||||||
code_quartier_village, nom_quartier_village,
|
nom_commune,
|
||||||
q, ilot, parcelle, nup,
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
titre_foncier,
|
titre_foncier,
|
||||||
num_batiment,
|
num_batiment,
|
||||||
ifu, npi, tel_prop, email_prop,
|
ifu,
|
||||||
nom_prop, prenom_prop, raison_sociale, adresse_prop,
|
npi,
|
||||||
tel_sc, nom_sc, prenom_sc,
|
tel_prop,
|
||||||
longitude, latitude,
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
batie,
|
batie,
|
||||||
exonere,
|
exonere,
|
||||||
batiment_exonere,
|
batiment_exonere,
|
||||||
standing_bat, categorie_bat,
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
nombre_piscine,
|
nombre_piscine,
|
||||||
date_enquete,
|
date_enquete,
|
||||||
structure_id,
|
structure_id,
|
||||||
@@ -326,19 +80,19 @@ BEGIN
|
|||||||
deleted,
|
deleted,
|
||||||
created_at,
|
created_at,
|
||||||
created_by,
|
created_by,
|
||||||
source,
|
"source",
|
||||||
updated_at,
|
updated_at,
|
||||||
updated_by,
|
updated_by,
|
||||||
categorie_usage,
|
categorie_usage,
|
||||||
superficie_au_sol_taux_prop_parc,
|
superficie_au_sol_taux_prop_parc, -- 70 % superficie parcelle
|
||||||
valeur_locative_adm_taux_prop_parc,
|
valeur_locative_adm_taux_prop_parc,
|
||||||
tfu_calcule_taux_prop_parc,
|
tfu_calcule_taux_prop_parc, -- 0 pour IRF
|
||||||
valeur_locative_adm_sup_reel,
|
valeur_locative_adm_sup_reel,
|
||||||
valeur_locative_adm,
|
valeur_locative_adm, -- = montant_loyer_annuel pour IRF
|
||||||
tfu_superficie_au_sol_reel,
|
tfu_superficie_au_sol_reel, -- 0 pour IRF
|
||||||
tfu_piscine,
|
tfu_piscine, -- 0 pour IRF
|
||||||
montant_taxe,
|
montant_taxe, -- IRF finale = loyer * taux_irf
|
||||||
taux_tfu,
|
taux_tfu, -- = taux_irf pour IRF
|
||||||
parcelle_id,
|
parcelle_id,
|
||||||
batiment_id,
|
batiment_id,
|
||||||
unite_logement_id,
|
unite_logement_id,
|
||||||
@@ -346,146 +100,103 @@ BEGIN
|
|||||||
personne_id
|
personne_id
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
v_annee,
|
dimp.annee,
|
||||||
d.code, d.nom,
|
dimp.code_departement,
|
||||||
c.code, c.nom,
|
dimp.nom_departement,
|
||||||
a.code, a.nom,
|
dimp.code_commune,
|
||||||
q.code, q.nom,
|
dimp.nom_commune,
|
||||||
p.q, p.i, p.p, p.nup,
|
dimp.code_arrondissement,
|
||||||
ep.numero_titre_foncier,
|
dimp.nom_arrondissement,
|
||||||
b.nub,
|
dimp.code_quartier_village,
|
||||||
|
dimp.nom_quartier_village,
|
||||||
pers.ifu, pers.npi, pers.tel1, pers.email,
|
dimp.q,
|
||||||
pers.nom, pers.prenom, pers.raison_sociale, pers.adresse,
|
dimp. ilot,
|
||||||
ep.representant_tel, ep.representant_nom, ep.representant_prenom,
|
dimp.parcelle,
|
||||||
|
dimp.nup,
|
||||||
p.longitude, p.latitude,
|
dimp.titre_foncier,
|
||||||
|
dimp. num_batiment,
|
||||||
|
dimp.ifu,
|
||||||
|
dimp. npi,
|
||||||
|
dimp.tel_prop,
|
||||||
|
dimp.email_prop,
|
||||||
|
dimp.nom_prop,
|
||||||
|
dimp.prenom_prop,
|
||||||
|
dimp.raison_sociale,
|
||||||
|
dimp.adresse_prop,
|
||||||
|
dimp.tel_sc,
|
||||||
|
dimp.nom_sc,
|
||||||
|
dimp.prenom_sc,
|
||||||
|
dimp.longitude,
|
||||||
|
dimp.latitude,
|
||||||
TRUE,
|
TRUE,
|
||||||
|
-- exonere parcelle
|
||||||
(v_today BETWEEN ep.date_debut_exemption AND COALESCE(ep.date_fin_exemption, v_today)),
|
dimp.exonere,
|
||||||
(v_today BETWEEN eb.date_debut_excemption AND COALESCE(eb.date_fin_excemption, v_today)),
|
-- exonere batiment
|
||||||
|
dimp.batiment_exonere,
|
||||||
cb.standing,
|
dimp.standing_bat,
|
||||||
cb.nom,
|
dimp.categorie_bat,
|
||||||
|
dimp.nombre_piscine,
|
||||||
COALESCE(eb.nombre_piscine, 0),
|
dimp.date_enquete,
|
||||||
eb.date_enquete,
|
dimp.structure_id,
|
||||||
|
dimp.zone_rfu_id,
|
||||||
st.id,
|
|
||||||
ep.zone_rfu_id,
|
|
||||||
'SRTB',
|
'SRTB',
|
||||||
|
dimp.superficie_parc,
|
||||||
p.superficie,
|
dimp.superficie_au_sol_bat,
|
||||||
eb.superficie_au_sol,
|
dimp.valeur_batiment,
|
||||||
|
dimp.tfu_metre_carre,
|
||||||
-- valeur bâtiment optimisée
|
-- montant_loyer_annuel
|
||||||
COALESCE(
|
dimp.montant_loyer_annuel,
|
||||||
NULLIF(eb.valeur_batiment_reel,0),
|
-- 🔧 IRF : champs TFU mis à 0
|
||||||
NULLIF(eb.valeur_batiment_calcule,0),
|
0, -- tfu_metre_carre
|
||||||
NULLIF(eb.valeur_batiment_estime,0),
|
0, -- tfu_minimum
|
||||||
0
|
|
||||||
),
|
|
||||||
|
|
||||||
brb.valeur_locative,
|
|
||||||
|
|
||||||
-- loyer optimisé
|
|
||||||
COALESCE(
|
|
||||||
NULLIF(eb.montant_locatif_annuel_declare,0),
|
|
||||||
NULLIF(eb.montant_locatif_annuel_calcule,0),
|
|
||||||
NULLIF(eb.montant_locatif_annuel_estime,0),
|
|
||||||
0
|
|
||||||
),
|
|
||||||
|
|
||||||
brb.tfu_metre_carre,
|
|
||||||
brb.tfu_minimum,
|
|
||||||
|
|
||||||
p_impositions_tfu_id,
|
p_impositions_tfu_id,
|
||||||
FALSE,
|
FALSE,
|
||||||
v_today, p_user_id, 'FISCAD',
|
v_today,
|
||||||
v_today, p_user_id,
|
p_user_id,
|
||||||
eb.categorie_usage,
|
'FISCAD',
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
dimp.categorie_usage,
|
||||||
|
|
||||||
0, 0, 0,
|
-- superficie_au_sol_taux_prop_parc (70 % parcelle)
|
||||||
|
dimp.superficie_au_sol_taux_prop_parc,
|
||||||
|
|
||||||
eb.superficie_au_sol * brb.valeur_locative,
|
-- valeur_locative_adm_taux_prop_parc
|
||||||
|
dimp.valeur_locative_adm_taux_prop_parc,
|
||||||
|
|
||||||
0,
|
-- 🔧 IRF : tfu_calcule_taux_prop_parc → 0
|
||||||
0,
|
|
||||||
0,
|
0,
|
||||||
|
|
||||||
-- 🔥 SRTB = valeur directe (pas de calcul)
|
-- valeur_locative_adm_sup_reel
|
||||||
|
dimp.valeur_locative_adm_sup_reel,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 IRF : valeur_locative_adm = montant_loyer_annuel (calculé directement)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
dimp.valeur_locative_adm
|
||||||
|
,
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_superficie_au_sol_reel → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_piscine → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 IRF : montant_taxe = montant_loyer_annuel * taux_irf (calculé directement)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
v_montant_srtb,
|
v_montant_srtb,
|
||||||
|
|
||||||
|
-- 🔧 IRF : taux_tfu → taux_irf
|
||||||
0,
|
0,
|
||||||
|
dimp.parcelle_id,
|
||||||
p.id,
|
dimp.batiment_id,
|
||||||
b.id,
|
dimp.unite_logement_id,
|
||||||
NULL,
|
dimp.superficie_au_sol_loue,
|
||||||
eb.superficie_louee,
|
dimp.personne_id
|
||||||
ep.personne_id
|
FROM donnees_imposition_tfu dimp
|
||||||
|
WHERE dimp.nature_impot= 'IRF'
|
||||||
FROM parcelle p
|
AND dimp.impositions_tfu_id=p_impositions_tfu_id
|
||||||
|
|
||||||
-- dernière enquête parcelle
|
|
||||||
LEFT JOIN LATERAL (
|
|
||||||
SELECT *
|
|
||||||
FROM enquete e
|
|
||||||
WHERE e.parcelle_id = p.id
|
|
||||||
ORDER BY date_enquete DESC, id DESC
|
|
||||||
LIMIT 1
|
|
||||||
) ep ON TRUE
|
|
||||||
|
|
||||||
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
|
||||||
|
|
||||||
JOIN quartier q ON q.id = p.quartier_id
|
|
||||||
JOIN arrondissement a ON a.id = q.arrondissement_id
|
|
||||||
JOIN commune c ON c.id = a.commune_id
|
|
||||||
JOIN departement d ON d.id = c.departement_id
|
|
||||||
|
|
||||||
-- structure via secteur
|
|
||||||
JOIN LATERAL (
|
|
||||||
SELECT secteur_id
|
|
||||||
FROM secteur_decoupage
|
|
||||||
WHERE quartier_id = q.id
|
|
||||||
LIMIT 1
|
|
||||||
) sd ON TRUE
|
|
||||||
|
|
||||||
JOIN secteur sect ON sect.id = sd.secteur_id
|
|
||||||
JOIN section ses ON ses.id = sect.section_id
|
|
||||||
JOIN structure st ON st.id = ses.structure_id
|
|
||||||
|
|
||||||
JOIN batiment b ON b.parcelle_id = p.id
|
|
||||||
|
|
||||||
-- 🔥 remplace DISTINCT ON
|
|
||||||
JOIN LATERAL (
|
|
||||||
SELECT eb2.*,u.categorie_usage
|
|
||||||
FROM enquete_batiment eb2
|
|
||||||
LEFT JOIN usage u ON u.id = eb2.usage_id
|
|
||||||
WHERE eb2.batiment_id = b.id
|
|
||||||
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
|
||||||
LIMIT 1
|
|
||||||
) eb ON TRUE
|
|
||||||
|
|
||||||
JOIN categorie_batiment cb ON cb.id = eb.categorie_batiment_id
|
|
||||||
|
|
||||||
JOIN LATERAL (
|
|
||||||
SELECT *
|
|
||||||
FROM barem_rfu_bati br
|
|
||||||
WHERE br.categorie_batiment_id = cb.id
|
|
||||||
AND br.arrondissement_id = a.id
|
|
||||||
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
|
||||||
ORDER BY br.quartier_id DESC NULLS LAST
|
|
||||||
LIMIT 1
|
|
||||||
) brb ON TRUE
|
|
||||||
|
|
||||||
WHERE p.batie = TRUE
|
|
||||||
AND NOT EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM unite_logement ul
|
|
||||||
WHERE ul.batiment_id = b.id
|
|
||||||
)
|
|
||||||
AND st.id = v_structure_id
|
|
||||||
|
|
||||||
ON CONFLICT DO NOTHING;
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
@@ -494,4 +205,3 @@ BEGIN
|
|||||||
END;
|
END;
|
||||||
$$;
|
$$;
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,213 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_srtb_batie_une_parcelle(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT,
|
||||||
|
p_parcelle_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_montant_srtb NUMERIC;
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 1. Récupération de l'année et de la structure (inchangée)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
SELECT value
|
||||||
|
INTO STRICT v_montant_srtb
|
||||||
|
FROM parameters
|
||||||
|
WHERE name = 'TAXE_SRTB';
|
||||||
|
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
"source",
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, -- 70 % superficie parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, -- 0 pour IRF
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, -- = montant_loyer_annuel pour IRF
|
||||||
|
tfu_superficie_au_sol_reel, -- 0 pour IRF
|
||||||
|
tfu_piscine, -- 0 pour IRF
|
||||||
|
montant_taxe, -- IRF finale = loyer * taux_irf
|
||||||
|
taux_tfu, -- = taux_irf pour IRF
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id,
|
||||||
|
superficie_au_sol_loue,
|
||||||
|
personne_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
dimp.annee,
|
||||||
|
dimp.code_departement,
|
||||||
|
dimp.nom_departement,
|
||||||
|
dimp.code_commune,
|
||||||
|
dimp.nom_commune,
|
||||||
|
dimp.code_arrondissement,
|
||||||
|
dimp.nom_arrondissement,
|
||||||
|
dimp.code_quartier_village,
|
||||||
|
dimp.nom_quartier_village,
|
||||||
|
dimp.q,
|
||||||
|
dimp. ilot,
|
||||||
|
dimp.parcelle,
|
||||||
|
dimp.nup,
|
||||||
|
dimp.titre_foncier,
|
||||||
|
dimp. num_batiment,
|
||||||
|
dimp.ifu,
|
||||||
|
dimp. npi,
|
||||||
|
dimp.tel_prop,
|
||||||
|
dimp.email_prop,
|
||||||
|
dimp.nom_prop,
|
||||||
|
dimp.prenom_prop,
|
||||||
|
dimp.raison_sociale,
|
||||||
|
dimp.adresse_prop,
|
||||||
|
dimp.tel_sc,
|
||||||
|
dimp.nom_sc,
|
||||||
|
dimp.prenom_sc,
|
||||||
|
dimp.longitude,
|
||||||
|
dimp.latitude,
|
||||||
|
TRUE,
|
||||||
|
-- exonere parcelle
|
||||||
|
dimp.exonere,
|
||||||
|
-- exonere batiment
|
||||||
|
dimp.batiment_exonere,
|
||||||
|
dimp.standing_bat,
|
||||||
|
dimp.categorie_bat,
|
||||||
|
dimp.nombre_piscine,
|
||||||
|
dimp.date_enquete,
|
||||||
|
dimp.structure_id,
|
||||||
|
dimp.zone_rfu_id,
|
||||||
|
'SRTB',
|
||||||
|
dimp.superficie_parc,
|
||||||
|
dimp.superficie_au_sol_bat,
|
||||||
|
dimp.valeur_batiment,
|
||||||
|
dimp.tfu_metre_carre,
|
||||||
|
-- montant_loyer_annuel
|
||||||
|
dimp.montant_loyer_annuel,
|
||||||
|
-- 🔧 IRF : champs TFU mis à 0
|
||||||
|
0, -- tfu_metre_carre
|
||||||
|
0, -- tfu_minimum
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
dimp.categorie_usage,
|
||||||
|
|
||||||
|
-- superficie_au_sol_taux_prop_parc (70 % parcelle)
|
||||||
|
dimp.superficie_au_sol_taux_prop_parc,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_taux_prop_parc
|
||||||
|
dimp.valeur_locative_adm_taux_prop_parc,
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_calcule_taux_prop_parc → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_sup_reel
|
||||||
|
dimp.valeur_locative_adm_sup_reel,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 IRF : valeur_locative_adm = montant_loyer_annuel (calculé directement)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
dimp.valeur_locative_adm
|
||||||
|
,
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_superficie_au_sol_reel → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- 🔧 IRF : tfu_piscine → 0
|
||||||
|
0,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 IRF : montant_taxe = montant_loyer_annuel * taux_irf (calculé directement)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
v_montant_srtb,
|
||||||
|
|
||||||
|
-- 🔧 IRF : taux_tfu → taux_irf
|
||||||
|
0,
|
||||||
|
dimp.parcelle_id,
|
||||||
|
dimp.batiment_id,
|
||||||
|
dimp.unite_logement_id,
|
||||||
|
dimp.superficie_au_sol_loue,
|
||||||
|
dimp.personne_id
|
||||||
|
FROM donnees_imposition_tfu dimp
|
||||||
|
WHERE dimp.nature_impot= 'IRF'
|
||||||
|
AND dimp.impositions_tfu_id=p_impositions_tfu_id
|
||||||
|
AND dimp.parcelle_id=p_parcelle_id
|
||||||
|
AND NOT EXISTS(select 1 from donnees_imposition_tfu dimptfu
|
||||||
|
where dimptfu.parcelle_id=p_parcelle_id
|
||||||
|
AND dimptfu.nature_impot='SRTB'
|
||||||
|
AND dimptfu.batiment_id=dimp.batiment_id)
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
@@ -1,349 +1,3 @@
|
|||||||
/*CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie(
|
|
||||||
p_impositions_tfu_id BIGINT,
|
|
||||||
p_user_id BIGINT
|
|
||||||
)
|
|
||||||
RETURNS INTEGER
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS
|
|
||||||
$$
|
|
||||||
DECLARE
|
|
||||||
v_rows_inserted INTEGER;
|
|
||||||
v_annee BIGINT;
|
|
||||||
v_structure_id BIGINT;
|
|
||||||
v_taux_defaut_sup_sol NUMERIC;
|
|
||||||
v_taux_tfu NUMERIC;
|
|
||||||
v_taux_valeur_locat_prof NUMERIC;
|
|
||||||
v_tfu_piscine_unitaire NUMERIC;
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
-- récupération de l'année
|
|
||||||
SELECT ex.annee, it.structure_id
|
|
||||||
INTO STRICT v_annee, v_structure_id
|
|
||||||
FROM impositions_tfu it
|
|
||||||
join exercice ex on ex.id =it.exercice_id
|
|
||||||
WHERE it.id = p_impositions_tfu_id;
|
|
||||||
|
|
||||||
|
|
||||||
select value
|
|
||||||
into strict v_taux_defaut_sup_sol
|
|
||||||
from parameters
|
|
||||||
where name ='TAUX_DEFAUT_SUPERFICIE_AU_SOL';
|
|
||||||
|
|
||||||
select value
|
|
||||||
into STRICT v_taux_tfu
|
|
||||||
from parameters
|
|
||||||
where name ='TAUX_TFU';
|
|
||||||
|
|
||||||
|
|
||||||
select value
|
|
||||||
into STRICT v_taux_valeur_locat_prof
|
|
||||||
from parameters
|
|
||||||
where name ='TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE';
|
|
||||||
|
|
||||||
select value
|
|
||||||
into STRICT v_tfu_piscine_unitaire
|
|
||||||
from parameters
|
|
||||||
where name ='TFU_PAR_PISCINE';
|
|
||||||
|
|
||||||
|
|
||||||
INSERT INTO donnees_imposition_tfu(
|
|
||||||
annee,
|
|
||||||
code_departement,
|
|
||||||
nom_departement,
|
|
||||||
code_commune,
|
|
||||||
nom_commune,
|
|
||||||
code_arrondissement,
|
|
||||||
nom_arrondissement,
|
|
||||||
code_quartier_village,
|
|
||||||
nom_quartier_village,
|
|
||||||
q,
|
|
||||||
ilot,
|
|
||||||
parcelle,
|
|
||||||
nup,
|
|
||||||
titre_foncier,
|
|
||||||
num_batiment,
|
|
||||||
ifu,
|
|
||||||
npi,
|
|
||||||
tel_prop,
|
|
||||||
email_prop,
|
|
||||||
nom_prop,
|
|
||||||
prenom_prop,
|
|
||||||
raison_sociale,
|
|
||||||
adresse_prop,
|
|
||||||
tel_sc,
|
|
||||||
nom_sc,
|
|
||||||
prenom_sc,
|
|
||||||
longitude,
|
|
||||||
latitude,
|
|
||||||
batie,
|
|
||||||
exonere,
|
|
||||||
batiment_exonere,
|
|
||||||
standing_bat,
|
|
||||||
categorie_bat,
|
|
||||||
nombre_piscine,
|
|
||||||
date_enquete,
|
|
||||||
structure_id,
|
|
||||||
zone_rfu_id,
|
|
||||||
nature_impot,
|
|
||||||
superficie_parc,
|
|
||||||
superficie_au_sol_bat,
|
|
||||||
valeur_batiment,
|
|
||||||
valeur_locative_adm_metre_carre,
|
|
||||||
montant_loyer_annuel,
|
|
||||||
tfu_metre_carre,
|
|
||||||
tfu_minimum,
|
|
||||||
impositions_tfu_id,
|
|
||||||
deleted,
|
|
||||||
created_at ,
|
|
||||||
created_by ,
|
|
||||||
"source",
|
|
||||||
updated_at ,
|
|
||||||
updated_by,
|
|
||||||
categorie_usage,
|
|
||||||
superficie_au_sol_taux_prop_parc, ---70% de la surperficie au sol de la parcelle
|
|
||||||
valeur_locative_adm_taux_prop_parc,
|
|
||||||
tfu_calcule_taux_prop_parc, ----tfu correspondant au 70%
|
|
||||||
valeur_locative_adm_sup_reel,
|
|
||||||
valeur_locative_adm, ----------valeur locative administrative
|
|
||||||
tfu_superficie_au_sol_reel, ----tfu correspondant à la superficie au sol reelle
|
|
||||||
tfu_piscine,
|
|
||||||
montant_taxe, ----tfu finale
|
|
||||||
taux_tfu, ----taux tfu batie
|
|
||||||
parcelle_id,
|
|
||||||
batiment_id,
|
|
||||||
unite_logement_id
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
v_annee,
|
|
||||||
d.code,
|
|
||||||
d.nom,
|
|
||||||
c.code,
|
|
||||||
c.nom,
|
|
||||||
a.code,
|
|
||||||
a.nom,
|
|
||||||
q.code,
|
|
||||||
q.nom,
|
|
||||||
p.q,
|
|
||||||
p.i,
|
|
||||||
p.p,
|
|
||||||
p.nup,
|
|
||||||
ep.numero_titre_foncier,
|
|
||||||
b.nub,
|
|
||||||
pers.ifu,
|
|
||||||
pers.npi,
|
|
||||||
pers.tel1,
|
|
||||||
pers.email,
|
|
||||||
pers.nom,
|
|
||||||
pers.prenom,
|
|
||||||
pers.raison_sociale,
|
|
||||||
pers.adresse,
|
|
||||||
ep.representant_tel,
|
|
||||||
ep.representant_nom,
|
|
||||||
ep.representant_prenom,
|
|
||||||
p.longitude,
|
|
||||||
p.latitude,
|
|
||||||
TRUE,
|
|
||||||
(
|
|
||||||
CURRENT_DATE >= ep.date_debut_exemption
|
|
||||||
AND CURRENT_DATE <= COALESCE(ep.date_fin_exemption, CURRENT_DATE)
|
|
||||||
),
|
|
||||||
(
|
|
||||||
CURRENT_DATE >= eb.date_debut_excemption
|
|
||||||
AND CURRENT_DATE <= COALESCE(eb.date_fin_excemption, CURRENT_DATE)
|
|
||||||
),
|
|
||||||
cb.standing,
|
|
||||||
cb.nom,
|
|
||||||
eb.nombre_piscine,
|
|
||||||
eb.date_enquete,
|
|
||||||
st.id,
|
|
||||||
ep.zone_rfu_id,
|
|
||||||
'TFU',
|
|
||||||
p.superficie,
|
|
||||||
eb.superficie_au_sol,
|
|
||||||
COALESCE(
|
|
||||||
NULLIF(eb.valeur_batiment_reel, 0),
|
|
||||||
NULLIF(eb.valeur_batiment_calcule, 0),
|
|
||||||
NULLIF(eb.valeur_batiment_estime, 0),
|
|
||||||
0
|
|
||||||
),
|
|
||||||
brb.valeur_locative,
|
|
||||||
COALESCE(
|
|
||||||
NULLIF(eb.montant_locatif_annuel_declare, 0),
|
|
||||||
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
|
||||||
NULLIF(eb.montant_locatif_annuel_estime, 0),
|
|
||||||
0
|
|
||||||
),
|
|
||||||
brb.tfu_metre_carre,
|
|
||||||
brb.tfu_minimum,
|
|
||||||
p_impositions_tfu_id,
|
|
||||||
false,
|
|
||||||
current_date ,
|
|
||||||
p_user_id ,
|
|
||||||
'FISCAD',
|
|
||||||
current_date ,
|
|
||||||
p_user_id,
|
|
||||||
eb.categorie_usage,
|
|
||||||
p.superficie*v_taux_defaut_sup_sol/100,---superficie_au_sol_70pour100
|
|
||||||
case ----valeur_locative_adm70pour100
|
|
||||||
when eb.categorie_usage = 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
case ----tfu calcule 70 pour 100 superficie parcelle
|
|
||||||
when eb.categorie_usage= 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative * v_taux_tfu/100
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
case -----valeur_locative_adm_sup_reel
|
|
||||||
when eb.categorie_usage='HABITATION' then eb.superficie_au_sol * brb.valeur_locative
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
0, ------ valeur_locative_adm : en attente de update
|
|
||||||
case -----tfu_superficie_au_sol_reel
|
|
||||||
when eb.categorie_usage='HABITATION' then eb.superficie_au_sol * brb.valeur_locative * v_taux_tfu/100 +eb.nombre_piscine * v_tfu_piscine_unitaire
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
eb.nombre_piscine * v_tfu_piscine_unitaire,
|
|
||||||
0,
|
|
||||||
v_taux_tfu,
|
|
||||||
p.id,
|
|
||||||
b.id,
|
|
||||||
null
|
|
||||||
FROM parcelle p
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT DISTINCT ON (parcelle_id)
|
|
||||||
parcelle_id,
|
|
||||||
superficie,
|
|
||||||
personne_id,
|
|
||||||
numero_titre_foncier,
|
|
||||||
date_enquete,
|
|
||||||
representant_tel,
|
|
||||||
representant_nom,
|
|
||||||
representant_prenom,
|
|
||||||
representant_npi,
|
|
||||||
date_debut_exemption,
|
|
||||||
date_fin_exemption,
|
|
||||||
zone_rfu_id
|
|
||||||
FROM enquete
|
|
||||||
ORDER BY parcelle_id, date_enquete DESC, id DESC
|
|
||||||
) ep ON ep.parcelle_id = p.id
|
|
||||||
LEFT JOIN personne pers
|
|
||||||
ON pers.id = ep.personne_id
|
|
||||||
JOIN quartier q ON q.id = p.quartier_id
|
|
||||||
JOIN arrondissement a ON a.id = q.arrondissement_id
|
|
||||||
JOIN commune c ON c.id = a.commune_id
|
|
||||||
JOIN departement d ON d.id = c.departement_id
|
|
||||||
--JOIN secteur_decoupage sd ON sd.quartier_id = q.id
|
|
||||||
JOIN (
|
|
||||||
SELECT DISTINCT ON (quartier_id)
|
|
||||||
quartier_id,
|
|
||||||
secteur_id
|
|
||||||
FROM secteur_decoupage
|
|
||||||
ORDER BY quartier_id
|
|
||||||
) sd ON sd.quartier_id = q.id
|
|
||||||
JOIN secteur sect ON sect.id = sd.secteur_id
|
|
||||||
JOIN section ses ON ses.id = sect.section_id
|
|
||||||
JOIN "structure" st ON st.id = ses.structure_id
|
|
||||||
JOIN batiment b ON b.parcelle_id = p.id
|
|
||||||
JOIN (
|
|
||||||
SELECT DISTINCT ON (batiment_id)
|
|
||||||
batiment_id,
|
|
||||||
superficie_au_sol,
|
|
||||||
nombre_piscine,
|
|
||||||
categorie_batiment_id,
|
|
||||||
date_enquete,
|
|
||||||
montant_locatif_annuel_declare,
|
|
||||||
montant_locatif_annuel_calcule,
|
|
||||||
montant_locatif_annuel_estime,
|
|
||||||
date_debut_excemption,
|
|
||||||
date_fin_excemption,
|
|
||||||
valeur_batiment_reel,
|
|
||||||
valeur_batiment_calcule,
|
|
||||||
valeur_batiment_estime,
|
|
||||||
u.categorie_usage
|
|
||||||
FROM enquete_batiment eb
|
|
||||||
join usage u on u.id=eb.usage_id
|
|
||||||
ORDER BY batiment_id, date_enquete DESC, eb.id DESC
|
|
||||||
) eb ON eb.batiment_id = b.id
|
|
||||||
|
|
||||||
JOIN categorie_batiment cb
|
|
||||||
ON cb.id = eb.categorie_batiment_id
|
|
||||||
JOIN LATERAL (
|
|
||||||
SELECT *
|
|
||||||
FROM barem_rfu_bati br
|
|
||||||
WHERE br.categorie_batiment_id = cb.id
|
|
||||||
AND br.arrondissement_id = a.id
|
|
||||||
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
|
||||||
ORDER BY br.quartier_id DESC NULLS LAST
|
|
||||||
LIMIT 1
|
|
||||||
) brb ON TRUE
|
|
||||||
WHERE p.batie = TRUE
|
|
||||||
AND NOT EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM unite_logement ul
|
|
||||||
WHERE ul.batiment_id = b.id
|
|
||||||
)
|
|
||||||
AND st.id = v_structure_id
|
|
||||||
ON CONFLICT DO NOTHING;
|
|
||||||
|
|
||||||
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
|
||||||
|
|
||||||
UPDATE donnees_imposition_tfu dtfu
|
|
||||||
SET
|
|
||||||
valeur_locative_adm =
|
|
||||||
CASE
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat <> 0
|
|
||||||
THEN valeur_locative_adm_sup_reel
|
|
||||||
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat = 0
|
|
||||||
THEN valeur_locative_adm_taux_prop_parc
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0
|
|
||||||
THEN valeur_batiment * (v_taux_valeur_locat_prof/100)
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0
|
|
||||||
THEN montant_loyer_annuel
|
|
||||||
END,
|
|
||||||
|
|
||||||
montant_taxe =
|
|
||||||
CASE
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat <> 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
THEN valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_bat = 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
THEN valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
|
||||||
THEN valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < montant_loyer_annuel * (v_taux_tfu/100)
|
|
||||||
THEN montant_loyer_annuel * (v_taux_tfu/100)
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
END
|
|
||||||
WHERE impositions_tfu_id = p_impositions_tfu_id
|
|
||||||
AND batie = TRUE
|
|
||||||
AND NOT EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM unite_logement ul
|
|
||||||
WHERE ul.batiment_id = dtfu.batiment_id
|
|
||||||
);
|
|
||||||
RETURN v_rows_inserted;
|
|
||||||
END;
|
|
||||||
$$;*/
|
|
||||||
|
|
||||||
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie(
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie(
|
||||||
p_impositions_tfu_id BIGINT,
|
p_impositions_tfu_id BIGINT,
|
||||||
p_user_id BIGINT
|
p_user_id BIGINT
|
||||||
@@ -466,12 +120,15 @@ BEGIN
|
|||||||
valeur_locative_adm, -- valeur locative administrative finale
|
valeur_locative_adm, -- valeur locative administrative finale
|
||||||
tfu_superficie_au_sol_reel,
|
tfu_superficie_au_sol_reel,
|
||||||
tfu_piscine,
|
tfu_piscine,
|
||||||
|
montant_taxe_brut,
|
||||||
montant_taxe, -- TFU finale
|
montant_taxe, -- TFU finale
|
||||||
taux_tfu,
|
taux_tfu,
|
||||||
parcelle_id,
|
parcelle_id,
|
||||||
batiment_id,
|
batiment_id,
|
||||||
unite_logement_id,
|
unite_logement_id,
|
||||||
personne_id
|
personne_id,
|
||||||
|
nombre_ulog,
|
||||||
|
nombre_bat
|
||||||
)
|
)
|
||||||
SELECT
|
SELECT
|
||||||
v_annee,
|
v_annee,
|
||||||
@@ -515,7 +172,7 @@ BEGIN
|
|||||||
eb.date_enquete,
|
eb.date_enquete,
|
||||||
st.id,
|
st.id,
|
||||||
ep.zone_rfu_id,
|
ep.zone_rfu_id,
|
||||||
'TFU',
|
'FB',
|
||||||
p.superficie,
|
p.superficie,
|
||||||
eb.superficie_au_sol,
|
eb.superficie_au_sol,
|
||||||
-- valeur_batiment : première valeur non nulle non zéro
|
-- valeur_batiment : première valeur non nulle non zéro
|
||||||
@@ -607,7 +264,48 @@ BEGIN
|
|||||||
|
|
||||||
-- tfu_piscine
|
-- tfu_piscine
|
||||||
eb.nombre_piscine * v_tfu_piscine_unitaire,
|
eb.nombre_piscine * v_tfu_piscine_unitaire,
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- montant_taxe_brut ← sans prise en compte du minimum
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
(
|
||||||
|
-- On matérialise valeur_batiment et valeur_locative une seule fois
|
||||||
|
WITH calc AS (
|
||||||
|
SELECT
|
||||||
|
COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) AS vb,
|
||||||
|
COALESCE(NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0), 0) AS loyer,
|
||||||
|
eb.superficie_au_sol * brb.valeur_locative AS vla_reel,
|
||||||
|
(p.superficie * v_taux_defaut_sup_sol / 100.0)
|
||||||
|
* brb.valeur_locative AS vla_70
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol <> 0
|
||||||
|
THEN calc.vla_reel * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol = 0
|
||||||
|
THEN calc.vla_70 * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb <> 0
|
||||||
|
THEN calc.vb * v_taux_vlp_ratio * v_taux_tfu_ratio
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb = 0
|
||||||
|
THEN calc.loyer * v_taux_tfu_ratio
|
||||||
|
|
||||||
|
ELSE brb.tfu_minimum
|
||||||
|
|
||||||
|
END
|
||||||
|
FROM calc
|
||||||
|
),
|
||||||
-- ---------------------------------------------------------------
|
-- ---------------------------------------------------------------
|
||||||
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
||||||
-- Utilise des CTE inline via expression pour éviter la redondance
|
-- Utilise des CTE inline via expression pour éviter la redondance
|
||||||
@@ -658,7 +356,13 @@ BEGIN
|
|||||||
p.id,
|
p.id,
|
||||||
b.id,
|
b.id,
|
||||||
NULL,
|
NULL,
|
||||||
ep.personne_id
|
ep.personne_id,
|
||||||
|
(select count(*)
|
||||||
|
from unite_logement ulog
|
||||||
|
where ulog.batiment_id= b.id),
|
||||||
|
(select count(*)
|
||||||
|
from batiment bat
|
||||||
|
where bat.parcelle_id= p.id)
|
||||||
FROM parcelle p
|
FROM parcelle p
|
||||||
-- Dernière enquête parcelle
|
-- Dernière enquête parcelle
|
||||||
LEFT JOIN LATERAL (
|
LEFT JOIN LATERAL (
|
||||||
@@ -742,10 +446,10 @@ BEGIN
|
|||||||
) brb ON TRUE
|
) brb ON TRUE
|
||||||
|
|
||||||
WHERE p.batie = TRUE
|
WHERE p.batie = TRUE
|
||||||
AND ul_filter.batiment_id IS NULL -- anti-join : pas d'unité logement
|
--AND ul_filter.batiment_id IS NULL -- anti-join : pas d'unité logement
|
||||||
AND st.id = v_structure_id
|
AND st.id = v_structure_id ;
|
||||||
|
|
||||||
ON CONFLICT DO NOTHING;
|
-- ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,464 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie_une_parcelle(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT,
|
||||||
|
p_parcelle_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_tfu NUMERIC;
|
||||||
|
v_taux_tfu_ratio NUMERIC; -- v_taux_tfu / 100 (pré-calculé)
|
||||||
|
v_taux_valeur_locat_prof NUMERIC;
|
||||||
|
v_taux_vlp_ratio NUMERIC; -- v_taux_valeur_locat_prof / 100 (pré-calculé)
|
||||||
|
v_tfu_piscine_unitaire NUMERIC;
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 1. Récupération de l'année et de la structure (inchangée)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 2. Récupération des 4 paramètres en UNE seule requête
|
||||||
|
-- (évite 4 accès séquentiels à la table parameters)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_DEFAUT_SUPERFICIE_AU_SOL'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_TFU'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TFU_PAR_PISCINE')
|
||||||
|
INTO STRICT
|
||||||
|
v_taux_defaut_sup_sol,
|
||||||
|
v_taux_tfu,
|
||||||
|
v_taux_valeur_locat_prof,
|
||||||
|
v_tfu_piscine_unitaire
|
||||||
|
FROM parameters
|
||||||
|
WHERE name IN (
|
||||||
|
'TAUX_DEFAUT_SUPERFICIE_AU_SOL',
|
||||||
|
'TAUX_TFU',
|
||||||
|
'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE',
|
||||||
|
'TFU_PAR_PISCINE'
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Ratios pré-calculés pour éviter la division répétée dans le SELECT
|
||||||
|
v_taux_tfu_ratio := v_taux_tfu / 100.0;
|
||||||
|
v_taux_vlp_ratio := v_taux_valeur_locat_prof / 100.0;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 3. INSERT avec calcul complet de valeur_locative_adm et montant_taxe
|
||||||
|
-- → supprime l'UPDATE post-INSERT (économie d'un second scan de table)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
"source",
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, -- 70 % superficie parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, -- TFU à 70 %
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, -- valeur locative administrative finale
|
||||||
|
tfu_superficie_au_sol_reel,
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe_brut,
|
||||||
|
montant_taxe, -- TFU finale
|
||||||
|
taux_tfu,
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id,
|
||||||
|
personne_id,
|
||||||
|
nombre_ulog,
|
||||||
|
nombre_bat
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
pers.ifu,
|
||||||
|
pers.npi,
|
||||||
|
pers.tel1,
|
||||||
|
pers.email,
|
||||||
|
pers.nom,
|
||||||
|
pers.prenom,
|
||||||
|
pers.raison_sociale,
|
||||||
|
pers.adresse,
|
||||||
|
ep.representant_tel,
|
||||||
|
ep.representant_nom,
|
||||||
|
ep.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
-- exonere parcelle
|
||||||
|
(v_today BETWEEN ep.date_debut_exemption
|
||||||
|
AND COALESCE(ep.date_fin_exemption, v_today)),
|
||||||
|
-- exonere batiment
|
||||||
|
(v_today BETWEEN eb.date_debut_excemption
|
||||||
|
AND COALESCE(eb.date_fin_excemption, v_today)),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
eb.nombre_piscine,
|
||||||
|
eb.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'FB',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
-- valeur_batiment : première valeur non nulle non zéro
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.valeur_locative,
|
||||||
|
-- montant_loyer_annuel
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
eb.categorie_usage,
|
||||||
|
|
||||||
|
-- superficie_au_sol_taux_prop_parc (70 % parcelle)
|
||||||
|
p.superficie * v_taux_defaut_sup_sol / 100.0,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_taux_prop_parc
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_calcule_taux_prop_parc
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative * v_taux_tfu_ratio
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_sup_reel
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN eb.superficie_au_sol * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- 🔧 CORRECTION : valeur_locative_adm avec tests explicites
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
CASE
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol <> 0
|
||||||
|
THEN eb.superficie_au_sol * brb.valeur_locative
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol = 0
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_batiment <> 0
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) <> 0
|
||||||
|
THEN COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0)
|
||||||
|
* v_taux_vlp_ratio
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_batiment = 0
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) = 0
|
||||||
|
THEN COALESCE(NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0), 0)
|
||||||
|
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_superficie_au_sol_reel
|
||||||
|
CASE WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
THEN eb.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio * eb.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_piscine
|
||||||
|
eb.nombre_piscine * v_tfu_piscine_unitaire,
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- montant_taxe_brut ← sans prise en compte du minimum
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
(
|
||||||
|
-- On matérialise valeur_batiment et valeur_locative une seule fois
|
||||||
|
WITH calc AS (
|
||||||
|
SELECT
|
||||||
|
COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) AS vb,
|
||||||
|
COALESCE(NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0), 0) AS loyer,
|
||||||
|
eb.superficie_au_sol * brb.valeur_locative AS vla_reel,
|
||||||
|
(p.superficie * v_taux_defaut_sup_sol / 100.0)
|
||||||
|
* brb.valeur_locative AS vla_70
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol <> 0
|
||||||
|
THEN calc.vla_reel * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol = 0
|
||||||
|
THEN calc.vla_70 * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb <> 0
|
||||||
|
THEN calc.vb * v_taux_vlp_ratio * v_taux_tfu_ratio
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb = 0
|
||||||
|
THEN calc.loyer * v_taux_tfu_ratio
|
||||||
|
|
||||||
|
ELSE brb.tfu_minimum
|
||||||
|
|
||||||
|
END
|
||||||
|
FROM calc
|
||||||
|
),
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
||||||
|
-- Utilise des CTE inline via expression pour éviter la redondance
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
(
|
||||||
|
-- On matérialise valeur_batiment et valeur_locative une seule fois
|
||||||
|
WITH calc AS (
|
||||||
|
SELECT
|
||||||
|
COALESCE(NULLIF(eb.valeur_batiment_reel, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_calcule, 0),
|
||||||
|
NULLIF(eb.valeur_batiment_estime, 0), 0) AS vb,
|
||||||
|
COALESCE(NULLIF(eb.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eb.montant_locatif_annuel_estime, 0), 0) AS loyer,
|
||||||
|
eb.superficie_au_sol * brb.valeur_locative AS vla_reel,
|
||||||
|
(p.superficie * v_taux_defaut_sup_sol / 100.0)
|
||||||
|
* brb.valeur_locative AS vla_70
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
CASE
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol <> 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vla_reel * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire)
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage = 'HABITATION'
|
||||||
|
AND eb.superficie_au_sol = 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vla_70 * v_taux_tfu_ratio
|
||||||
|
+ eb.nombre_piscine * v_tfu_piscine_unitaire)
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb <> 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.vb * v_taux_vlp_ratio * v_taux_tfu_ratio)
|
||||||
|
|
||||||
|
WHEN eb.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND calc.vb = 0
|
||||||
|
THEN GREATEST(brb.tfu_minimum,
|
||||||
|
calc.loyer * v_taux_tfu_ratio)
|
||||||
|
|
||||||
|
ELSE brb.tfu_minimum
|
||||||
|
END
|
||||||
|
FROM calc
|
||||||
|
),
|
||||||
|
v_taux_tfu,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
NULL,
|
||||||
|
ep.personne_id,
|
||||||
|
(select count(*)
|
||||||
|
from unite_logement ulog
|
||||||
|
where ulog.batiment_id= b.id),
|
||||||
|
(select count(*)
|
||||||
|
from batiment bat
|
||||||
|
where bat.parcelle_id= p.id)
|
||||||
|
FROM parcelle p
|
||||||
|
-- Dernière enquête parcelle
|
||||||
|
LEFT JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
WHERE parcelle_id = p.id
|
||||||
|
ORDER BY date_enquete DESC, id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) ep ON TRUE
|
||||||
|
|
||||||
|
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
-- Rattachement structure via secteur (DISTINCT ON → LATERAL plus lisible)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
WHERE quartier_id = q.id
|
||||||
|
ORDER BY quartier_id
|
||||||
|
LIMIT 1
|
||||||
|
) sd ON TRUE
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
-- Bâtiments sans unités logement (anti-join via LEFT JOIN … IS NULL)
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
LEFT JOIN unite_logement ul_filter ON ul_filter.batiment_id = b.id
|
||||||
|
|
||||||
|
-- Dernière enquête bâtiment
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
eb2.batiment_id,
|
||||||
|
eb2.superficie_au_sol,
|
||||||
|
eb2.nombre_piscine,
|
||||||
|
eb2.categorie_batiment_id,
|
||||||
|
eb2.date_enquete,
|
||||||
|
eb2.montant_locatif_annuel_declare,
|
||||||
|
eb2.montant_locatif_annuel_calcule,
|
||||||
|
eb2.montant_locatif_annuel_estime,
|
||||||
|
eb2.date_debut_excemption,
|
||||||
|
eb2.date_fin_excemption,
|
||||||
|
eb2.valeur_batiment_reel,
|
||||||
|
eb2.valeur_batiment_calcule,
|
||||||
|
eb2.valeur_batiment_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_batiment eb2
|
||||||
|
JOIN usage u ON u.id = eb2.usage_id
|
||||||
|
WHERE eb2.batiment_id = b.id
|
||||||
|
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eb ON TRUE
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb ON cb.id = eb.categorie_batiment_id
|
||||||
|
|
||||||
|
-- Barème RFU bâti (inchangé)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
--AND ul_filter.batiment_id IS NULL -- anti-join : pas d'unité logement
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
AND p.id = p_parcelle_id
|
||||||
|
AND NOT EXISTS(select 1 from donnees_imposition_tfu dimptfu
|
||||||
|
where dimptfu.batiment_id=b.id
|
||||||
|
and dimptfu.annee=v_annee
|
||||||
|
and dimptfu.nature_impot='FB');
|
||||||
|
|
||||||
|
-- ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
@@ -1,398 +1,3 @@
|
|||||||
/*CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie_unite_logement(
|
|
||||||
p_impositions_tfu_id BIGINT,
|
|
||||||
p_user_id BIGINT
|
|
||||||
)
|
|
||||||
RETURNS INTEGER
|
|
||||||
LANGUAGE plpgsql
|
|
||||||
AS
|
|
||||||
$$
|
|
||||||
DECLARE
|
|
||||||
v_rows_inserted INTEGER;
|
|
||||||
v_annee BIGINT;
|
|
||||||
v_structure_id BIGINT;
|
|
||||||
v_taux_defaut_sup_sol NUMERIC;
|
|
||||||
v_taux_tfu NUMERIC;
|
|
||||||
v_taux_valeur_locat_prof NUMERIC;
|
|
||||||
v_tfu_piscine_unitaire NUMERIC;
|
|
||||||
BEGIN
|
|
||||||
|
|
||||||
-- récupération de l'année
|
|
||||||
SELECT ex.annee, it.structure_id
|
|
||||||
INTO STRICT v_annee, v_structure_id
|
|
||||||
FROM impositions_tfu it
|
|
||||||
join exercice ex on ex.id =it.exercice_id
|
|
||||||
WHERE it.id = p_impositions_tfu_id;
|
|
||||||
|
|
||||||
|
|
||||||
select value
|
|
||||||
into strict v_taux_defaut_sup_sol
|
|
||||||
from parameters
|
|
||||||
where name ='TAUX_DEFAUT_SUPERFICIE_AU_SOL';
|
|
||||||
|
|
||||||
select value
|
|
||||||
into STRICT v_taux_tfu
|
|
||||||
from parameters
|
|
||||||
where name ='TAUX_TFU';
|
|
||||||
|
|
||||||
RAISE NOTICE 'v_taux_tfu = %', v_taux_tfu;
|
|
||||||
|
|
||||||
select value
|
|
||||||
into STRICT v_taux_valeur_locat_prof
|
|
||||||
from parameters
|
|
||||||
where name ='TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE';
|
|
||||||
|
|
||||||
select value
|
|
||||||
into STRICT v_tfu_piscine_unitaire
|
|
||||||
from parameters
|
|
||||||
where name ='TFU_PAR_PISCINE';
|
|
||||||
|
|
||||||
INSERT INTO donnees_imposition_tfu(
|
|
||||||
annee,
|
|
||||||
code_departement,
|
|
||||||
nom_departement,
|
|
||||||
code_commune,
|
|
||||||
nom_commune,
|
|
||||||
code_arrondissement,
|
|
||||||
nom_arrondissement,
|
|
||||||
code_quartier_village,
|
|
||||||
nom_quartier_village,
|
|
||||||
q,
|
|
||||||
ilot,
|
|
||||||
parcelle,
|
|
||||||
nup,
|
|
||||||
titre_foncier,
|
|
||||||
num_batiment,
|
|
||||||
num_unite_logement,
|
|
||||||
ifu,
|
|
||||||
npi,
|
|
||||||
tel_prop,
|
|
||||||
email_prop,
|
|
||||||
nom_prop,
|
|
||||||
prenom_prop,
|
|
||||||
raison_sociale,
|
|
||||||
adresse_prop,
|
|
||||||
tel_sc,
|
|
||||||
nom_sc,
|
|
||||||
prenom_sc,
|
|
||||||
longitude,
|
|
||||||
latitude,
|
|
||||||
batie,
|
|
||||||
exonere,
|
|
||||||
batiment_exonere,
|
|
||||||
unite_logement_exonere,
|
|
||||||
standing_bat,
|
|
||||||
categorie_bat,
|
|
||||||
nombre_piscine,
|
|
||||||
date_enquete,
|
|
||||||
structure_id,
|
|
||||||
zone_rfu_id,
|
|
||||||
nature_impot,
|
|
||||||
superficie_parc,
|
|
||||||
superficie_au_sol_bat,
|
|
||||||
superficie_au_sol_ulog,
|
|
||||||
valeur_batiment,
|
|
||||||
valeur_locative_adm_metre_carre,
|
|
||||||
montant_loyer_annuel,
|
|
||||||
tfu_metre_carre,
|
|
||||||
tfu_minimum,
|
|
||||||
impositions_tfu_id,
|
|
||||||
deleted,
|
|
||||||
created_at ,
|
|
||||||
created_by ,
|
|
||||||
"source",
|
|
||||||
updated_at ,
|
|
||||||
updated_by,
|
|
||||||
categorie_usage,
|
|
||||||
superficie_au_sol_taux_prop_parc, ---70% de la surperficie au sol de la parcelle
|
|
||||||
valeur_locative_adm_taux_prop_parc,
|
|
||||||
tfu_calcule_taux_prop_parc, ----tfu correspondant au 70%
|
|
||||||
valeur_locative_adm_sup_reel,
|
|
||||||
valeur_locative_adm, ----------valeur locative administrative
|
|
||||||
tfu_superficie_au_sol_reel, ----tfu correspondant à la superficie au sol reelle
|
|
||||||
tfu_piscine,
|
|
||||||
montant_taxe, ----tfu finale
|
|
||||||
taux_tfu, ----taux tfu batie
|
|
||||||
parcelle_id,
|
|
||||||
batiment_id,
|
|
||||||
unite_logement_id
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
v_annee,
|
|
||||||
d.code,
|
|
||||||
d.nom,
|
|
||||||
c.code,
|
|
||||||
c.nom,
|
|
||||||
a.code,
|
|
||||||
a.nom,
|
|
||||||
q.code,
|
|
||||||
q.nom,
|
|
||||||
p.q,
|
|
||||||
p.i,
|
|
||||||
p.p,
|
|
||||||
p.nup,
|
|
||||||
ep.numero_titre_foncier,
|
|
||||||
b.nub,
|
|
||||||
ul.nul,
|
|
||||||
eul.ifu,
|
|
||||||
eul.npi,
|
|
||||||
eul.tel1,
|
|
||||||
eul.email,
|
|
||||||
eul.nom,
|
|
||||||
eul.prenom,
|
|
||||||
eul.raison_sociale,
|
|
||||||
eul.adresse,
|
|
||||||
eul.representant_tel,
|
|
||||||
eul.representant_nom,
|
|
||||||
eul.representant_prenom,
|
|
||||||
p.longitude,
|
|
||||||
p.latitude,
|
|
||||||
TRUE,
|
|
||||||
(
|
|
||||||
CURRENT_DATE >= ep.date_debut_exemption
|
|
||||||
AND CURRENT_DATE <= COALESCE(ep.date_fin_exemption, CURRENT_DATE)
|
|
||||||
),
|
|
||||||
(
|
|
||||||
CURRENT_DATE >= eb.date_debut_excemption
|
|
||||||
AND CURRENT_DATE <= COALESCE(eb.date_fin_excemption, CURRENT_DATE)
|
|
||||||
),
|
|
||||||
(
|
|
||||||
CURRENT_DATE >= eul.date_debut_exemption
|
|
||||||
AND CURRENT_DATE <= COALESCE(eul.date_fin_exemption, CURRENT_DATE)
|
|
||||||
),
|
|
||||||
cb.standing,
|
|
||||||
cb.nom,
|
|
||||||
CASE
|
|
||||||
WHEN eul.nombre_piscine is null then 0
|
|
||||||
else eul.nombre_piscine
|
|
||||||
END,
|
|
||||||
eul.date_enquete,
|
|
||||||
st.id,
|
|
||||||
ep.zone_rfu_id,
|
|
||||||
'TFU',
|
|
||||||
p.superficie,
|
|
||||||
eb.superficie_au_sol,
|
|
||||||
eul.superficie_au_sol,
|
|
||||||
CASE -------valeur_batiment
|
|
||||||
WHEN eul.valeur_unite_logement_reel IS NOT NULL AND eul.valeur_unite_logement_reel <> 0 THEN eul.valeur_unite_logement_reel
|
|
||||||
WHEN eul.valeur_unite_logement_calcule IS NOT NULL AND eul.valeur_unite_logement_calcule <> 0 THEN eul.valeur_unite_logement_calcule
|
|
||||||
WHEN eul.valeur_unite_logement_estime IS NOT NULL AND eul.valeur_unite_logement_estime <> 0 THEN eul.valeur_unite_logement_estime
|
|
||||||
ELSE 0
|
|
||||||
END,
|
|
||||||
brb.valeur_locative,
|
|
||||||
CASE ----- montant_loyer_annuel
|
|
||||||
WHEN eul.montant_locatif_annuel_declare IS NOT NULL AND eul.montant_locatif_annuel_declare <> 0 THEN eul.montant_locatif_annuel_declare
|
|
||||||
WHEN eul.montant_locatif_annuel_calcule IS NOT NULL AND eul.montant_locatif_annuel_calcule <> 0 THEN eul.montant_locatif_annuel_calcule
|
|
||||||
WHEN eul.montant_locatif_annuel_estime IS NOT NULL AND eul.montant_locatif_annuel_estime <> 0 THEN eul.montant_locatif_annuel_estime
|
|
||||||
ELSE 0
|
|
||||||
END,
|
|
||||||
brb.tfu_metre_carre,
|
|
||||||
brb.tfu_minimum,
|
|
||||||
p_impositions_tfu_id,
|
|
||||||
false,
|
|
||||||
current_date,
|
|
||||||
p_user_id,
|
|
||||||
'FISCAD',
|
|
||||||
current_date,
|
|
||||||
p_user_id,
|
|
||||||
eul.categorie_usage,
|
|
||||||
p.superficie * v_taux_defaut_sup_sol/100,---superficie_au_sol_70pour100
|
|
||||||
case ----valeur_locative_adm70pour100
|
|
||||||
when eul.categorie_usage = 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
case ----tfu calcule 70 pour 100 superficie parcelle
|
|
||||||
when eul.categorie_usage= 'HABITATION' then (p.superficie * v_taux_defaut_sup_sol/100) * brb.valeur_locative * v_taux_tfu/100
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
case -----valeur_locative_adm_sup_reel
|
|
||||||
when eul.categorie_usage='HABITATION' then eul.superficie_au_sol * brb.valeur_locative
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
0, ------ valeur_locative_adm : en attente de update
|
|
||||||
case -----tfu_superficie_au_sol_reel
|
|
||||||
when eul.categorie_usage='HABITATION' then eul.superficie_au_sol * brb.valeur_locative * 6/100
|
|
||||||
else 0
|
|
||||||
end,
|
|
||||||
CASE
|
|
||||||
WHEN eul.nombre_piscine is null then 0
|
|
||||||
else eul.nombre_piscine * v_tfu_piscine_unitaire
|
|
||||||
END,
|
|
||||||
0,
|
|
||||||
v_taux_tfu,
|
|
||||||
p.id,
|
|
||||||
b.id,
|
|
||||||
ul.id
|
|
||||||
FROM parcelle p
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT DISTINCT ON (parcelle_id)
|
|
||||||
parcelle_id,
|
|
||||||
superficie,
|
|
||||||
personne_id,
|
|
||||||
numero_titre_foncier,
|
|
||||||
date_enquete,
|
|
||||||
representant_tel,
|
|
||||||
representant_nom,
|
|
||||||
representant_prenom,
|
|
||||||
representant_npi,
|
|
||||||
date_debut_exemption,
|
|
||||||
date_fin_exemption,
|
|
||||||
zone_rfu_id
|
|
||||||
FROM enquete
|
|
||||||
ORDER BY parcelle_id, date_enquete DESC, id DESC
|
|
||||||
) ep ON ep.parcelle_id = p.id
|
|
||||||
LEFT JOIN personne pers
|
|
||||||
ON pers.id = ep.personne_id
|
|
||||||
JOIN quartier q ON q.id = p.quartier_id
|
|
||||||
JOIN arrondissement a ON a.id = q.arrondissement_id
|
|
||||||
JOIN commune c ON c.id = a.commune_id
|
|
||||||
JOIN departement d ON d.id = c.departement_id
|
|
||||||
--JOIN secteur_decoupage sd ON sd.quartier_id = q.id
|
|
||||||
JOIN (
|
|
||||||
SELECT DISTINCT ON (quartier_id)
|
|
||||||
quartier_id,
|
|
||||||
secteur_id
|
|
||||||
FROM secteur_decoupage
|
|
||||||
ORDER BY quartier_id
|
|
||||||
) sd ON sd.quartier_id = q.id
|
|
||||||
JOIN secteur sect ON sect.id = sd.secteur_id
|
|
||||||
JOIN section ses ON ses.id = sect.section_id
|
|
||||||
JOIN "structure" st ON st.id = ses.structure_id
|
|
||||||
JOIN batiment b ON b.parcelle_id = p.id
|
|
||||||
JOIN (
|
|
||||||
SELECT DISTINCT ON (batiment_id)
|
|
||||||
batiment_id,
|
|
||||||
superficie_au_sol,
|
|
||||||
nombre_piscine,
|
|
||||||
categorie_batiment_id,
|
|
||||||
date_enquete,
|
|
||||||
montant_locatif_annuel_declare,
|
|
||||||
montant_locatif_annuel_calcule,
|
|
||||||
montant_locatif_annuel_estime,
|
|
||||||
date_debut_excemption,
|
|
||||||
date_fin_excemption,
|
|
||||||
valeur_batiment_reel,
|
|
||||||
valeur_batiment_calcule,
|
|
||||||
valeur_batiment_estime,
|
|
||||||
u.categorie_usage
|
|
||||||
FROM enquete_batiment eb
|
|
||||||
join usage u on u.id=eb.usage_id
|
|
||||||
ORDER BY batiment_id, date_enquete DESC, eb.id DESC
|
|
||||||
) eb ON eb.batiment_id = b.id
|
|
||||||
JOIN unite_logement ul on ul.batiment_id = b.id
|
|
||||||
JOIN (
|
|
||||||
SELECT DISTINCT ON (eult.unite_logement_id)
|
|
||||||
eult.unite_logement_id,
|
|
||||||
pers1.id,
|
|
||||||
pers1.ifu,
|
|
||||||
pers1.npi,
|
|
||||||
pers1.tel1,
|
|
||||||
pers1.email,
|
|
||||||
pers1.nom,
|
|
||||||
pers1.prenom,
|
|
||||||
pers1.raison_sociale,
|
|
||||||
pers1.adresse,
|
|
||||||
eult.nombre_piscine,
|
|
||||||
eult.categorie_batiment_id,
|
|
||||||
eult.superficie_au_sol,
|
|
||||||
eult.superficie_louee,
|
|
||||||
eult.nbre_piece,
|
|
||||||
eult.date_enquete,
|
|
||||||
eult.montant_locatif_annuel_calcule,
|
|
||||||
eult.montant_locatif_annuel_declare,
|
|
||||||
eult.montant_locatif_annuel_estime,
|
|
||||||
eult.date_debut_exemption,
|
|
||||||
eult.date_fin_exemption,
|
|
||||||
eult.representant_nom,
|
|
||||||
eult.representant_prenom,
|
|
||||||
eult.representant_tel,
|
|
||||||
eult.valeur_unite_logement_reel,
|
|
||||||
eult.valeur_unite_logement_calcule,
|
|
||||||
eult.valeur_unite_logement_estime,
|
|
||||||
u.categorie_usage
|
|
||||||
FROM enquete_unite_logement eult
|
|
||||||
join usage u on u.id=eult.usage_id
|
|
||||||
left join personne pers1 on pers1.id = eult.personne_id
|
|
||||||
ORDER BY unite_logement_id, date_enquete DESC, eult.id DESC
|
|
||||||
) eul ON eul.unite_logement_id = ul.id
|
|
||||||
JOIN categorie_batiment cb
|
|
||||||
ON cb.id = eul.categorie_batiment_id
|
|
||||||
JOIN LATERAL (
|
|
||||||
SELECT *
|
|
||||||
FROM barem_rfu_bati br
|
|
||||||
WHERE br.categorie_batiment_id = cb.id
|
|
||||||
AND br.arrondissement_id = a.id
|
|
||||||
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
|
||||||
ORDER BY br.quartier_id DESC NULLS LAST
|
|
||||||
LIMIT 1
|
|
||||||
) brb ON TRUE
|
|
||||||
WHERE p.batie = TRUE
|
|
||||||
AND EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM unite_logement ul
|
|
||||||
WHERE ul.batiment_id = b.id
|
|
||||||
)
|
|
||||||
AND st.id = v_structure_id
|
|
||||||
ON CONFLICT DO NOTHING;
|
|
||||||
|
|
||||||
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
|
||||||
|
|
||||||
UPDATE donnees_imposition_tfu dtfu
|
|
||||||
SET
|
|
||||||
valeur_locative_adm =
|
|
||||||
CASE
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog <> 0
|
|
||||||
THEN valeur_locative_adm_sup_reel
|
|
||||||
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog = 0
|
|
||||||
THEN valeur_locative_adm_taux_prop_parc
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0
|
|
||||||
THEN valeur_batiment * (v_taux_valeur_locat_prof/100)
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0
|
|
||||||
THEN montant_loyer_annuel
|
|
||||||
END,
|
|
||||||
|
|
||||||
montant_taxe =
|
|
||||||
CASE
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog <> 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
THEN valeur_locative_adm_sup_reel * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
|
|
||||||
WHEN categorie_usage = 'HABITATION' AND superficie_au_sol_ulog = 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
THEN valeur_locative_adm_taux_prop_parc * (v_taux_tfu/100) + tfu_piscine
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment <> 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
|
||||||
THEN valeur_batiment * (v_taux_valeur_locat_prof/100) * (v_taux_tfu/100)
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
|
|
||||||
WHEN categorie_usage IN ('PROFESSIONNELLE','MIXTE') AND valeur_batiment = 0 THEN
|
|
||||||
CASE
|
|
||||||
WHEN tfu_minimum < montant_loyer_annuel * (v_taux_tfu/100)
|
|
||||||
THEN montant_loyer_annuel * (v_taux_tfu/100)
|
|
||||||
ELSE tfu_minimum
|
|
||||||
END
|
|
||||||
END
|
|
||||||
WHERE impositions_tfu_id = p_impositions_tfu_id
|
|
||||||
AND batie = TRUE
|
|
||||||
AND EXISTS (
|
|
||||||
SELECT 1
|
|
||||||
FROM unite_logement ul
|
|
||||||
WHERE ul.batiment_id = dtfu.batiment_id
|
|
||||||
);
|
|
||||||
RETURN v_rows_inserted;
|
|
||||||
END;
|
|
||||||
$$;*/
|
|
||||||
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie_unite_logement(
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie_unite_logement(
|
||||||
p_impositions_tfu_id BIGINT,
|
p_impositions_tfu_id BIGINT,
|
||||||
p_user_id BIGINT
|
p_user_id BIGINT
|
||||||
@@ -446,6 +51,8 @@ BEGIN
|
|||||||
'TFU_PAR_PISCINE'
|
'TFU_PAR_PISCINE'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
-- Ratios pré-calculés pour éviter la division répétée dans le SELECT
|
-- Ratios pré-calculés pour éviter la division répétée dans le SELECT
|
||||||
v_taux_tfu_ratio := v_taux_tfu / 100.0;
|
v_taux_tfu_ratio := v_taux_tfu / 100.0;
|
||||||
v_taux_vlp_ratio := v_taux_valeur_locat_prof / 100.0;
|
v_taux_vlp_ratio := v_taux_valeur_locat_prof / 100.0;
|
||||||
@@ -454,6 +61,27 @@ BEGIN
|
|||||||
-- 3. INSERT avec calcul complet de valeur_locative_adm et montant_taxe
|
-- 3. INSERT avec calcul complet de valeur_locative_adm et montant_taxe
|
||||||
-- → supprime l'UPDATE post-INSERT (économie d'un second scan de table)
|
-- → supprime l'UPDATE post-INSERT (économie d'un second scan de table)
|
||||||
-- -------------------------------------------------------------------------
|
-- -------------------------------------------------------------------------
|
||||||
|
WITH uniteLogementSupTotal as (
|
||||||
|
WITH derniere_enquete_ulog AS (
|
||||||
|
SELECT
|
||||||
|
eul.*,
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
PARTITION BY unite_logement_id
|
||||||
|
ORDER BY date_enquete DESC
|
||||||
|
) AS rn
|
||||||
|
FROM enquete_unite_logement eul
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
ul.batiment_id,
|
||||||
|
dimp.montant_taxe,
|
||||||
|
SUM(ulog.superficie_au_sol) AS superficie_totale
|
||||||
|
FROM derniere_enquete_ulog ulog
|
||||||
|
inner join unite_logement ul on ul.id=ulog.unite_logement_id
|
||||||
|
inner join donnees_imposition_tfu dimp on dimp.batiment_id= ul.batiment_id
|
||||||
|
WHERE rn = 1
|
||||||
|
AND dimp.impositions_tfu_id = p_impositions_tfu_id
|
||||||
|
GROUP BY ul.batiment_id,dimp.montant_taxe
|
||||||
|
)
|
||||||
INSERT INTO donnees_imposition_tfu (
|
INSERT INTO donnees_imposition_tfu (
|
||||||
annee,
|
annee,
|
||||||
code_departement,
|
code_departement,
|
||||||
@@ -570,7 +198,7 @@ BEGIN
|
|||||||
eul.date_enquete,
|
eul.date_enquete,
|
||||||
st.id,
|
st.id,
|
||||||
ep.zone_rfu_id,
|
ep.zone_rfu_id,
|
||||||
'TFU',
|
'FB',
|
||||||
p.superficie,
|
p.superficie,
|
||||||
eb.superficie_au_sol,
|
eb.superficie_au_sol,
|
||||||
eul.superficie_au_sol,
|
eul.superficie_au_sol,
|
||||||
@@ -620,7 +248,6 @@ BEGIN
|
|||||||
THEN eul.superficie_au_sol * brb.valeur_locative
|
THEN eul.superficie_au_sol * brb.valeur_locative
|
||||||
ELSE 0
|
ELSE 0
|
||||||
END,
|
END,
|
||||||
|
|
||||||
-- ---------------------------------------------------------------
|
-- ---------------------------------------------------------------
|
||||||
-- valeur_locative_adm avec tests explicites (corrigée)
|
-- valeur_locative_adm avec tests explicites (corrigée)
|
||||||
-- ---------------------------------------------------------------
|
-- ---------------------------------------------------------------
|
||||||
@@ -654,7 +281,6 @@ BEGIN
|
|||||||
|
|
||||||
ELSE 0
|
ELSE 0
|
||||||
END,
|
END,
|
||||||
|
|
||||||
-- 🔧 CORRECTION : tfu_superficie_au_sol_reel (était hardcodé à 6/100)
|
-- 🔧 CORRECTION : tfu_superficie_au_sol_reel (était hardcodé à 6/100)
|
||||||
CASE WHEN eul.categorie_usage = 'HABITATION'
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
THEN eul.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio
|
THEN eul.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio
|
||||||
@@ -667,56 +293,16 @@ BEGIN
|
|||||||
-- ---------------------------------------------------------------
|
-- ---------------------------------------------------------------
|
||||||
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
||||||
-- ---------------------------------------------------------------
|
-- ---------------------------------------------------------------
|
||||||
(
|
case when ulost.superficie_totale > 0
|
||||||
WITH calc AS (
|
then eul.superficie_au_sol * ulost.montant_taxe / ulost.superficie_totale
|
||||||
SELECT
|
else 0
|
||||||
COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
end,
|
||||||
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
|
||||||
NULLIF(eul.valeur_unite_logement_estime, 0), 0) AS valeur_ul,
|
|
||||||
COALESCE(NULLIF(eul.montant_locatif_annuel_declare, 0),
|
|
||||||
NULLIF(eul.montant_locatif_annuel_calcule, 0),
|
|
||||||
NULLIF(eul.montant_locatif_annuel_estime, 0), 0) AS loyer,
|
|
||||||
eul.superficie_au_sol * brb.valeur_locative AS vla_reel,
|
|
||||||
(p.superficie * v_taux_defaut_sup_sol / 100.0)
|
|
||||||
* brb.valeur_locative AS vla_70,
|
|
||||||
COALESCE(eul.nombre_piscine, 0) * v_tfu_piscine_unitaire AS piscine_montant
|
|
||||||
)
|
|
||||||
SELECT
|
|
||||||
CASE
|
|
||||||
WHEN eul.categorie_usage = 'HABITATION'
|
|
||||||
AND eul.superficie_au_sol <> 0
|
|
||||||
THEN GREATEST(brb.tfu_minimum,
|
|
||||||
calc.vla_reel * v_taux_tfu_ratio
|
|
||||||
+ calc.piscine_montant)
|
|
||||||
|
|
||||||
WHEN eul.categorie_usage = 'HABITATION'
|
|
||||||
AND eul.superficie_au_sol = 0
|
|
||||||
THEN GREATEST(brb.tfu_minimum,
|
|
||||||
calc.vla_70 * v_taux_tfu_ratio
|
|
||||||
+ calc.piscine_montant)
|
|
||||||
|
|
||||||
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
|
||||||
AND calc.valeur_ul <> 0
|
|
||||||
THEN GREATEST(brb.tfu_minimum,
|
|
||||||
calc.valeur_ul * v_taux_vlp_ratio * v_taux_tfu_ratio)
|
|
||||||
|
|
||||||
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
|
||||||
AND calc.valeur_ul = 0
|
|
||||||
THEN GREATEST(brb.tfu_minimum,
|
|
||||||
calc.loyer * v_taux_tfu_ratio)
|
|
||||||
|
|
||||||
ELSE brb.tfu_minimum
|
|
||||||
END
|
|
||||||
FROM calc
|
|
||||||
),
|
|
||||||
|
|
||||||
v_taux_tfu,
|
v_taux_tfu,
|
||||||
p.id,
|
p.id,
|
||||||
b.id,
|
b.id,
|
||||||
ul.id
|
ul.id
|
||||||
|
|
||||||
FROM parcelle p
|
FROM parcelle p
|
||||||
|
|
||||||
-- Dernière enquête parcelle
|
-- Dernière enquête parcelle
|
||||||
LEFT JOIN LATERAL (
|
LEFT JOIN LATERAL (
|
||||||
SELECT
|
SELECT
|
||||||
@@ -783,7 +369,8 @@ BEGIN
|
|||||||
LIMIT 1
|
LIMIT 1
|
||||||
) eb ON TRUE
|
) eb ON TRUE
|
||||||
|
|
||||||
JOIN unite_logement ul ON ul.batiment_id = b.id
|
JOIN unite_logement ul ON ul.batiment_id = b.id
|
||||||
|
INNER JOIN uniteLogementSupTotal ulost on ulost.batiment_id=ul.batiment_id
|
||||||
|
|
||||||
-- Dernière enquête unité logement
|
-- Dernière enquête unité logement
|
||||||
JOIN LATERAL (
|
JOIN LATERAL (
|
||||||
|
|||||||
@@ -0,0 +1,448 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_batie_ulo_une_parcelle(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT,
|
||||||
|
p_parcelle_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
v_taux_defaut_sup_sol NUMERIC;
|
||||||
|
v_taux_tfu NUMERIC;
|
||||||
|
v_taux_tfu_ratio NUMERIC; -- v_taux_tfu / 100 (pré-calculé)
|
||||||
|
v_taux_valeur_locat_prof NUMERIC;
|
||||||
|
v_taux_vlp_ratio NUMERIC; -- v_taux_valeur_locat_prof / 100 (pré-calculé)
|
||||||
|
v_tfu_piscine_unitaire NUMERIC;
|
||||||
|
v_today DATE;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
v_today := CURRENT_DATE;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 1. Récupération de l'année et de la structure (inchangée)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 2. Récupération des 4 paramètres en UNE seule requête
|
||||||
|
-- (évite 4 accès séquentiels à la table parameters)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
SELECT
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_DEFAUT_SUPERFICIE_AU_SOL'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_TFU'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE'),
|
||||||
|
MAX(value) FILTER (WHERE name = 'TFU_PAR_PISCINE')
|
||||||
|
INTO STRICT
|
||||||
|
v_taux_defaut_sup_sol,
|
||||||
|
v_taux_tfu,
|
||||||
|
v_taux_valeur_locat_prof,
|
||||||
|
v_tfu_piscine_unitaire
|
||||||
|
FROM parameters
|
||||||
|
WHERE name IN (
|
||||||
|
'TAUX_DEFAUT_SUPERFICIE_AU_SOL',
|
||||||
|
'TAUX_TFU',
|
||||||
|
'TAUX_VALEUR_LOCATIVE_PROFESSIONNELLE',
|
||||||
|
'TFU_PAR_PISCINE'
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Ratios pré-calculés pour éviter la division répétée dans le SELECT
|
||||||
|
v_taux_tfu_ratio := v_taux_tfu / 100.0;
|
||||||
|
v_taux_vlp_ratio := v_taux_valeur_locat_prof / 100.0;
|
||||||
|
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
-- 3. INSERT avec calcul complet de valeur_locative_adm et montant_taxe
|
||||||
|
-- → supprime l'UPDATE post-INSERT (économie d'un second scan de table)
|
||||||
|
-- -------------------------------------------------------------------------
|
||||||
|
WITH uniteLogementSupTotal as (
|
||||||
|
WITH derniere_enquete_ulog AS (
|
||||||
|
SELECT
|
||||||
|
eul.*,
|
||||||
|
ROW_NUMBER() OVER (
|
||||||
|
PARTITION BY unite_logement_id
|
||||||
|
ORDER BY date_enquete DESC
|
||||||
|
) AS rn
|
||||||
|
FROM enquete_unite_logement eul
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
ul.batiment_id,
|
||||||
|
dimp.montant_taxe,
|
||||||
|
SUM(ulog.superficie_au_sol) AS superficie_totale
|
||||||
|
FROM derniere_enquete_ulog ulog
|
||||||
|
inner join unite_logement ul on ul.id=ulog.unite_logement_id
|
||||||
|
inner join donnees_imposition_tfu dimp on dimp.batiment_id= ul.batiment_id
|
||||||
|
WHERE rn = 1
|
||||||
|
AND dimp.impositions_tfu_id = p_impositions_tfu_id
|
||||||
|
GROUP BY ul.batiment_id,dimp.montant_taxe
|
||||||
|
)
|
||||||
|
INSERT INTO donnees_imposition_tfu (
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
num_batiment,
|
||||||
|
num_unite_logement,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
batiment_exonere,
|
||||||
|
unite_logement_exonere,
|
||||||
|
standing_bat,
|
||||||
|
categorie_bat,
|
||||||
|
nombre_piscine,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
superficie_au_sol_bat,
|
||||||
|
superficie_au_sol_ulog,
|
||||||
|
valeur_batiment,
|
||||||
|
valeur_locative_adm_metre_carre,
|
||||||
|
montant_loyer_annuel,
|
||||||
|
tfu_metre_carre,
|
||||||
|
tfu_minimum,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
"source",
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
categorie_usage,
|
||||||
|
superficie_au_sol_taux_prop_parc, -- 70 % superficie parcelle
|
||||||
|
valeur_locative_adm_taux_prop_parc,
|
||||||
|
tfu_calcule_taux_prop_parc, -- TFU à 70 %
|
||||||
|
valeur_locative_adm_sup_reel,
|
||||||
|
valeur_locative_adm, -- valeur locative administrative finale
|
||||||
|
tfu_superficie_au_sol_reel,
|
||||||
|
tfu_piscine,
|
||||||
|
montant_taxe, -- TFU finale
|
||||||
|
taux_tfu,
|
||||||
|
parcelle_id,
|
||||||
|
batiment_id,
|
||||||
|
unite_logement_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
b.nub,
|
||||||
|
ul.nul,
|
||||||
|
eul.ifu,
|
||||||
|
eul.npi,
|
||||||
|
eul.tel1,
|
||||||
|
eul.email,
|
||||||
|
eul.nom,
|
||||||
|
eul.prenom,
|
||||||
|
eul.raison_sociale,
|
||||||
|
eul.adresse,
|
||||||
|
eul.representant_tel,
|
||||||
|
eul.representant_nom,
|
||||||
|
eul.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
TRUE,
|
||||||
|
-- exonere parcelle
|
||||||
|
(v_today BETWEEN ep.date_debut_exemption
|
||||||
|
AND COALESCE(ep.date_fin_exemption, v_today)),
|
||||||
|
-- exonere batiment
|
||||||
|
(v_today BETWEEN eb.date_debut_excemption
|
||||||
|
AND COALESCE(eb.date_fin_excemption, v_today)),
|
||||||
|
-- exonere unite logement
|
||||||
|
(v_today BETWEEN eul.date_debut_exemption
|
||||||
|
AND COALESCE(eul.date_fin_exemption, v_today)),
|
||||||
|
cb.standing,
|
||||||
|
cb.nom,
|
||||||
|
COALESCE(eul.nombre_piscine, 0),
|
||||||
|
eul.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'FB',
|
||||||
|
p.superficie,
|
||||||
|
eb.superficie_au_sol,
|
||||||
|
eul.superficie_au_sol,
|
||||||
|
-- valeur_batiment (unité logement) : première valeur non nulle non zéro
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.valeur_locative,
|
||||||
|
-- montant_loyer_annuel
|
||||||
|
COALESCE(
|
||||||
|
NULLIF(eul.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime, 0),
|
||||||
|
0
|
||||||
|
),
|
||||||
|
brb.tfu_metre_carre,
|
||||||
|
brb.tfu_minimum,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
FALSE,
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
v_today,
|
||||||
|
p_user_id,
|
||||||
|
eul.categorie_usage,
|
||||||
|
|
||||||
|
-- superficie_au_sol_taux_prop_parc (70 % parcelle)
|
||||||
|
p.superficie * v_taux_defaut_sup_sol / 100.0,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_taux_prop_parc
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_calcule_taux_prop_parc
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative * v_taux_tfu_ratio
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- valeur_locative_adm_sup_reel
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN eul.superficie_au_sol * brb.valeur_locative
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- valeur_locative_adm avec tests explicites (corrigée)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
CASE
|
||||||
|
WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
AND eul.superficie_au_sol <> 0
|
||||||
|
THEN eul.superficie_au_sol * brb.valeur_locative
|
||||||
|
|
||||||
|
WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
AND eul.superficie_au_sol = 0
|
||||||
|
THEN (p.superficie * v_taux_defaut_sup_sol / 100.0) * brb.valeur_locative
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_unite_logement <> 0
|
||||||
|
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0), 0) <> 0
|
||||||
|
THEN COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0), 0)
|
||||||
|
* v_taux_vlp_ratio
|
||||||
|
|
||||||
|
-- ✅ Test explicite : valeur_unite_logement = 0
|
||||||
|
WHEN eul.categorie_usage IN ('PROFESSIONNELLE', 'MIXTE')
|
||||||
|
AND COALESCE(NULLIF(eul.valeur_unite_logement_reel, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_calcule, 0),
|
||||||
|
NULLIF(eul.valeur_unite_logement_estime, 0), 0) = 0
|
||||||
|
THEN COALESCE(NULLIF(eul.montant_locatif_annuel_declare, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_calcule, 0),
|
||||||
|
NULLIF(eul.montant_locatif_annuel_estime, 0), 0)
|
||||||
|
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
-- 🔧 CORRECTION : tfu_superficie_au_sol_reel (était hardcodé à 6/100)
|
||||||
|
CASE WHEN eul.categorie_usage = 'HABITATION'
|
||||||
|
THEN eul.superficie_au_sol * brb.valeur_locative * v_taux_tfu_ratio
|
||||||
|
ELSE 0
|
||||||
|
END,
|
||||||
|
|
||||||
|
-- tfu_piscine
|
||||||
|
COALESCE(eul.nombre_piscine, 0) * v_tfu_piscine_unitaire,
|
||||||
|
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
-- montant_taxe ← calculé directement (plus d'UPDATE)
|
||||||
|
-- ---------------------------------------------------------------
|
||||||
|
case when ulost.superficie_totale > 0
|
||||||
|
then eul.superficie_au_sol * ulost.montant_taxe / ulost.superficie_totale
|
||||||
|
else 0
|
||||||
|
end,
|
||||||
|
v_taux_tfu,
|
||||||
|
p.id,
|
||||||
|
b.id,
|
||||||
|
ul.id
|
||||||
|
|
||||||
|
FROM parcelle p
|
||||||
|
-- Dernière enquête parcelle
|
||||||
|
LEFT JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
WHERE parcelle_id = p.id
|
||||||
|
ORDER BY date_enquete DESC, id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) ep ON TRUE
|
||||||
|
|
||||||
|
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
-- Rattachement structure via secteur
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
WHERE quartier_id = q.id
|
||||||
|
ORDER BY quartier_id
|
||||||
|
LIMIT 1
|
||||||
|
) sd ON TRUE
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
JOIN batiment b ON b.parcelle_id = p.id
|
||||||
|
|
||||||
|
-- Dernière enquête bâtiment
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
eb2.batiment_id,
|
||||||
|
eb2.superficie_au_sol,
|
||||||
|
eb2.nombre_piscine,
|
||||||
|
eb2.categorie_batiment_id,
|
||||||
|
eb2.date_enquete,
|
||||||
|
eb2.montant_locatif_annuel_declare,
|
||||||
|
eb2.montant_locatif_annuel_calcule,
|
||||||
|
eb2.montant_locatif_annuel_estime,
|
||||||
|
eb2.date_debut_excemption,
|
||||||
|
eb2.date_fin_excemption,
|
||||||
|
eb2.valeur_batiment_reel,
|
||||||
|
eb2.valeur_batiment_calcule,
|
||||||
|
eb2.valeur_batiment_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_batiment eb2
|
||||||
|
JOIN usage u ON u.id = eb2.usage_id
|
||||||
|
WHERE eb2.batiment_id = b.id
|
||||||
|
ORDER BY eb2.date_enquete DESC, eb2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eb ON TRUE
|
||||||
|
|
||||||
|
JOIN unite_logement ul ON ul.batiment_id = b.id
|
||||||
|
INNER JOIN uniteLogementSupTotal ulost on ulost.batiment_id=ul.batiment_id
|
||||||
|
|
||||||
|
-- Dernière enquête unité logement
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT
|
||||||
|
eul2.unite_logement_id,
|
||||||
|
pers1.id,
|
||||||
|
pers1.ifu,
|
||||||
|
pers1.npi,
|
||||||
|
pers1.tel1,
|
||||||
|
pers1.email,
|
||||||
|
pers1.nom,
|
||||||
|
pers1.prenom,
|
||||||
|
pers1.raison_sociale,
|
||||||
|
pers1.adresse,
|
||||||
|
eul2.nombre_piscine,
|
||||||
|
eul2.categorie_batiment_id,
|
||||||
|
eul2.superficie_au_sol,
|
||||||
|
eul2.superficie_louee,
|
||||||
|
eul2.nbre_piece,
|
||||||
|
eul2.date_enquete,
|
||||||
|
eul2.montant_locatif_annuel_calcule,
|
||||||
|
eul2.montant_locatif_annuel_declare,
|
||||||
|
eul2.montant_locatif_annuel_estime,
|
||||||
|
eul2.date_debut_exemption,
|
||||||
|
eul2.date_fin_exemption,
|
||||||
|
eul2.representant_nom,
|
||||||
|
eul2.representant_prenom,
|
||||||
|
eul2.representant_tel,
|
||||||
|
eul2.valeur_unite_logement_reel,
|
||||||
|
eul2.valeur_unite_logement_calcule,
|
||||||
|
eul2.valeur_unite_logement_estime,
|
||||||
|
u.categorie_usage
|
||||||
|
FROM enquete_unite_logement eul2
|
||||||
|
JOIN usage u ON u.id = eul2.usage_id
|
||||||
|
LEFT JOIN personne pers1 ON pers1.id = eul2.personne_id
|
||||||
|
WHERE eul2.unite_logement_id = ul.id
|
||||||
|
ORDER BY eul2.date_enquete DESC, eul2.id DESC
|
||||||
|
LIMIT 1
|
||||||
|
) eul ON TRUE
|
||||||
|
|
||||||
|
JOIN categorie_batiment cb ON cb.id = eul.categorie_batiment_id
|
||||||
|
|
||||||
|
-- Barème RFU bâti (inchangé)
|
||||||
|
JOIN LATERAL (
|
||||||
|
SELECT *
|
||||||
|
FROM barem_rfu_bati br
|
||||||
|
WHERE br.categorie_batiment_id = cb.id
|
||||||
|
AND br.arrondissement_id = a.id
|
||||||
|
AND (br.quartier_id = q.id OR br.quartier_id IS NULL)
|
||||||
|
ORDER BY br.quartier_id DESC NULLS LAST
|
||||||
|
LIMIT 1
|
||||||
|
) brb ON TRUE
|
||||||
|
|
||||||
|
WHERE p.batie = TRUE
|
||||||
|
AND EXISTS (
|
||||||
|
SELECT 1
|
||||||
|
FROM unite_logement ul2
|
||||||
|
WHERE ul2.batiment_id = b.id
|
||||||
|
)
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
AND p.id = p_parcelle_id
|
||||||
|
AND NOT exists(select 1 from donnees_imposition_tfu dimptfu
|
||||||
|
where dimptfu.annee=v_annee
|
||||||
|
and dimptfu.batiment_id=b.id
|
||||||
|
and dimptfu.unite_logement_id=ul.id
|
||||||
|
and dimptfu.nature_impot='FB')
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
@@ -268,7 +268,7 @@ BEGIN
|
|||||||
ep.date_enquete,
|
ep.date_enquete,
|
||||||
st.id,
|
st.id,
|
||||||
ep.zone_rfu_id,
|
ep.zone_rfu_id,
|
||||||
'TFU',
|
'FNB',
|
||||||
p.superficie,
|
p.superficie,
|
||||||
p_impositions_tfu_id,
|
p_impositions_tfu_id,
|
||||||
false,
|
false,
|
||||||
|
|||||||
@@ -0,0 +1,190 @@
|
|||||||
|
CREATE OR REPLACE FUNCTION public.generer_donnees_imposition_tfu_non_batie_une_parcelle(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_user_id BIGINT,
|
||||||
|
p_parcelle_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS
|
||||||
|
$$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee BIGINT;
|
||||||
|
v_structure_id BIGINT;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
-- récupération de l'année
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO donnees_imposition_tfu(
|
||||||
|
annee,
|
||||||
|
code_departement,
|
||||||
|
nom_departement,
|
||||||
|
code_commune,
|
||||||
|
nom_commune,
|
||||||
|
code_arrondissement,
|
||||||
|
nom_arrondissement,
|
||||||
|
code_quartier_village,
|
||||||
|
nom_quartier_village,
|
||||||
|
q,
|
||||||
|
ilot,
|
||||||
|
parcelle,
|
||||||
|
nup,
|
||||||
|
titre_foncier,
|
||||||
|
ifu,
|
||||||
|
npi,
|
||||||
|
tel_prop,
|
||||||
|
email_prop,
|
||||||
|
nom_prop,
|
||||||
|
prenom_prop,
|
||||||
|
raison_sociale,
|
||||||
|
adresse_prop,
|
||||||
|
tel_sc,
|
||||||
|
nom_sc,
|
||||||
|
prenom_sc,
|
||||||
|
longitude,
|
||||||
|
latitude,
|
||||||
|
batie,
|
||||||
|
exonere,
|
||||||
|
date_enquete,
|
||||||
|
structure_id,
|
||||||
|
zone_rfu_id,
|
||||||
|
nature_impot,
|
||||||
|
superficie_parc,
|
||||||
|
impositions_tfu_id,
|
||||||
|
deleted,
|
||||||
|
created_at,
|
||||||
|
created_by,
|
||||||
|
"source",
|
||||||
|
updated_at,
|
||||||
|
updated_by,
|
||||||
|
taux_tfu,
|
||||||
|
valeur_admin_parcelle_nb,
|
||||||
|
valeur_admin_parcelle_nb_metre_carre,
|
||||||
|
montant_taxe,
|
||||||
|
parcelle_id,
|
||||||
|
personne_id
|
||||||
|
)
|
||||||
|
SELECT
|
||||||
|
v_annee,
|
||||||
|
d.code,
|
||||||
|
d.nom,
|
||||||
|
c.code,
|
||||||
|
c.nom,
|
||||||
|
a.code,
|
||||||
|
a.nom,
|
||||||
|
q.code,
|
||||||
|
q.nom,
|
||||||
|
p.q,
|
||||||
|
p.i,
|
||||||
|
p.p,
|
||||||
|
p.nup,
|
||||||
|
ep.numero_titre_foncier,
|
||||||
|
pers.ifu,
|
||||||
|
pers.npi,
|
||||||
|
pers.tel1,
|
||||||
|
pers.email,
|
||||||
|
pers.nom,
|
||||||
|
pers.prenom,
|
||||||
|
pers.raison_sociale,
|
||||||
|
pers.adresse,
|
||||||
|
ep.representant_tel,
|
||||||
|
ep.representant_nom,
|
||||||
|
ep.representant_prenom,
|
||||||
|
p.longitude,
|
||||||
|
p.latitude,
|
||||||
|
false,
|
||||||
|
(
|
||||||
|
CURRENT_DATE >= ep.date_debut_exemption
|
||||||
|
AND CURRENT_DATE <= COALESCE(ep.date_fin_exemption, CURRENT_DATE)
|
||||||
|
),
|
||||||
|
ep.date_enquete,
|
||||||
|
st.id,
|
||||||
|
ep.zone_rfu_id,
|
||||||
|
'FNB',
|
||||||
|
p.superficie,
|
||||||
|
p_impositions_tfu_id,
|
||||||
|
false,
|
||||||
|
current_date,
|
||||||
|
p_user_id,
|
||||||
|
'FISCAD',
|
||||||
|
current_date,
|
||||||
|
p_user_id,
|
||||||
|
brnb.taux,
|
||||||
|
CASE
|
||||||
|
WHEN brnb.au_metre_carre = true
|
||||||
|
THEN brnb.valeur_administrative_metre_carre * ep.superficie
|
||||||
|
ELSE brnb.valeur_administrative
|
||||||
|
END,
|
||||||
|
brnb.valeur_administrative_metre_carre,
|
||||||
|
CASE
|
||||||
|
WHEN brnb.au_metre_carre = true
|
||||||
|
THEN brnb.valeur_administrative_metre_carre * ep.superficie * brnb.taux / 100
|
||||||
|
ELSE brnb.valeur_administrative * brnb.taux / 100
|
||||||
|
END,
|
||||||
|
p.id,
|
||||||
|
ep.personne_id
|
||||||
|
FROM parcelle p
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT DISTINCT ON (parcelle_id)
|
||||||
|
parcelle_id,
|
||||||
|
superficie,
|
||||||
|
personne_id,
|
||||||
|
numero_titre_foncier,
|
||||||
|
date_enquete,
|
||||||
|
representant_tel,
|
||||||
|
representant_nom,
|
||||||
|
representant_prenom,
|
||||||
|
representant_npi,
|
||||||
|
date_debut_exemption,
|
||||||
|
date_fin_exemption,
|
||||||
|
zone_rfu_id
|
||||||
|
FROM enquete
|
||||||
|
ORDER BY parcelle_id, date_enquete DESC
|
||||||
|
) ep ON ep.parcelle_id = p.id
|
||||||
|
|
||||||
|
LEFT JOIN personne pers ON pers.id = ep.personne_id
|
||||||
|
|
||||||
|
JOIN quartier q ON q.id = p.quartier_id
|
||||||
|
JOIN arrondissement a ON a.id = q.arrondissement_id
|
||||||
|
JOIN commune c ON c.id = a.commune_id
|
||||||
|
JOIN departement d ON d.id = c.departement_id
|
||||||
|
|
||||||
|
-- ✅ CORRECTION ICI
|
||||||
|
JOIN (
|
||||||
|
SELECT DISTINCT ON (quartier_id)
|
||||||
|
quartier_id,
|
||||||
|
secteur_id
|
||||||
|
FROM secteur_decoupage
|
||||||
|
ORDER BY quartier_id
|
||||||
|
) sd ON sd.quartier_id = q.id
|
||||||
|
|
||||||
|
JOIN secteur sect ON sect.id = sd.secteur_id
|
||||||
|
JOIN section ses ON ses.id = sect.section_id
|
||||||
|
JOIN "structure" st ON st.id = ses.structure_id
|
||||||
|
|
||||||
|
LEFT JOIN barem_rfu_non_bati brnb
|
||||||
|
ON (brnb.commune_id = c.id AND brnb.zone_rfu_id = ep.zone_rfu_id)
|
||||||
|
|
||||||
|
WHERE p.batie = false
|
||||||
|
AND st.id = v_structure_id
|
||||||
|
AND p.id=p_parcelle_id
|
||||||
|
AND NOT EXISTS( select 1 from donnees_imposition_tfu dimptfu
|
||||||
|
where dimptfu.nature_impot='FNB'
|
||||||
|
and dimptfu.parcelle_id=p_parcelle_id
|
||||||
|
and dimptfu.annee=v_annee)
|
||||||
|
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/**
|
||||||
|
- recuperation et cumul des acomptes par exercice, commune, ifu et parcelle
|
||||||
|
- recuperation et cumul des rirf par exercice, commune, ifu et parcelle
|
||||||
|
*/
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION public.maj_donnees_imposition_tfu_irf_(
|
||||||
|
p_impositions_tfu_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
v_annee INTEGER;
|
||||||
|
v_structure_id INTEGER;
|
||||||
|
BEGIN
|
||||||
|
SELECT ex.annee, it.structure_id
|
||||||
|
INTO STRICT v_annee, v_structure_id
|
||||||
|
FROM impositions_tfu it
|
||||||
|
JOIN exercice ex ON ex.id = it.exercice_id
|
||||||
|
WHERE it.id = p_impositions_tfu_id;
|
||||||
|
|
||||||
|
WITH cumulRetenu as (
|
||||||
|
select ifu_retenue,
|
||||||
|
r_commune,
|
||||||
|
r_quartier,
|
||||||
|
qip_quartier,
|
||||||
|
qip_ilot,
|
||||||
|
qip_parcelle,
|
||||||
|
nup,
|
||||||
|
exercice,
|
||||||
|
sum(montant_payer) as cumul_retenu
|
||||||
|
from epaiement_retenu
|
||||||
|
where exercice = v_annee
|
||||||
|
group by ifu_retenue, r_commune, r_quartier,
|
||||||
|
qip_quartier, qip_ilot, qip_parcelle,
|
||||||
|
nup, exercice
|
||||||
|
)
|
||||||
|
UPDATE donnees_imposition_tfu dimp
|
||||||
|
SET
|
||||||
|
retenu_irf = coalesce(cr.cumul_retenu,0),
|
||||||
|
montant_restant = dimp.montant_taxe
|
||||||
|
- coalesce(cr.cumul_retenu,0)
|
||||||
|
FROM donnees_imposition_tfu dimp2
|
||||||
|
LEFT JOIN cumulRetenu cr ON (
|
||||||
|
cr.exercice = dimp2.annee
|
||||||
|
AND cr.r_commune = dimp2.code_commune
|
||||||
|
AND cr.ifu_retenue = dimp2.ifu
|
||||||
|
AND cr.r_quartier = dimp2.code_quartier_village
|
||||||
|
AND cr.qip_quartier = dimp2.q
|
||||||
|
AND cr.qip_ilot = dimp2.ilot
|
||||||
|
AND cr.qip_parcelle = dimp2.parcelle
|
||||||
|
AND cr.nup = dimp2.nup
|
||||||
|
AND cr.nup = dimp2.nup
|
||||||
|
)
|
||||||
|
WHERE dimp.id = dimp2.id
|
||||||
|
AND dimp.impositions_tfu_id = p_impositions_tfu_id
|
||||||
|
AND dimp.nature_impot ='IRF';
|
||||||
|
|
||||||
|
|
||||||
|
WITH cumulAcompte as (
|
||||||
|
select ifu,
|
||||||
|
r_commune,
|
||||||
|
r_quartier,
|
||||||
|
qip_quartier,
|
||||||
|
qip_ilot,
|
||||||
|
qip_parcelle,
|
||||||
|
nup,
|
||||||
|
exercice,
|
||||||
|
sum(montant_payer) as cumul_acompte
|
||||||
|
from epaiement_acompte
|
||||||
|
where exercice = v_annee
|
||||||
|
group by ifu, r_commune, r_quartier,
|
||||||
|
qip_quartier, qip_ilot, qip_parcelle,
|
||||||
|
nup, exercice
|
||||||
|
)
|
||||||
|
UPDATE donnees_imposition_tfu dimp
|
||||||
|
SET
|
||||||
|
acompte = coalesce(ac.cumul_acompte,0),
|
||||||
|
montant_restant = dimp.montant_taxe
|
||||||
|
- coalesce(ac.cumul_acompte,0)
|
||||||
|
FROM donnees_imposition_tfu dimp2
|
||||||
|
LEFT JOIN cumulAcompte ac ON (
|
||||||
|
ac.exercice = dimp2.annee
|
||||||
|
AND ac.r_commune = dimp2.code_commune
|
||||||
|
AND ac.ifu = dimp2.ifu
|
||||||
|
AND ac.r_quartier = dimp2.code_quartier_village
|
||||||
|
AND ac.qip_quartier = dimp2.q
|
||||||
|
AND ac.qip_ilot = dimp2.ilot
|
||||||
|
AND ac.qip_parcelle = dimp2.parcelle
|
||||||
|
AND ac.nup = dimp2.nup
|
||||||
|
)
|
||||||
|
WHERE dimp.id = dimp2.id
|
||||||
|
AND dimp.impositions_tfu_id = p_impositions_tfu_id
|
||||||
|
AND dimp.nature_impot in ('FNB','FB');
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$ ;
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
- consider les parcelles avec plusieurs batiment
|
||||||
|
- faire la somme (som_tfu_calcule) des TFU calculées
|
||||||
|
- on recupere la tfu minimum (max_tfu_min) de la catégorie la plus élévée des batiment
|
||||||
|
- si montant_tfu= Max(som_tfu_calcule, max_tfu_min)
|
||||||
|
*/
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION public.maj_donnees_imposition_tfu_batie_plusBati(
|
||||||
|
p_impositions_tfu_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
------MAJ pour les parcelles ayants plusieurs batiment
|
||||||
|
WITH donnees_imposition_plusieurs_bat AS (
|
||||||
|
SELECT
|
||||||
|
dimp.parcelle_id,
|
||||||
|
GREATEST(
|
||||||
|
MAX(dimp.tfu_minimum),
|
||||||
|
SUM(dimp.montant_taxe_brut)
|
||||||
|
) AS montant_tfu_parcelle,
|
||||||
|
COUNT(*) AS nombre_bat
|
||||||
|
FROM donnees_imposition_tfu dimp
|
||||||
|
LEFT JOIN unite_logement ul_filter on dimp.unite_logement_id = ul_filter.id
|
||||||
|
where impositions_tfu_id=p_impositions_tfu_id
|
||||||
|
AND batie=true and ul_filter.id is null
|
||||||
|
AND nature_impot='FB'
|
||||||
|
GROUP BY dimp.parcelle_id
|
||||||
|
HAVING COUNT(*) > 1
|
||||||
|
)
|
||||||
|
UPDATE donnees_imposition_tfu dimp
|
||||||
|
SET
|
||||||
|
montant_taxe = dippb.montant_tfu_parcelle,
|
||||||
|
nombre_bat = dippb.nombre_bat
|
||||||
|
FROM donnees_imposition_plusieurs_bat dippb
|
||||||
|
WHERE dimp.parcelle_id = dippb.parcelle_id
|
||||||
|
AND dimp.impositions_tfu_id=p_impositions_tfu_id;
|
||||||
|
|
||||||
|
------FIN MAJ pour les parcelles ayants plusieurs batiment
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
/**
|
||||||
|
- consider les parcelles avec plusieurs batiment
|
||||||
|
- faire la somme (som_tfu_calcule) des TFU calculées
|
||||||
|
- on recupere la tfu minimum (max_tfu_min) de la catégorie la plus élévée des batiment
|
||||||
|
- si montant_tfu= Max(som_tfu_calcule, max_tfu_min)
|
||||||
|
*/
|
||||||
|
|
||||||
|
CREATE OR REPLACE FUNCTION public.maj_donnees_imposition_tfu_batie_plusBati_une_parcelle(
|
||||||
|
p_impositions_tfu_id BIGINT,
|
||||||
|
p_parcelle_id BIGINT
|
||||||
|
)
|
||||||
|
RETURNS INTEGER
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
AS $$
|
||||||
|
DECLARE
|
||||||
|
v_rows_inserted INTEGER;
|
||||||
|
BEGIN
|
||||||
|
|
||||||
|
------MAJ pour les parcelles ayants plusieurs batiment
|
||||||
|
WITH donnees_imposition_plusieurs_bat AS (
|
||||||
|
SELECT
|
||||||
|
dimp.parcelle_id,
|
||||||
|
GREATEST(
|
||||||
|
MAX(dimp.tfu_minimum),
|
||||||
|
SUM(dimp.montant_taxe_brut)
|
||||||
|
) AS montant_tfu_parcelle,
|
||||||
|
COUNT(*) AS nombre_bat
|
||||||
|
FROM donnees_imposition_tfu dimp
|
||||||
|
LEFT JOIN unite_logement ul_filter on dimp.unite_logement_id = ul_filter.id
|
||||||
|
where impositions_tfu_id=p_impositions_tfu_id
|
||||||
|
AND batie=true and ul_filter.id is null
|
||||||
|
AND nature_impot='FB'
|
||||||
|
AND dimp.parcelle_id=p_parcelle_id
|
||||||
|
GROUP BY dimp.parcelle_id
|
||||||
|
HAVING COUNT(*) > 1
|
||||||
|
)
|
||||||
|
UPDATE donnees_imposition_tfu dimp
|
||||||
|
SET
|
||||||
|
montant_taxe = dippb.montant_tfu_parcelle,
|
||||||
|
nombre_bat = dippb.nombre_bat
|
||||||
|
FROM donnees_imposition_plusieurs_bat dippb
|
||||||
|
WHERE dimp.parcelle_id = dippb.parcelle_id
|
||||||
|
AND dimp.impositions_tfu_id=p_impositions_tfu_id;
|
||||||
|
|
||||||
|
------FIN MAJ pour les parcelles ayants plusieurs batiment
|
||||||
|
|
||||||
|
GET DIAGNOSTICS v_rows_inserted = ROW_COUNT;
|
||||||
|
|
||||||
|
RETURN v_rows_inserted;
|
||||||
|
END;
|
||||||
|
$$;
|
||||||
|
|
||||||
|
|
||||||
@@ -20,8 +20,6 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
value = """
|
value = """
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
||||||
cca.id,
|
cca.id,
|
||||||
cca.nc,
|
|
||||||
cca.ifu,
|
|
||||||
c.id,
|
c.id,
|
||||||
c.code,
|
c.code,
|
||||||
c.nom,
|
c.nom,
|
||||||
@@ -39,7 +37,8 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
q.code,
|
q.code,
|
||||||
parc.q,
|
parc.q,
|
||||||
parc.i,
|
parc.i,
|
||||||
parc.p
|
parc.p,
|
||||||
|
cca.adresseContact
|
||||||
)
|
)
|
||||||
FROM CommuneCentreAssignation cca
|
FROM CommuneCentreAssignation cca
|
||||||
LEFT JOIN cca.commune c
|
LEFT JOIN cca.commune c
|
||||||
@@ -59,8 +58,6 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
value = """
|
value = """
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
||||||
cca.id,
|
cca.id,
|
||||||
cca.nc,
|
|
||||||
cca.ifu,
|
|
||||||
c.id,
|
c.id,
|
||||||
c.code,
|
c.code,
|
||||||
c.nom,
|
c.nom,
|
||||||
@@ -78,7 +75,8 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
q.code,
|
q.code,
|
||||||
parc.q,
|
parc.q,
|
||||||
parc.i,
|
parc.i,
|
||||||
parc.p
|
parc.p,
|
||||||
|
cca.adresseContact
|
||||||
)
|
)
|
||||||
FROM CommuneCentreAssignation cca
|
FROM CommuneCentreAssignation cca
|
||||||
JOIN cca.structure s
|
JOIN cca.structure s
|
||||||
@@ -104,8 +102,6 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
value = """
|
value = """
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
||||||
cca.id,
|
cca.id,
|
||||||
cca.nc,
|
|
||||||
cca.ifu,
|
|
||||||
c.id,
|
c.id,
|
||||||
c.code,
|
c.code,
|
||||||
c.nom,
|
c.nom,
|
||||||
@@ -123,7 +119,8 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
q.code,
|
q.code,
|
||||||
parc.q,
|
parc.q,
|
||||||
parc.i,
|
parc.i,
|
||||||
parc.p
|
parc.p,
|
||||||
|
cca.adresseContact
|
||||||
)
|
)
|
||||||
FROM CommuneCentreAssignation cca
|
FROM CommuneCentreAssignation cca
|
||||||
JOIN cca.commune c
|
JOIN cca.commune c
|
||||||
@@ -148,8 +145,6 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
value = """
|
value = """
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
||||||
cca.id,
|
cca.id,
|
||||||
cca.nc,
|
|
||||||
cca.ifu,
|
|
||||||
c.id,
|
c.id,
|
||||||
c.code,
|
c.code,
|
||||||
c.nom,
|
c.nom,
|
||||||
@@ -167,7 +162,8 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
q.code,
|
q.code,
|
||||||
parc.q,
|
parc.q,
|
||||||
parc.i,
|
parc.i,
|
||||||
parc.p
|
parc.p,
|
||||||
|
cca.adresseContact
|
||||||
)
|
)
|
||||||
FROM CommuneCentreAssignation cca
|
FROM CommuneCentreAssignation cca
|
||||||
JOIN cca.structure s
|
JOIN cca.structure s
|
||||||
@@ -195,8 +191,6 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
@Query("""
|
@Query("""
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
||||||
cca.id,
|
cca.id,
|
||||||
cca.nc,
|
|
||||||
cca.ifu,
|
|
||||||
c.id,
|
c.id,
|
||||||
c.code,
|
c.code,
|
||||||
c.nom,
|
c.nom,
|
||||||
@@ -214,7 +208,8 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
q.code,
|
q.code,
|
||||||
parc.q,
|
parc.q,
|
||||||
parc.i,
|
parc.i,
|
||||||
parc.p
|
parc.p,
|
||||||
|
cca.adresseContact
|
||||||
)
|
)
|
||||||
FROM CommuneCentreAssignation cca
|
FROM CommuneCentreAssignation cca
|
||||||
JOIN cca.structure s
|
JOIN cca.structure s
|
||||||
@@ -236,8 +231,6 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
@Query("""
|
@Query("""
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
||||||
cca.id,
|
cca.id,
|
||||||
cca.nc,
|
|
||||||
cca.ifu,
|
|
||||||
c.id,
|
c.id,
|
||||||
c.code,
|
c.code,
|
||||||
c.nom,
|
c.nom,
|
||||||
@@ -255,7 +248,8 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
q.code,
|
q.code,
|
||||||
parc.q,
|
parc.q,
|
||||||
parc.i,
|
parc.i,
|
||||||
parc.p
|
parc.p,
|
||||||
|
cca.adresseContact
|
||||||
)
|
)
|
||||||
FROM CommuneCentreAssignation cca
|
FROM CommuneCentreAssignation cca
|
||||||
JOIN cca.structure s
|
JOIN cca.structure s
|
||||||
@@ -274,8 +268,6 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
@Query("""
|
@Query("""
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.CommuneCentreAssignationPaylaodWeb(
|
||||||
cca.id,
|
cca.id,
|
||||||
cca.nc,
|
|
||||||
cca.ifu,
|
|
||||||
c.id,
|
c.id,
|
||||||
c.code,
|
c.code,
|
||||||
c.nom,
|
c.nom,
|
||||||
@@ -293,7 +285,8 @@ public interface CommuneCentreAssignationRepository extends JpaRepository<Commun
|
|||||||
q.code,
|
q.code,
|
||||||
parc.q,
|
parc.q,
|
||||||
parc.i,
|
parc.i,
|
||||||
parc.p
|
parc.p,
|
||||||
|
cca.adresseContact
|
||||||
)
|
)
|
||||||
FROM CommuneCentreAssignation cca
|
FROM CommuneCentreAssignation cca
|
||||||
JOIN cca.structure s
|
JOIN cca.structure s
|
||||||
|
|||||||
@@ -28,7 +28,12 @@ public interface DeclarationNcRepository extends JpaRepository<DeclarationNc, Lo
|
|||||||
p.nom,
|
p.nom,
|
||||||
p.prenom,
|
p.prenom,
|
||||||
p.raisonSociale,
|
p.raisonSociale,
|
||||||
d.observation
|
d.observation,
|
||||||
|
d.q,
|
||||||
|
d.i,
|
||||||
|
d.p,
|
||||||
|
d.numeroTitreFoncier,
|
||||||
|
d.nup
|
||||||
)
|
)
|
||||||
FROM DeclarationNc d
|
FROM DeclarationNc d
|
||||||
LEFT JOIN d.structure s
|
LEFT JOIN d.structure s
|
||||||
@@ -50,7 +55,12 @@ public interface DeclarationNcRepository extends JpaRepository<DeclarationNc, Lo
|
|||||||
p.nom,
|
p.nom,
|
||||||
p.prenom,
|
p.prenom,
|
||||||
p.raisonSociale,
|
p.raisonSociale,
|
||||||
d.observation
|
d.observation,
|
||||||
|
d.q,
|
||||||
|
d.i,
|
||||||
|
d.p,
|
||||||
|
d.numeroTitreFoncier,
|
||||||
|
d.nup
|
||||||
)
|
)
|
||||||
FROM DeclarationNc d
|
FROM DeclarationNc d
|
||||||
LEFT JOIN d.structure s
|
LEFT JOIN d.structure s
|
||||||
@@ -71,7 +81,12 @@ public interface DeclarationNcRepository extends JpaRepository<DeclarationNc, Lo
|
|||||||
p.nom,
|
p.nom,
|
||||||
p.prenom,
|
p.prenom,
|
||||||
p.raisonSociale,
|
p.raisonSociale,
|
||||||
d.observation
|
d.observation,
|
||||||
|
d.q,
|
||||||
|
d.i,
|
||||||
|
d.p,
|
||||||
|
d.numeroTitreFoncier,
|
||||||
|
d.nup
|
||||||
)
|
)
|
||||||
FROM DeclarationNc d
|
FROM DeclarationNc d
|
||||||
LEFT JOIN d.structure s
|
LEFT JOIN d.structure s
|
||||||
@@ -93,7 +108,12 @@ public interface DeclarationNcRepository extends JpaRepository<DeclarationNc, Lo
|
|||||||
p.nom,
|
p.nom,
|
||||||
p.prenom,
|
p.prenom,
|
||||||
p.raisonSociale,
|
p.raisonSociale,
|
||||||
d.observation
|
d.observation,
|
||||||
|
d.q,
|
||||||
|
d.i,
|
||||||
|
d.p,
|
||||||
|
d.numeroTitreFoncier,
|
||||||
|
d.nup
|
||||||
)
|
)
|
||||||
FROM DeclarationNc d
|
FROM DeclarationNc d
|
||||||
LEFT JOIN d.structure s
|
LEFT JOIN d.structure s
|
||||||
@@ -116,7 +136,12 @@ public interface DeclarationNcRepository extends JpaRepository<DeclarationNc, Lo
|
|||||||
p.nom,
|
p.nom,
|
||||||
p.prenom,
|
p.prenom,
|
||||||
p.raisonSociale,
|
p.raisonSociale,
|
||||||
d.observation
|
d.observation,
|
||||||
|
d.q,
|
||||||
|
d.i,
|
||||||
|
d.p,
|
||||||
|
d.numeroTitreFoncier,
|
||||||
|
d.nup
|
||||||
)
|
)
|
||||||
FROM DeclarationNc d
|
FROM DeclarationNc d
|
||||||
LEFT JOIN d.structure s
|
LEFT JOIN d.structure s
|
||||||
@@ -135,4 +160,34 @@ public interface DeclarationNcRepository extends JpaRepository<DeclarationNc, Lo
|
|||||||
Pageable pageable
|
Pageable pageable
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@Query("""
|
||||||
|
SELECT distinct new io.gmss.fiscad.paylaods.request.crudweb.DeclarationNcPayloadWeb(
|
||||||
|
d.id,
|
||||||
|
d.dateDerniereDeclaration,
|
||||||
|
d.dateDeclarationNc,
|
||||||
|
d.nc,
|
||||||
|
s.id,
|
||||||
|
s.code,
|
||||||
|
s.nom,
|
||||||
|
p.id,
|
||||||
|
p.nom,
|
||||||
|
p.prenom,
|
||||||
|
p.raisonSociale,
|
||||||
|
d.observation,
|
||||||
|
d.q,
|
||||||
|
d.i,
|
||||||
|
d.p,
|
||||||
|
d.numeroTitreFoncier,
|
||||||
|
d.nup
|
||||||
|
)
|
||||||
|
FROM DeclarationNc d
|
||||||
|
LEFT JOIN d.structure s
|
||||||
|
LEFT JOIN d.personne p
|
||||||
|
WHERE d.nc= :nc
|
||||||
|
and p.id <> :personneId
|
||||||
|
""")
|
||||||
|
List<DeclarationNcPayloadWeb> findAllDeclarationNcByNcNotPersonneToDto(@Param("nc") String nc, @Param("personneId") Long personneId);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -508,53 +508,115 @@ SELECT new io.gmss.fiscad.paylaods.request.crudweb.DonneesImpositionPaylaodWeb(
|
|||||||
Pageable pageable
|
Pageable pageable
|
||||||
);
|
);
|
||||||
|
|
||||||
@Query(value = "SELECT generer_donnees_imposition_tfu_batie(:structureId, :impositionId)", nativeQuery = true)
|
@Query(value = "SELECT generer_donnees_imposition_tfu_batie(:impositionId, :userId)", nativeQuery = true)
|
||||||
Integer genererDonneesTfuBatie(
|
Integer genererDonneesTfuBatie(
|
||||||
@Param("structureId") Long structureId,
|
@Param("impositionId") Long impositionId,
|
||||||
@Param("impositionId") Long impositionId
|
@Param("userId") Long userId
|
||||||
|
);
|
||||||
|
|
||||||
|
@Query(value = "SELECT generer_donnees_imposition_tfu_batie_une_parcelle(:impositionId, :userId,:parcelleId)", nativeQuery = true)
|
||||||
|
Integer genererDonneesTfuBatie(
|
||||||
|
@Param("impositionId") Long impositionId,
|
||||||
|
@Param("userId") Long userId,
|
||||||
|
@Param("parcelleId") Long parcelleId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@Query(value = "SELECT generer_donnees_imposition_tfu_batie_unite_logement(:structureId, :impositionId)", nativeQuery = true)
|
@Query(value = "SELECT generer_donnees_imposition_tfu_batie_unite_logement(:impositionId, :userId)", nativeQuery = true)
|
||||||
Integer genererDonneesTfuBatieUniteLogement(
|
Integer genererDonneesTfuBatieUniteLogement(
|
||||||
@Param("structureId") Long structureId,
|
@Param("impositionId") Long impositionId,
|
||||||
@Param("impositionId") Long impositionId
|
@Param("userId") Long userId
|
||||||
|
);
|
||||||
|
|
||||||
|
@Query(value = "SELECT generer_donnees_imposition_tfu_batie_ulo_une_parcelle(:impositionId, :userId,:parcelleId)", nativeQuery = true)
|
||||||
|
Integer genererDonneesTfuBatieUniteLogement(
|
||||||
|
@Param("impositionId") Long impositionId,
|
||||||
|
@Param("userId") Long userId,
|
||||||
|
@Param("parcelleId") Long parcelleId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@Query(value = "SELECT generer_donnees_imposition_tfu_non_batie(:structureId, :impositionId)", nativeQuery = true)
|
@Query(value = "SELECT generer_donnees_imposition_tfu_non_batie(:impositionId, :userId)", nativeQuery = true)
|
||||||
Integer genererDonneesTfuNonBatie(
|
Integer genererDonneesTfuNonBatie(
|
||||||
@Param("structureId") Long structureId,
|
@Param("impositionId") Long impositionId,
|
||||||
@Param("impositionId") Long impositionId
|
@Param("userId") Long userId
|
||||||
);
|
);
|
||||||
|
|
||||||
@Query(value = "SELECT generer_donnees_imposition_irf_batie(:structureId, :impositionId)", nativeQuery = true)
|
@Query(value = "SELECT generer_donnees_imposition_tfu_non_batie_une_parcelle(:impositionId, :userId, :parcelleId)", nativeQuery = true)
|
||||||
|
Integer genererDonneesTfuNonBatie(
|
||||||
|
@Param("impositionId") Long impositionId,
|
||||||
|
@Param("userId") Long userId,
|
||||||
|
@Param("parcelleId") Long parcelleId
|
||||||
|
);
|
||||||
|
|
||||||
|
@Query(value = "SELECT generer_donnees_imposition_irf_batie(:impositionId, :userId)", nativeQuery = true)
|
||||||
Integer genererDonneesIrfBatie(
|
Integer genererDonneesIrfBatie(
|
||||||
@Param("structureId") Long structureId,
|
@Param("impositionId") Long impositionId,
|
||||||
@Param("impositionId") Long impositionId
|
@Param("userId") Long userId
|
||||||
);
|
);
|
||||||
|
|
||||||
@Query(value = "SELECT generer_donnees_imposition_srtb_batie(:structureId, :impositionId)", nativeQuery = true)
|
@Query(value = "SELECT generer_donnees_imposition_irf_batie_une_parcelle(:impositionId, :userId, :parcelleId)", nativeQuery = true)
|
||||||
|
Integer genererDonneesIrfBatie(
|
||||||
|
@Param("impositionId") Long impositionId,
|
||||||
|
@Param("userId") Long userId,
|
||||||
|
@Param("parcelleId") Long parcelleId
|
||||||
|
);
|
||||||
|
|
||||||
|
@Query(value = "SELECT generer_donnees_imposition_srtb_batie(:impositionId, :userId)", nativeQuery = true)
|
||||||
Integer genererDonneesSrtbBatie(
|
Integer genererDonneesSrtbBatie(
|
||||||
@Param("structureId") Long structureId,
|
@Param("impositionId") Long impositionId,
|
||||||
@Param("impositionId") Long impositionId
|
@Param("userId") Long userId
|
||||||
);
|
);
|
||||||
|
|
||||||
@Query(value = "SELECT generer_donnees_imposition_irf_batie_unite_logement(:structureId, :impositionId)", nativeQuery = true)
|
@Query(value = "SELECT generer_donnees_imposition_srtb_batie_une_parcelle(:impositionId, :userId, :parcelleId)", nativeQuery = true)
|
||||||
|
Integer genererDonneesSrtbBatie(
|
||||||
|
@Param("impositionId") Long impositionId,
|
||||||
|
@Param("userId") Long userId,
|
||||||
|
@Param("parcelleId") Long parcelleId
|
||||||
|
);
|
||||||
|
|
||||||
|
@Query(value = "SELECT generer_donnees_imposition_irf_batie_unite_logement(:impositionId, :userId)", nativeQuery = true)
|
||||||
Integer genererDonneesIrfBatieUniteLogement(
|
Integer genererDonneesIrfBatieUniteLogement(
|
||||||
@Param("structureId") Long structureId,
|
@Param("impositionId") Long impositionId,
|
||||||
|
@Param("userId") Long userId
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
@Query(value = "SELECT generer_donnees_imposition_irf_batie_ulo_une_parcelle(:impositionId, :userId, :parcelleId)", nativeQuery = true)
|
||||||
|
Integer genererDonneesIrfBatieUniteLogement(
|
||||||
|
@Param("impositionId") Long impositionId,
|
||||||
|
@Param("userId") Long userId,
|
||||||
|
@Param("parcelleId") Long parcelleId
|
||||||
|
);
|
||||||
|
|
||||||
|
// @Query(value = "SELECT generer_donnees_imposition_srtb_batie_unite_logement(:impositionId, :userId)", nativeQuery = true)
|
||||||
|
// Integer genererDonneesSrtbBatieUniteLogement(
|
||||||
|
// @Param("impositionId") Long impositionId,
|
||||||
|
// @Param("userId") Long userId
|
||||||
|
// );
|
||||||
|
|
||||||
|
// @Query(value = "SELECT generer_donnees_imposition_srtb_batie_u(:impositionId, :userId)", nativeQuery = true)
|
||||||
|
// Integer genererDonneesSrtbBatieUniteLogement(
|
||||||
|
// @Param("impositionId") Long impositionId,
|
||||||
|
// @Param("userId") Long userId
|
||||||
|
// );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@Query(value = "SELECT maj_donnees_imposition_tfu_batie_plusBati(:impositionId)", nativeQuery = true)
|
||||||
|
Integer majDonneesTfuBatiePlusieursBatiment(
|
||||||
@Param("impositionId") Long impositionId
|
@Param("impositionId") Long impositionId
|
||||||
);
|
);
|
||||||
|
|
||||||
@Query(value = "SELECT generer_donnees_imposition_srtb_batie_unite_logement(:structureId, :impositionId)", nativeQuery = true)
|
@Query(value = "SELECT maj_donnees_imposition_tfu_batie_plusbati_une_parcelle(:impositionId,:parcelleId)", nativeQuery = true)
|
||||||
Integer genererDonneesSrtbBatieUniteLogement(
|
Integer majDonneesTfuBatiePlusieursBatiment(
|
||||||
@Param("structureId") Long structureId,
|
@Param("impositionId") Long impositionId,
|
||||||
@Param("impositionId") Long impositionId
|
@Param("parcelleId") Long parcelleId
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Query(value = """
|
@Query(value = """
|
||||||
SELECT new io.gmss.fiscad.paylaods.request.crudweb.DonneesImpositionPaylaodWeb(
|
SELECT new io.gmss.fiscad.paylaods.request.crudweb.DonneesImpositionPaylaodWeb(
|
||||||
d.id,
|
d.id,
|
||||||
|
|||||||
@@ -211,6 +211,11 @@ public class EntityFromPayLoadService {
|
|||||||
declarationNc.setStructure(optionalStructure.orElse(null));
|
declarationNc.setStructure(optionalStructure.orElse(null));
|
||||||
declarationNc.setPersonne(optionalPersonne.orElse(null));
|
declarationNc.setPersonne(optionalPersonne.orElse(null));
|
||||||
declarationNc.setNc(declarationNcPayloadWeb.getNc());
|
declarationNc.setNc(declarationNcPayloadWeb.getNc());
|
||||||
|
declarationNc.setQ(declarationNcPayloadWeb.getQ());
|
||||||
|
declarationNc.setI(declarationNcPayloadWeb.getI());
|
||||||
|
declarationNc.setP(declarationNcPayloadWeb.getP());
|
||||||
|
declarationNc.setNumeroTitreFoncier(declarationNcPayloadWeb.getNumeroTitreFoncier());
|
||||||
|
declarationNc.setNup(declarationNcPayloadWeb.getNup());
|
||||||
declarationNc.setDateDerniereDeclaration(declarationNcPayloadWeb.getDateDerniereDeclaration());
|
declarationNc.setDateDerniereDeclaration(declarationNcPayloadWeb.getDateDerniereDeclaration());
|
||||||
declarationNc.setDateDeclarationNc(declarationNcPayloadWeb.getDateDeclarationNc());
|
declarationNc.setDateDeclarationNc(declarationNcPayloadWeb.getDateDeclarationNc());
|
||||||
return declarationNc ;
|
return declarationNc ;
|
||||||
@@ -1010,6 +1015,8 @@ public class EntityFromPayLoadService {
|
|||||||
communeCentreAssignation.setPersonne(personne);
|
communeCentreAssignation.setPersonne(personne);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
communeCentreAssignation.setAdresseContact(communeCentreAssignationPaylaodWeb.getAdresseContact());
|
||||||
|
|
||||||
// if (communeCentreAssignationPaylaodWeb.getCommuneId() != null) {
|
// if (communeCentreAssignationPaylaodWeb.getCommuneId() != null) {
|
||||||
// Commune commune = new Commune();
|
// Commune commune = new Commune();
|
||||||
// commune.setId(communeCentreAssignationPaylaodWeb.getCommuneId());
|
// commune.setId(communeCentreAssignationPaylaodWeb.getCommuneId());
|
||||||
|
|||||||
Reference in New Issue
Block a user