jeremy преди 4 месеца
родител
ревизия
074b58a2fd
променени са 2 файла, в които са добавени 67 реда и са изтрити 14 реда
  1. 32 5
      backend/src/routes/charges.js
  2. 35 9
      backend/src/routes/receipts.js

+ 32 - 5
backend/src/routes/charges.js

@@ -220,8 +220,34 @@ router.get('/bilan/:property_id/:year/pdf', async (req, res) => {
   const prop = db.prepare('SELECT * FROM properties WHERE id = ? AND user_id = ?').get(property_id, req.userId);
   if (!prop) return res.status(403).json({ error: 'Bien non autorisé' });
 
-  const owner = db.prepare('SELECT name, first_name, last_name, email, address, phone FROM users WHERE id = ?').get(req.userId);
-  const ownerFullName = (owner.first_name && owner.last_name) ? `${owner.first_name} ${owner.last_name}` : owner.name;
+  // Chercher le propriétaire lié au bail actif sur ce bien, sinon fallback profil gestionnaire
+  const ownerRow = db.prepare(`
+    SELECT o.type as o_type, o.first_name, o.last_name, o.company_name, o.siret,
+           o.address, o.zip_code, o.city, o.email, o.phone
+    FROM leases l
+    JOIN owners o ON l.owner_id = o.id
+    WHERE l.property_id = ? AND l.user_id = ? AND o.id IS NOT NULL
+    ORDER BY l.active DESC, l.start_date DESC
+    LIMIT 1
+  `).get(property_id, req.userId);
+
+  let ownerFullName, ownerAddress, ownerEmail, ownerPhone, ownerSiret;
+  if (ownerRow) {
+    ownerFullName = ownerRow.o_type === 'morale'
+      ? ownerRow.company_name
+      : `${ownerRow.first_name || ''} ${ownerRow.last_name || ''}`.trim();
+    ownerSiret = ownerRow.siret;
+    ownerAddress = [ownerRow.address, ownerRow.zip_code && ownerRow.city ? `${ownerRow.zip_code} ${ownerRow.city}` : (ownerRow.zip_code || ownerRow.city)].filter(Boolean).join(', ');
+    ownerEmail = ownerRow.email;
+    ownerPhone = ownerRow.phone;
+  } else {
+    const u = db.prepare('SELECT name, first_name, last_name, email, address, phone FROM users WHERE id = ?').get(req.userId);
+    ownerFullName = (u.first_name && u.last_name) ? `${u.first_name} ${u.last_name}` : u.name;
+    ownerSiret = null;
+    ownerAddress = u.address;
+    ownerEmail = u.email;
+    ownerPhone = u.phone;
+  }
 
   const totalChargesRow = db.prepare(`
     SELECT SUM(amount) as total, COUNT(*) as count FROM charges
@@ -294,9 +320,10 @@ router.get('/bilan/:property_id/:year/pdf', async (req, res) => {
       doc.fontSize(9).fillColor(gray).text('BAILLEUR', { continued: false });
       doc.fontSize(10).fillColor('#111827').font('Helvetica-Bold').text(ownerFullName);
       doc.font('Helvetica');
-      if (owner.address) doc.fontSize(10).fillColor('#374151').text(owner.address);
-      doc.fontSize(10).fillColor('#374151').text(owner.email || '');
-      if (owner.phone) doc.fontSize(10).fillColor('#374151').text(owner.phone);
+      if (ownerSiret) doc.fontSize(10).fillColor('#374151').text(`SIRET : ${ownerSiret}`);
+      if (ownerAddress) doc.fontSize(10).fillColor('#374151').text(ownerAddress);
+      if (ownerEmail) doc.fontSize(10).fillColor('#374151').text(ownerEmail);
+      if (ownerPhone) doc.fontSize(10).fillColor('#374151').text(ownerPhone);
       doc.moveDown(0.5);
       doc.moveTo(50, doc.y).lineTo(50 + W, doc.y).strokeColor('#e5e7eb').lineWidth(1).stroke();
       doc.moveDown(1);

+ 35 - 9
backend/src/routes/receipts.js

@@ -14,19 +14,47 @@ router.get('/:paymentId', (req, res) => {
       l.rent_amount, l.charges_amount, l.deposit_amount,
       pr.name as property_name, pr.address as property_address, pr.city as property_city, pr.zip_code as property_zip,
       t.first_name as tenant_first_name, t.last_name as tenant_last_name, t.email as tenant_email,
-      u.name as owner_name, u.email as owner_email,
-      u.first_name as owner_first_name, u.last_name as owner_last_name,
-      u.address as owner_address, u.phone as owner_phone
+      -- Propriétaire bailleur (owners table en priorité, fallback profil utilisateur)
+      o.type as o_type,
+      o.first_name as o_first_name, o.last_name as o_last_name,
+      o.company_name as o_company_name, o.siret as o_siret,
+      o.address as o_address, o.zip_code as o_zip, o.city as o_city,
+      o.email as o_email, o.phone as o_phone,
+      -- Fallback gestionnaire
+      u.name as u_name, u.email as u_email,
+      u.first_name as u_first_name, u.last_name as u_last_name,
+      u.address as u_address, u.phone as u_phone
     FROM payments p
     JOIN leases l ON p.lease_id = l.id
     JOIN properties pr ON l.property_id = pr.id
     JOIN tenants t ON l.tenant_id = t.id
     JOIN users u ON p.user_id = u.id
+    LEFT JOIN owners o ON l.owner_id = o.id
     WHERE p.id = ? AND p.user_id = ?
   `).get(req.params.paymentId, req.userId);
 
   if (!payment) return res.status(404).json({ error: 'Paiement non trouvé' });
 
+  // Résoudre le nom du bailleur : owner en priorité, sinon profil gestionnaire
+  let ownerFullName, ownerAddress, ownerEmail, ownerPhone, ownerSiret;
+  if (payment.o_type) {
+    ownerFullName = payment.o_type === 'morale'
+      ? payment.o_company_name
+      : `${payment.o_first_name || ''} ${payment.o_last_name || ''}`.trim();
+    ownerSiret = payment.o_siret;
+    ownerAddress = [payment.o_address, payment.o_zip && payment.o_city ? `${payment.o_zip} ${payment.o_city}` : (payment.o_zip || payment.o_city)].filter(Boolean).join(', ');
+    ownerEmail = payment.o_email;
+    ownerPhone = payment.o_phone;
+  } else {
+    ownerFullName = (payment.u_first_name && payment.u_last_name)
+      ? `${payment.u_first_name} ${payment.u_last_name}`
+      : payment.u_name;
+    ownerSiret = null;
+    ownerAddress = payment.u_address;
+    ownerEmail = payment.u_email;
+    ownerPhone = payment.u_phone;
+  }
+
   const doc = new PDFDocument({ size: 'A4', margin: 50 });
 
   res.setHeader('Content-Type', 'application/pdf');
@@ -47,14 +75,12 @@ router.get('/:paymentId', (req, res) => {
   doc.moveDown(1);
 
   // Bailleur
-  const ownerFullName = (payment.owner_first_name && payment.owner_last_name)
-    ? `${payment.owner_first_name} ${payment.owner_last_name}`
-    : payment.owner_name;
   doc.fontSize(12).font('Helvetica-Bold').text('BAILLEUR');
   doc.font('Helvetica').fontSize(11).text(ownerFullName);
-  if (payment.owner_address) doc.text(payment.owner_address);
-  doc.text(payment.owner_email);
-  if (payment.owner_phone) doc.text(payment.owner_phone);
+  if (ownerSiret) doc.text(`SIRET : ${ownerSiret}`);
+  if (ownerAddress) doc.text(ownerAddress);
+  if (ownerEmail) doc.text(ownerEmail);
+  if (ownerPhone) doc.text(ownerPhone);
   doc.moveDown(1);
 
   // Locataire