diff --git a/webUI/src/components/InvoiceElements.vue b/webUI/src/components/InvoiceElements.vue new file mode 100644 index 0000000..647b9b7 --- /dev/null +++ b/webUI/src/components/InvoiceElements.vue @@ -0,0 +1,418 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/components/LivePreview.vue b/webUI/src/components/LivePreview.vue new file mode 100644 index 0000000..84a0d83 --- /dev/null +++ b/webUI/src/components/LivePreview.vue @@ -0,0 +1,295 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/components/TemplateDesigner-README.md b/webUI/src/components/TemplateDesigner-README.md new file mode 100644 index 0000000..c2b1ad4 --- /dev/null +++ b/webUI/src/components/TemplateDesigner-README.md @@ -0,0 +1,196 @@ +# راهنمای سیستم طراحی قالب فاکتور + +## مقدمه + +سیستم طراحی قالب فاکتور یک ابزار قدرتمند برای ایجاد قالب‌های سفارشی فاکتور است که شامل دو حالت اصلی می‌باشد: + +1. **حالت کد نویسی**: ویرایشگر Monaco برای نوشتن کد HTML/Twig +2. **حالت طراحی**: رابط drag & drop برای طراحی بصری + +## ویژگی‌های اصلی + +### 🔧 حالت کد نویسی +- ویرایشگر Monaco با syntax highlighting +- پشتیبانی از HTML، CSS، و Twig +- Auto-completion و IntelliSense +- خطایابی کد + +### 🎨 حالت طراحی +- **Toolbox**: مجموعه عناصر آماده +- **Canvas**: فضای طراحی با grid system +- **Properties Panel**: تنظیمات المان‌ها +- **Drag & Drop**: کشیدن و رها کردن المان‌ها + +## عناصر موجود در Toolbox + +### عناصر پایه +- **کانتینر**: برای گروه‌بندی المان‌ها +- **متن**: برای اضافه کردن متن ساده +- **عنوان**: برای عناوین مختلف +- **جدول**: برای نمایش داده‌ها +- **تصویر**: برای اضافه کردن لوگو یا تصاویر +- **خط جداکننده**: برای تفکیک بخش‌ها + +### عناصر خاص فاکتور +- **اطلاعات کسب‌وکار**: نمایش اطلاعات فروشنده +- **اطلاعات مشتری**: نمایش اطلاعات خریدار +- **سربرگ فاکتور**: شامل لوگو، عنوان و شماره فاکتور +- **جدول اقلام**: برای نمایش محصولات/خدمات +- **جمع‌ها**: نمایش محاسبات نهایی +- **امضا**: بخش مهر و امضا + +### متغیرها +- متغیرهای Twig برای نمایش داده‌های پویا +- قابلیت فرمت‌بندی اعداد +- پشتیبانی از شرط‌ها و حلقه‌ها + +## نحوه استفاده + +### شروع کار +1. روی دکمه "طراحی" کلیک کنید +2. از Toolbox المان مورد نظر را انتخاب کنید +3. آن را روی Canvas بکشید و رها کنید +4. روی المان کلیک کنید تا Properties Panel باز شود + +### تنظیمات المان +- **ویژگی‌های پایه**: متن، کلاس CSS، شناسه +- **موقعیت و اندازه**: تنظیم grid position و span +- **استایل‌ها**: فونت، رنگ، تراز متن +- **تنظیمات خاص**: برای جداول و متغیرها + +### کتابخانه قالب‌ها +- قالب‌های آماده برای فروش، خرید و برگشت +- قالب‌های سفارشی +- امکان import/export قالب‌ها + +### پیش‌نمایش +- پیش‌نمایش زنده با داده‌های نمونه +- تنظیم اندازه کاغذ +- نمایش گرید و حاشیه‌ها +- چاپ و دانلود PDF + +## متغیرهای در دسترس + +### اطلاعات کسب‌وکار +- `{{ business.name }}`: نام کسب‌وکار +- `{{ business.tel }}`: تلفن +- `{{ business.address }}`: آدرس + +### اطلاعات فاکتور +- `{{ doc.code }}`: شماره فاکتور +- `{{ doc.date }}`: تاریخ فاکتور +- `{{ doc.amount }}`: مبلغ کل + +### اطلاعات مشتری +- `{{ person.name }}`: نام مشتری +- `{{ person.mobile }}`: موبایل +- `{{ person.address }}`: آدرس + +### اقلام فاکتور +```twig +{% for item in rows %} + {{ item.commodity.name }} - {{ item.commodityCount }} + {{ item.bs | number_format(0, '.', ',') }} +{% endfor %} +``` + +### جمع‌ها +- `{{ discount }}`: تخفیف +- `{{ transfer }}`: هزینه ارسال +- `{{ note }}`: یادداشت + +## نکات مهم + +### همگام‌سازی +- تغییرات در حالت طراحی به صورت خودکار به کد تبدیل می‌شود +- تغییرات در کد نیز روی طراحی اعمال می‌شود +- همیشه آخرین تغییرات ذخیره می‌شود + +### امنیت +- کدها در Sandbox اجرا می‌شوند +- فقط دستورات مجاز Twig قابل استفاده است +- از اجرای JavaScript جلوگیری می‌شود + +### بهینه‌سازی +- از CSS ساده استفاده کنید +- اندازه‌های مناسب برای چاپ تنظیم کنید +- از فونت‌های استاندارد استفاده کنید + +## عیب‌یابی + +### مشکلات متداول +1. **عدم نمایش المان**: بررسی کنید که grid position درست تنظیم شده باشد +2. **به‌هم‌ریختگی چاپ**: از CSS سازگار با چاپ استفاده کنید +3. **خطای متغیر**: نام متغیر را با لیست بالا تطبیق دهید + +### پشتیبانی +- برای مشکلات فنی با تیم توسعه تماس بگیرید +- مستندات کامل در بخش راهنما موجود است +- نمونه‌های آماده برای الهام گرفتن استفاده کنید + +## نمونه‌های کاربردی + +### قالب ساده فروش +```html +
+

{{ business.name }}

+

شماره: {{ doc.code }} | تاریخ: {{ doc.date }}

+ + + + {% for item in rows %} + + + + + + {% endfor %} +
کالاتعدادقیمت
{{ item.commodity.name }}{{ item.commodityCount }}{{ item.bs | number_format(0, '.', ',') }}
+ +

جمع کل: {{ doc.amount | number_format(0, '.', ',') }}

+
+``` + +### قالب پیشرفته +```html + + + + + + +
+ +
+ + +``` + +این سیستم به شما امکان می‌دهد تا قالب‌های حرفه‌ای و سفارشی برای فاکتورهای خود ایجاد کنید. \ No newline at end of file diff --git a/webUI/src/components/TemplateDesigner.vue b/webUI/src/components/TemplateDesigner.vue new file mode 100644 index 0000000..bd2ad33 --- /dev/null +++ b/webUI/src/components/TemplateDesigner.vue @@ -0,0 +1,1208 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/components/TemplateLibrary.vue b/webUI/src/components/TemplateLibrary.vue new file mode 100644 index 0000000..adfbf4c --- /dev/null +++ b/webUI/src/components/TemplateLibrary.vue @@ -0,0 +1,890 @@ + + + + + \ No newline at end of file diff --git a/webUI/src/views/acc/plugins/custominvoice/template-form.vue b/webUI/src/views/acc/plugins/custominvoice/template-form.vue index 061d3a7..a0c68c6 100644 --- a/webUI/src/views/acc/plugins/custominvoice/template-form.vue +++ b/webUI/src/views/acc/plugins/custominvoice/template-form.vue @@ -11,7 +11,19 @@ + + + @@ -21,7 +33,8 @@ @@ -30,31 +43,49 @@ راهنما و آموزش تنظیمات ویرایشگر - +
- + - + - کد قالب - + کد قالب * +
{{ codeError }}
+
+ {{ codeValidationError }} +
@@ -72,7 +103,8 @@

در این بخش می‌توانید با استفاده از زبان قالب‌بندی Twig و HTML/CSS، قالب فاکتور سفارشی خود را طراحی کنید. - برای جلوگیری از مشکلات امنیتی، رندر کدها در Sandbox انجام می‌شود؛ بنابراین تنها بخشی از امکانات Twig مجاز است. + برای جلوگیری از مشکلات امنیتی، رندر کدها در Sandbox انجام می‌شود؛ بنابراین تنها بخشی از امکانات + Twig مجاز است.

  • تگ‌های مجاز: if و for
  • @@ -94,7 +126,9 @@
  • business: اطلاعات کسب‌وکار
      -
    • business.name, business.tel, business.mobile, business.address
    • +
    • business.name, business.tel, business.mobile, + business.address +
    • business.shenasemeli, business.codeeghtesadi
  • @@ -102,22 +136,31 @@ doc: اطلاعات سند
    • doc.code, doc.date
    • -
    • در فروش: doc.taxPercent, doc.discountPercent, doc.discountType
    • +
    • در فروش: doc.taxPercent, doc.discountPercent, + doc.discountType +
  • person: اطلاعات مشتری/طرف حساب
      -
    • person.name, person.mobile, person.tel, person.address
    • +
    • person.name, person.mobile, person.tel, + person.address +
  • rows: آرایه اقلام فاکتور (هر ردیف یک شیء)
      -
    • row.commodity.name, row.commodity.code (ممکن است commodity تهی باشد)
    • +
    • row.commodity.name, row.commodity.code (ممکن است + commodity + تهی باشد)
    • row.commodityCount (و برای سازگاری قدیمی: row.commdityCount)
    • -
    • row.des, row.bs, row.bd (در خرید/برگشت از خرید)، row.tax, row.discount
    • -
    • در فروش/برگشت از فروش: row.showPercentDiscount, row.discountPercent
    • +
    • row.des, row.bs, row.bd (در خرید/برگشت از خرید)، + row.tax, row.discount +
    • +
    • در فروش/برگشت از فروش: row.showPercentDiscount, row.discountPercent +
  • @@ -146,40 +189,41 @@
    {% if person %}
    -<p>مشتری: {{ person.name | escape }}</p>
    -{% endif %}
    +                    <p>مشتری: {{ person.name | escape }}</p>
    +                    {% endif %}
     
    -<table width="100%" cellspacing="0" cellpadding="6" border="1">
    -  <thead>
    -    <tr>
    -      <th>#</th>
    -      <th>کالا</th>
    -      <th>تعداد</th>
    -      <th>فی توضیح</th>
    -      <th>مالیات</th>
    -      <th>تخفیف</th>
    -    </tr>
    -  </thead>
    -  <tbody>
    -    {% for item in rows %}
    -      <tr>
    -        <td>{{ loop.index }}</td>
    -        <td>{{ item.commodity.name ?? '-' }}</td>
    -        <td>{{ item.commodityCount }}</td>
    -        <td>{{ item.des | escape }}</td>
    -        <td>{{ item.tax | number_format(0, '.', ',') }}</td>
    -        <td>
    -          {% if item.showPercentDiscount %}
    -            {{ item.discountPercent }}%
    -          {% else %}
    -            {{ item.discount | number_format(0, '.', ',') }}
    -          {% endif %}
    -        </td>
    -      </tr>
    -    {% endfor %}
    -  </tbody>
    -</table>
    -
    + <table width="100%" cellspacing="0" cellpadding="6" + border="1"> + <thead> + <tr> + <th>#</th> + <th>کالا</th> + <th>تعداد</th> + <th>فی توضیح</th> + <th>مالیات</th> + <th>تخفیف</th> + </tr> + </thead> + <tbody> + {% for item in rows %} + <tr> + <td>{{ loop.index }}</td> + <td>{{ item.commodity.name ?? '-' }}</td> + <td>{{ item.commodityCount }}</td> + <td>{{ item.des | escape }}</td> + <td>{{ item.tax | number_format(0, '.', ',') }}</td> + <td> + {% if item.showPercentDiscount %} + {{ item.discountPercent }}% + {% else %} + {{ item.discount | number_format(0, '.', ',') }} + {% endif %} + </td> + </tr> + {% endfor %} + </tbody> + </table> +
    @@ -193,36 +237,41 @@
    <div class="invoice-template">
    -  <h2 style="text-align:center">{{ business.name }}</h2>
    -  <div>شماره فاکتور: {{ doc.code }} | تاریخ: {{ doc.date }}</div>
    -  {% if person %}<div>مشتری: {{ person.name }} | موبایل: {{ person.mobile }}</div>{% endif %}
    +                <h2 style="text-align:center">{{ business.name }}</h2>
    +                <div>شماره فاکتور: {{ doc.code }} | تاریخ: {{ doc.date }}</div>
    +                {% if person %}<div>مشتری: {{ person.name }} | موبایل: {{ person.mobile }}</div>{% endif %}
     
    -  <table width="100%" cellspacing="0" cellpadding="6" border="1" style="margin-top:10px">
    -    <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>مالیات</th><th>تخفیف</th></tr></thead>
    -    <tbody>
    -      {% for r in rows %}
    -        <tr>
    -          <td>{{ loop.index }}</td>
    -          <td>{{ r.commodity.name ?? '-' }}</td>
    -          <td>{{ r.commodityCount }}</td>
    -          <td>{{ r.des }}</td>
    -          <td>{{ r.tax | number_format(0, '.', ',') }}</td>
    -          <td>{% if r.showPercentDiscount %}{{ r.discountPercent }}%{% else %}{{ r.discount | number_format(0, '.', ',') }}{% endif %}</td>
    -        </tr>
    -      {% endfor %}
    -    </tbody>
    -  </table>
    +                <table width="100%" cellspacing="0" cellpadding="6"
    +                border="1" style="margin-top:10px">
    +                <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>مالیات</th><th>تخفیف</th></tr></thead>
    +                <tbody>
    +                {% for r in rows %}
    +                <tr>
    +                <td>{{ loop.index }}</td>
    +                <td>{{ r.commodity.name ?? '-' }}</td>
    +                <td>{{ r.commodityCount }}</td>
    +                <td>{{ r.des }}</td>
    +                <td>{{ r.tax | number_format(0, '.', ',') }}</td>
    +                <td>{% if r.showPercentDiscount %}{{ r.discountPercent }}%{% else %}{{ r.discount |
    +                number_format(0, '.', ',') }}{% endif %}</td>
    +                </tr>
    +                {% endfor %}
    +                </tbody>
    +                </table>
     
    -  <div style="margin-top:10px;text-align:right">
    -    {% if discount %}<div>جمع تخفیف: {{ discount | number_format(0, '.', ',') }}</div>{% endif %}
    -    {% if transfer %}<div>هزینه ارسال/انتقال: {{ transfer | number_format(0, '.', ',') }}</div>{% endif %}
    -  </div>
    +                <div style="margin-top:10px;text-align:right">
    +                {% if discount %}<div>جمع تخفیف: {{ discount | number_format(0, '.', ',') }}</div>{% endif
    +                %}
    +                {% if transfer %}<div>هزینه ارسال/انتقال: {{ transfer | number_format(0, '.', ',')
    +                }}</div>{% endif %}
    +                </div>
     
    -  {% if note %}
    -    <div style="margin-top:12px;border-top:1px dashed #ccc;padding-top:8px">{{ note | escape }}</div>
    -  {% endif %}
    -</div>
    -
    + {% if note %} + <div style="margin-top:12px;border-top:1px dashed #ccc;padding-top:8px">{{ note | escape + }}</div> + {% endif %} + </div> +
    @@ -235,9 +284,10 @@

    در خرید/برگشت از خرید، مقادیر ردیف‌ها شامل bs و bd نیز هستند.

    {% for r in rows %}
    -  <div>{{ loop.index }}. {{ r.commodity.name ?? '-' }} | تعداد: {{ r.commodityCount }} | شرح: {{ r.des }} | بدهکار: {{ r.bd }} | بستانکار: {{ r.bs }}</div>
    -{% endfor %}
    -
    + <div>{{ loop.index }}. {{ r.commodity.name ?? '-' }} | تعداد: {{ r.commodityCount }} | شرح: {{ + r.des }} | بدهکار: {{ r.bd }} | بستانکار: {{ r.bs }}</div> + {% endfor %} +
    @@ -250,8 +300,12 @@
    • از اجرای جاوااسکریپت، توابع سیستم یا درخواست‌های خارجی در قالب پرهیز شده و امکان‌پذیر نیست.
    • -
    • برای جلوگیری از خطاهای سازگاری، از commodityCount استفاده کنید (هرچند برای سازگاری commdityCount نیز پشتیبانی می‌شود).
    • -
    • به دلیل Sandbox، دسترسی به متد/پراپرتی‌های آبجکت‌ها محدود است؛ از داده‌های آرایه‌ای فراهم‌شده استفاده کنید.
    • +
    • برای جلوگیری از خطاهای سازگاری، از commodityCount استفاده کنید (هرچند برای سازگاری + commdityCount نیز پشتیبانی می‌شود). +
    • +
    • به دلیل Sandbox، دسترسی به متد/پراپرتی‌های آبجکت‌ها محدود است؛ از داده‌های آرایه‌ای فراهم‌شده + استفاده + کنید.
    @@ -264,9 +318,13 @@
      -
    • خطای «Key X does not exist»: نام کلید را با فهرست بالا تطبیق دهید؛ برای تعداد از commodityCount استفاده کنید.
    • -
    • عدم نمایش اطلاعات مشتری: ابتدا بررسی کنید person تهی نباشد: {% if person %} ... {% endif %}
    • -
    • به‌هم‌ریختگی چاپ: از CSS ساده و سازگار با چاپ استفاده کنید؛ عرض جدول‌ها و اندازه فونت‌ها را کنترل کنید.
    • +
    • خطای «Key X does not exist»: نام کلید را با فهرست بالا تطبیق دهید؛ برای تعداد از + commodityCount استفاده کنید. +
    • +
    • عدم نمایش اطلاعات مشتری: ابتدا بررسی کنید person تهی نباشد: {% if person %} ... {% + endif %}
    • +
    • به‌هم‌ریختگی چاپ: از CSS ساده و سازگار با چاپ استفاده کنید؛ عرض جدول‌ها و اندازه فونت‌ها را کنترل + کنید.
    @@ -282,90 +340,96 @@

    فروش (نمونه ساده)

    <div class="invoice-template">
    -  <h3 style="text-align:center">{{ business.name }}</h3>
    -  <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div>
    -  {% if person %}<div>مشتری: {{ person.name }}</div>{% endif %}
    -  <table width="100%" border="1" cellspacing="0" cellpadding="6" style="margin-top:8px">
    -    <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>مالیات</th><th>تخفیف</th></tr></thead>
    -    <tbody>
    -      {% for r in rows %}
    -        <tr>
    -          <td>{{ loop.index }}</td>
    -          <td>{{ r.commodity.name ?? '-' }}</td>
    -          <td>{{ r.commodityCount }}</td>
    -          <td>{{ r.des }}</td>
    -          <td>{{ r.tax | number_format(0, '.', ',') }}</td>
    -          <td>{% if r.showPercentDiscount %}{{ r.discountPercent }}%{% else %}{{ r.discount | number_format(0, '.', ',') }}{% endif %}</td>
    -        </tr>
    -      {% endfor %}
    -    </tbody>
    -  </table>
    -  {% if note %}<div style="margin-top:8px">{{ note | escape }}</div>{% endif %}
    -</div>
    + <h3 style="text-align:center">{{ business.name }}</h3> + <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div> + {% if person %}<div>مشتری: {{ person.name }}</div>{% endif %} + <table width="100%" border="1" cellspacing="0" + cellpadding="6" style="margin-top:8px"> + <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>مالیات</th><th>تخفیف</th></tr></thead> + <tbody> + {% for r in rows %} + <tr> + <td>{{ loop.index }}</td> + <td>{{ r.commodity.name ?? '-' }}</td> + <td>{{ r.commodityCount }}</td> + <td>{{ r.des }}</td> + <td>{{ r.tax | number_format(0, '.', ',') }}</td> + <td>{% if r.showPercentDiscount %}{{ r.discountPercent }}%{% else %}{{ r.discount | + number_format(0, '.', ',') }}{% endif %}</td> + </tr> + {% endfor %} + </tbody> + </table> + {% if note %}<div style="margin-top:8px">{{ note | escape }}</div>{% endif %} + </div>

    خرید (نمونه ساده)

    <div class="invoice-template">
    -  <h3 style="text-align:center">{{ business.name }}</h3>
    -  <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div>
    -  {% if person %}<div>فروشنده: {{ person.name }}</div>{% endif %}
    -  <table width="100%" border="1" cellspacing="0" cellpadding="6" style="margin-top:8px">
    -    <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>بدهکار</th><th>بستانکار</th></tr></thead>
    -    <tbody>
    -      {% for r in rows %}
    -        <tr>
    -          <td>{{ loop.index }}</td>
    -          <td>{{ r.commodity.name ?? '-' }}</td>
    -          <td>{{ r.commodityCount }}</td>
    -          <td>{{ r.des }}</td>
    -          <td>{{ r.bd | number_format(0, '.', ',') }}</td>
    -          <td>{{ r.bs | number_format(0, '.', ',') }}</td>
    -        </tr>
    -      {% endfor %}
    -    </tbody>
    -  </table>
    -</div>
    + <h3 style="text-align:center">{{ business.name }}</h3> + <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div> + {% if person %}<div>فروشنده: {{ person.name }}</div>{% endif %} + <table width="100%" border="1" cellspacing="0" + cellpadding="6" style="margin-top:8px"> + <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>بدهکار</th><th>بستانکار</th></tr></thead> + <tbody> + {% for r in rows %} + <tr> + <td>{{ loop.index }}</td> + <td>{{ r.commodity.name ?? '-' }}</td> + <td>{{ r.commodityCount }}</td> + <td>{{ r.des }}</td> + <td>{{ r.bd | number_format(0, '.', ',') }}</td> + <td>{{ r.bs | number_format(0, '.', ',') }}</td> + </tr> + {% endfor %} + </tbody> + </table> + </div>

    برگشت از خرید (نمونه ساده)

    <div class="invoice-template">
    -  <h3 style="text-align:center">{{ business.name }}</h3>
    -  <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div>
    -  <table width="100%" border="1" cellspacing="0" cellpadding="6" style="margin-top:8px">
    -    <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>بدهکار</th><th>بستانکار</th></tr></thead>
    -    <tbody>
    -      {% for r in rows %}
    -        <tr>
    -          <td>{{ loop.index }}</td>
    -          <td>{{ r.commodity.name ?? '-' }}</td>
    -          <td>{{ r.commodityCount }}</td>
    -          <td>{{ r.des }}</td>
    -          <td>{{ r.bd | number_format(0, '.', ',') }}</td>
    -          <td>{{ r.bs | number_format(0, '.', ',') }}</td>
    -        </tr>
    -      {% endfor %}
    -    </tbody>
    -  </table>
    -</div>
    + <h3 style="text-align:center">{{ business.name }}</h3> + <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div> + <table width="100%" border="1" cellspacing="0" + cellpadding="6" style="margin-top:8px"> + <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>بدهکار</th><th>بستانکار</th></tr></thead> + <tbody> + {% for r in rows %} + <tr> + <td>{{ loop.index }}</td> + <td>{{ r.commodity.name ?? '-' }}</td> + <td>{{ r.commodityCount }}</td> + <td>{{ r.des }}</td> + <td>{{ r.bd | number_format(0, '.', ',') }}</td> + <td>{{ r.bs | number_format(0, '.', ',') }}</td> + </tr> + {% endfor %} + </tbody> + </table> + </div>

    برگشت از فروش (نمونه ساده)

    <div class="invoice-template">
    -  <h3 style="text-align:center">{{ business.name }}</h3>
    -  <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div>
    -  <table width="100%" border="1" cellspacing="0" cellpadding="6" style="margin-top:8px">
    -    <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>مالیات</th><th>تخفیف</th></tr></thead>
    -    <tbody>
    -      {% for r in rows %}
    -        <tr>
    -          <td>{{ loop.index }}</td>
    -          <td>{{ r.commodity.name ?? '-' }}</td>
    -          <td>{{ r.commodityCount }}</td>
    -          <td>{{ r.des }}</td>
    -          <td>{{ r.tax | number_format(0, '.', ',') }}</td>
    -          <td>{% if r.showPercentDiscount %}{{ r.discountPercent }}%{% else %}{{ r.discount | number_format(0, '.', ',') }}{% endif %}</td>
    -        </tr>
    -      {% endfor %}
    -    </tbody>
    -  </table>
    -</div>
    + <h3 style="text-align:center">{{ business.name }}</h3> + <div>کد: {{ doc.code }} | تاریخ: {{ doc.date }}</div> + <table width="100%" border="1" cellspacing="0" + cellpadding="6" style="margin-top:8px"> + <thead><tr><th>#</th><th>کالا</th><th>تعداد</th><th>شرح</th><th>مالیات</th><th>تخفیف</th></tr></thead> + <tbody> + {% for r in rows %} + <tr> + <td>{{ loop.index }}</td> + <td>{{ r.commodity.name ?? '-' }}</td> + <td>{{ r.commodityCount }}</td> + <td>{{ r.des }}</td> + <td>{{ r.tax | number_format(0, '.', ',') }}</td> + <td>{% if r.showPercentDiscount %}{{ r.discountPercent }}%{% else %}{{ r.discount | + number_format(0, '.', ',') }}{% endif %}</td> + </tr> + {% endfor %} + </tbody> + </table> + </div> @@ -448,16 +512,45 @@ + + + +
    + + {{ snackbar.message }} +
    + + +