Catégorisation des platformes et application de la fiscalité adapté (Impact PSAN , régime micro-BIC)

This commit is contained in:
ocroguennec committed 2026-08-30 16:53:04 +02:00
1 parent 8953d0bb35
commit 33fee587aa
10 files changed
+610 -53

No files matched your search

+11 -9
View File
@@ -77,6 +77,7 @@ const Schema = z.object({
fiscalite: z.enum(['flat_tax', 'sans_fiscalite_locale', 'avec_fiscalite_locale']).default('flat_tax'),
taux_fiscalite_locale: z.number().min(0).max(100).nullable().optional(),
type_produit_fiscal: z.enum(['2TT', '2TR']).default('2TT'),
categorie_plateforme: z.enum(['psfp', 'psan']).default('psfp'),
methode_remboursement: z.enum(['portefeuille', 'compte_courant', 'choix_investisseur']).optional().default('portefeuille'),
type_pret_defaut: z.enum(['in_fine', 'amortissable', 'differe']).nullable().optional(),
freq_interets_defaut: z.enum(['mensuel', 'trimestriel', 'in_fine']).nullable().optional(),
@@ -321,6 +322,7 @@ router.get('/export', (req, res, next) => {
fiscalite: r.fiscalite,
taux_fiscalite_locale: r.taux_fiscalite_locale,
type_produit_fiscal: r.type_produit_fiscal,
categorie_plateforme: r.categorie_plateforme,
description: r.description,
annee_creation: r.annee_creation,
investisseurs_types: r.investisseurs_types,
@@ -523,7 +525,7 @@ router.post('/import-zip', zipUpload.single('file'), async (req, res, next) => {
const fields = [
p.url || null, p.domiciliation || 'france', p.fiscalite || 'flat_tax',
p.taux_fiscalite_locale ?? null, p.type_produit_fiscal || '2TT',
p.taux_fiscalite_locale ?? null, p.type_produit_fiscal || '2TT', p.categorie_plateforme || 'psfp',
p.methode_remboursement || 'portefeuille', p.type_pret_defaut ?? null, p.freq_interets_defaut ?? null,
p.description ?? null, p.annee_creation ?? null,
p.investisseurs_types ?? null,
@@ -541,7 +543,7 @@ router.post('/import-zip', zipUpload.single('file'), async (req, res, next) => {
if (existing) {
db.prepare(`
UPDATE plateformes_referentiel SET
url=?, domiciliation=?, fiscalite=?, taux_fiscalite_locale=?, type_produit_fiscal=?,
url=?, domiciliation=?, fiscalite=?, taux_fiscalite_locale=?, type_produit_fiscal=?, categorie_plateforme=?,
methode_remboursement=?, type_pret_defaut=?, freq_interets_defaut=?,
description=?, annee_creation=?, investisseurs_types=?,
regulateur=?, numero_licence=?, is_regule=?,
@@ -559,7 +561,7 @@ router.post('/import-zip', zipUpload.single('file'), async (req, res, next) => {
} else {
const r = db.prepare(`
INSERT INTO plateformes_referentiel
(nom, url, domiciliation, fiscalite, taux_fiscalite_locale, type_produit_fiscal,
(nom, url, domiciliation, fiscalite, taux_fiscalite_locale, type_produit_fiscal, categorie_plateforme,
methode_remboursement, type_pret_defaut, freq_interets_defaut,
description, annee_creation, investisseurs_types,
regulateur, numero_licence, is_regule,
@@ -569,7 +571,7 @@ router.post('/import-zip', zipUpload.single('file'), async (req, res, next) => {
garantie_rachat, statistiques_publiques, bonus_inscription, marche_secondaire, investissement_auto,
url_trustpilot, url_linkedin,
logo_filename, icone_filename, updated_at)
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,datetime('now'))
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,datetime('now'))
`).run(p.nom, ...fields);
refId = r.lastInsertRowid;
created++;
@@ -668,7 +670,7 @@ router.post('/', (req, res, next) => {
const r = db.prepare(`
INSERT INTO plateformes_referentiel
(nom, url, domiciliation, fiscalite, taux_fiscalite_locale, type_produit_fiscal,
(nom, url, domiciliation, fiscalite, taux_fiscalite_locale, type_produit_fiscal, categorie_plateforme,
methode_remboursement, type_pret_defaut, freq_interets_defaut,
logo_filename, description,
annee_creation, investisseurs_types,
@@ -680,7 +682,7 @@ router.post('/', (req, res, next) => {
VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, datetime('now'))
`).run(
data.nom, data.url || null, data.domiciliation, data.fiscalite,
data.taux_fiscalite_locale ?? null, data.type_produit_fiscal,
data.taux_fiscalite_locale ?? null, data.type_produit_fiscal, data.categorie_plateforme,
data.methode_remboursement || 'portefeuille', data.type_pret_defaut ?? null, data.freq_interets_defaut ?? null,
data.logo_filename ?? null, data.description ?? null,
data.annee_creation ?? null, data.investisseurs_types ?? null,
@@ -722,7 +724,7 @@ router.put('/:id', (req, res, next) => {
db.prepare(`
UPDATE plateformes_referentiel
SET nom=?, url=?, domiciliation=?, fiscalite=?, taux_fiscalite_locale=?,
type_produit_fiscal=?, methode_remboursement=?, type_pret_defaut=?, freq_interets_defaut=?,
type_produit_fiscal=?, categorie_plateforme=?, methode_remboursement=?, type_pret_defaut=?, freq_interets_defaut=?,
logo_filename=?, description=?,
annee_creation=?, investisseurs_types=?,
regulateur=?, numero_licence=?, is_regule=?,
@@ -735,7 +737,7 @@ router.put('/:id', (req, res, next) => {
WHERE id=?
`).run(
data.nom, data.url || null, data.domiciliation, data.fiscalite,
data.taux_fiscalite_locale ?? null, data.type_produit_fiscal,
data.taux_fiscalite_locale ?? null, data.type_produit_fiscal, data.categorie_plateforme,
data.methode_remboursement || 'portefeuille', data.type_pret_defaut ?? null, data.freq_interets_defaut ?? null,
data.logo_filename ?? null, data.description ?? null,
data.annee_creation ?? null, data.investisseurs_types ?? null,
@@ -814,7 +816,7 @@ router.post('/:id/push', (req, res, next) => {
const force = req.body?.force === true;
// Champs scalaires poussables
const PUSHABLE = ['nom', 'url', 'domiciliation', 'fiscalite', 'taux_fiscalite_locale', 'type_produit_fiscal', 'logo_filename', 'methode_remboursement', 'type_pret_defaut', 'freq_interets_defaut'];
const PUSHABLE = ['nom', 'url', 'domiciliation', 'fiscalite', 'taux_fiscalite_locale', 'type_produit_fiscal', 'categorie_plateforme', 'logo_filename', 'methode_remboursement', 'type_pret_defaut', 'freq_interets_defaut'];
// Catégories/secteurs du référentiel
const refCatIds = db.prepare(