Parcourir la source

Use a more generic 'bill' object in invoice templates

Alexandre Aubin il y a 6 ans
Parent
commit
72691e1546

+ 235 - 0
arn/templates/billing/invoice_pdf.html

@@ -0,0 +1,235 @@
+{% load static isptags %}
+<html>
+<head>
+  <title>Facture N°{{ bill.number }}</title>
+
+  <style>
+  @page {
+    margin: 0; padding: 40pt;
+  }
+
+  html {
+    box-sizing: border-box;
+  }
+  *, *:before, *:after {
+    box-sizing: inherit;
+  }
+
+  body {
+    font-size: 9pt;
+    font-family: sans-serif;
+    color: #111;
+    padding: 0;
+  }
+  a {
+    color: #111;
+    text-decoration: none;
+  }
+
+  p {
+    margin: 0;
+  }
+  p + p {
+    margin-top: 10pt;
+  }
+  table {
+    border-collapse: collapse;
+    width: 100%;
+    margin: 40pt 0;
+  }
+
+  h1 {
+    font-size: 12pt;
+  }
+
+  #header {
+    margin: 0 0 60pt 0;
+    border: none;
+  }
+
+  #header .logo {
+    height: 50pt;
+    margin: 0;
+  }
+
+  #header .header-left {
+    text-align: left;
+  }
+
+  #header .header-right {
+    text-align: right;
+  }
+
+  footer {
+    position: fixed;
+    bottom: 0;
+    width: 100%;
+  }
+
+  footer .logo {
+    height: 20pt;
+  }
+
+  #coordonnees {}
+
+  #coordonnees td {
+    width: 50%;
+    vertical-align: top;
+  }
+
+  #details {}
+
+  #details th,
+  #details td {
+    padding: 5pt;
+    border:1px solid #ddd;
+  }
+  #details th.cell--empty,
+  #details td.cell--empty {border: 0;}
+
+  /* details cell layout */
+  .cell-label {width: 70%;}
+  .cell-quantity {width: 5%;}
+  .cell-amount {width: 10%;}
+  .cell-tax {width: 5%;}
+  .cell-total {width: 15%;}
+
+  /* details cell style */
+  .cell-result {
+    font-weight: bold;
+  }
+  .cell-quantity {
+    text-align: center;
+  }
+  .cell--money,
+  .cell-tax {
+    text-align: right;
+    white-space: nowrap;
+  }
+
+  .cell-label p + p {
+    margin-top: 5pt;
+  }
+  .period {
+    color:#888;
+  }
+
+  #paiements {
+    margin-top: 40pt;
+    background-color: #f0f0f0;
+    padding: 10pt;
+    font-size: x-small;
+  }
+
+  footer {
+    font-size: xx-small;
+  }
+  .pagination {
+    float: right;
+  }
+  </style>
+</head>
+<body>
+
+  <table id="header">
+      <tr>
+          <td class="header-left">
+              <img class="logo" src="{{ branding.logoURL }}" />
+          </td>
+          <td class="header-right">
+              <p>Facture N°{{ bill.number }}</p>
+              <p>Date : {{ bill.date }}</p>
+          </td>
+      </tr>
+  </table>
+
+  <table id="coordonnees">
+    <tr>
+      <td id="coordonnees_isp">
+        <p>
+        {% multiline_isp_addr branding %}
+        </p>
+        <p>
+        <a href="mailto:{{ branding.email }}">{{ branding.email }}</a><br/>
+        <a href="{{ branding.website }}">{{ branding.website }}</a><br />
+        {{ branding.phone_number }}<br />
+        SIRET : {{ branding.registeredoffice.siret }}
+        </p>
+      </td>
+      <td id="coordonnees_client">
+        <p>
+        <strong>Facturé à</strong><br/>
+        {% with member=bill.member %}
+        {{ member.last_name }} {{ member.first_name }}<br />
+        {% if member.organization_name != "" %}{{ member.organization_name }}<br />{% endif %}
+        {% if member.address %}{{member.address}}<br />{% endif %}
+        {% if member.postal_code and member.city %}
+        {{ member.postal_code }} {{ member.city }}
+        {% endif %}
+        {% endwith %}
+        </p>
+      </td>
+    </tr>
+  </table>
+
+  <table id="details" repeat="1">
+    <thead>
+      <tr>
+        <th class="cell-label cell--empty"></th>
+        <th class="cell-quantity">Quantité</th>
+        <th class="cell-amount cell--money">PU (HT)</th>
+        <th class="cell-label cell-tax">TVA</th>
+        <th class="cell-total cell--money">Total</th>
+      </tr>
+    </thead>
+    <tbody>
+      {% for detail in bill.details.all %}
+      <tr>
+        <td class="cell-label">
+          <p>
+          {{ detail.label }}
+          {% if detail.offersubscription %}
+            <br/>
+            <span class="subscription">{{ detail.offersubscription.offer.name }}
+            {% if detail.offersubscription.offer.reference %} ({{ detail.offersubscription.get_subscription_reference }}){% endif %}
+            </span>
+          {% endif %}
+          </p>
+          {% if detail.period_from and detail.period_to %}
+          <p class="period">Pour la période du {{ detail.period_from }} au {{ detail.period_to }}</p>
+          {% endif %}
+        </td>
+        <td class="cell-quantity">{{ detail.quantity }}</td>
+        <td class="cell-amount cell--money">{{ detail.amount }}€</td>
+        <td class="cell-tax">{{ detail.tax }}%</td>
+        <td class="cell-total cell--money">{{ detail.total }}€</td>
+      </tr>
+      {% endfor %}
+
+      <tr>
+        <td class="cell-result cell--empty"></td>
+        <td class="result-label " colspan="3">Total HT</td>
+        <td class="cell--money ">{{ bill.amount_before_tax }}€</td>
+      </tr>
+      <tr>
+        <td class="cell-result cell--empty"></td>
+        <td class="cell-result result-label" colspan="3">Total TTC</td>
+        <td class="cell-result result-total cell--money">{{ bill.amount }}€</td>
+      </tr>
+
+    </tbody>
+  </table>
+
+  <p>TVA non applicable - article 293 B du CGI</p>
+  <p>À payer sans escompte avant le {{ bill.date_due }}.</p>
+
+  <div id="paiements">
+  {% include "billing/payment_howto.html" %}
+  </div>
+
+  <footer>
+    <p class="pagination"><pdf:pagenumber>/<pdf:pagecount></p>
+    <p>{{ branding.shortname|upper }} est une association de droit local alsacien-mosellan à but non lucratif.</p>
+  </footer>
+</body>
+</html>

+ 1 - 1
coin/billing/models.py

@@ -115,7 +115,7 @@ class Bill(models.Model):
         """
         Make and store a pdf file for the invoice
         """
-        context = {"invoice": self}
+        context = {"bill": self}
         context.update(branding(None))
         pdf_file = render_as_pdf('billing/invoice_pdf.html', context)
         self.pdf.save('%s.pdf' % self.number, pdf_file)

+ 8 - 8
coin/billing/templates/billing/invoice_pdf.html

@@ -1,7 +1,7 @@
 {% load static isptags %}
 <html>
 <head>
-  <title>Facture N°{{ invoice.number }}</title>
+  <title>Facture N°{{ bill.number }}</title>
 
   <style>
   @page {
@@ -124,8 +124,8 @@
 
   <header>
     <img class="logo" src="{{ branding.logoURL }}" />
-    <h1>Facture N°{{ invoice.number }}</h1>
-    <p>Le {{ invoice.date }}</p>
+    <h1>Facture N°{{ bill.number }}</h1>
+    <p>Le {{ bill.date }}</p>
   </header>
 
   <table id="coordonnees">
@@ -143,7 +143,7 @@
       <td id="coordonnees_client">
         <p>
         <strong>Facturé à :</strong><br/>
-        {% with member=invoice.member %}
+        {% with member=bill.member %}
         {{ member.last_name }} {{ member.first_name }}<br />
         {% if member.organization_name != "" %}{{ member.organization_name }}<br />{% endif %}
         {% if member.address %}{{member.address}}<br />{% endif %}
@@ -167,7 +167,7 @@
       </tr>
     </thead>
     <tbody>
-      {% for detail in invoice.details.all %}
+      {% for detail in bill.details.all %}
       <tr>
         <td class="cell-label">
           <p>
@@ -193,18 +193,18 @@
       <tr>
         <td class="cell-result cell--empty"></td>
         <td class="result-label " colspan="3">Total HT</td>
-        <td class="cell--money ">{{ invoice.amount_before_tax }}€</td>
+        <td class="cell--money ">{{ bill.amount_before_tax }}€</td>
       </tr>
       <tr>
         <td class="cell-result cell--empty"></td>
         <td class="cell-result result-label" colspan="3">Total TTC</td>
-        <td class="cell-result result-total cell--money">{{ invoice.amount }}€</td>
+        <td class="cell-result result-total cell--money">{{ bill.amount }}€</td>
       </tr>
        
     </tbody>
   </table>
   <p>
-    Facture à payer avant le {{ invoice.date_due }}.
+    Facture à payer avant le {{ bill.date_due }}.
   </p>
 
   <div id="paiements">