Mettre des articles en option ou quantité 0

Bonjour,
Sur mes devis, je souhaite proposer des articles en options. c’est Ă  dires qu’ils apparaissent sans ĂȘtre pris dans le calcul du total.

Comment puis-je le faire ?

  • ajout d’une case option ?
  • mettre Ă  zĂ©ro la quantitĂ© ? j’ai un message de non autorisĂ©.

Je veux aussi mettre des prestations gratuites, mais la vĂ©rification des prix me l’interdit. Comment faire pour avoir cette vĂ©rification et mettre des articles Ă  0 ?

Merci pour ces infos

Bonjour @oryxr,

L’ajout d’une ligne avec un tarif Ă  0 passera forcĂ©ment par un tarif Ă  0 (ou un champ de texte libre, mais je ne pense que ce soit ce que vous cherchez).

Pour la vĂ©rification des prix, vous parlez bien de l’option “Valider le prix de vente de l’article par rapport Ă  son prix d’achat ou son taux de valorisation” dans les paramĂštres des ventes ?

Si cette option est activĂ©e, il n’y a que deux possibilitĂ©s pour que le systĂšme n’applique pas ce contrĂŽle sur une ligne:

  1. qu’il n’y ait pas de code article: C’est possible dans les factures, mais pas encore dans les devis, mĂȘme si c’est Ă  l’étude cĂŽtĂ© ERPNext: fix(selling): allow arbitrary quotation lines by casesolved-co-uk · Pull Request #33215 · frappe/erpnext · GitHub
  2. avoir la case “Est un article gratuit” cochĂ©; Mais cette case ne peut ĂȘtre cochĂ©e que si l’article a Ă©tĂ© ajoutĂ© automatiquement via une rĂšgle de prix

Donc malheureusement, Ă  ce stade je n’ai pas d’autre option Ă  vous proposer que de dĂ©sactiver la validation du prix si vous souhaitez mettre des articles gratuits. Mais ça devrait changer bientĂŽt si la proposition est acceptĂ©e cĂŽtĂ© ERPNext, sinon on pourra rĂ©flĂ©chir Ă  une solution cĂŽtĂ© Dokos.

Pour les options par contre, je ne vois pas trop d’autre solution que de passer par la description ou un tableau additionnel via une personnalisation si ça ne doit pas ĂȘtre pris en compte dans le total.
Peut-ĂȘtre qu’une solution intermĂ©diaire serait d’afficher des sections avec des sous-totaux en jouant sur le format d’impression.

Voici un exemple de champ HTML personnalisĂ© pour l’affichage des lignes du devis dans des sections en fonction d’un champ personnalisĂ© categorie. Ca peut vous servir de base:

<div data-fieldname="items" data-fieldtype="Table">
		<table class="table table-bordered table-condensed">
			<thead>
				<tr class="table-header">
				    <th class="text-left;" data-fieldname="items" data-fieldtype="Table" style="width: 40%;">
                        {{ _("LIBÉLLÉ") }}
                    </th>
                    <th class="text-left;" data-fieldname="items" data-fieldtype="Table" style="width: 10%;">
                        {{ _("QUANT") }}
                    </th>
                    <th class="text-left;" data-fieldname="items" data-fieldtype="Table" style="width: 20%;">
                        {{ _("PUHT") }}
                    </th>
                    <th class="text-left;" data-fieldname="items" data-fieldtype="Table" style="width: 20%;">
                        {{ _("TOTAL HT") }}
                    </th>
                    <th class="text-left;" data-fieldname="items" data-fieldtype="Table" style="width: 10%;">
                        {{ _("TVA") }}
                    </th>
				</tr>
			</thead>
			<tbody>
			    {% set ns = namespace(lastTitle=None, lastAmount=0.0, totalAmount=0.0) %}
				{% for d in doc.items %}
				{% if d.categorie and d.categorie != ns.lastTitle %}
				{% set ns.lastTitle = d.categorie %}
				<tr><td></td></tr>
				<tr>
					<td class="bold print-title" colspan="5">{{ d.categorie or "" }}</td>
				</tr>
				{% endif %}
				{% set ns.lastAmount = ns.lastAmount + frappe.utils.flt(d.amount) %}
				{% set ns.totalAmount = ns.totalAmount + frappe.utils.flt(d.amount) %}
				<tr>
					<td>
					    <div class="value">{{ frappe.format(d.item_name) }}</div>
					    <div class="text-muted small">{{ frappe.format(d.description) }}</div>
					</td>
					<td>
					    <div class="value">{{ frappe.format(d.qty) }}</div>
					</td>
					<td>
					    <div class="value">{{ frappe.format(d.rate, df={"fieldtype": "Currency"}, doc=doc, currency=doc.currency) }}</div>
					</td>
					<td>
					    <div class="value">{{ frappe.format(d.amount, df={"fieldtype": "Currency"}, doc=doc, currency=doc.currency) }}</div>
					</td>
					<td>
					    <div class="value">{{ frappe.format(d.tax_rate) }} %</div>
					</td>
				</tr>
				{% if (loop.index == loop.length) or (loop.index < loop.length and doc.items[loop.index].categorie and doc.items[loop.index].categorie != d.categorie) %}
				<tr>
				    <td colspan="3">
			            <div><strong>Sous-Total HT</strong></div>
				    </td>
				    <td>
			            <div class="value bold"><strong>{{ frappe.utils.fmt_money(ns.lastAmount, currency=doc.currency) }}</strong></div>
				    </td>
				</tr>
				{% set ns.lastAmount = 0.0 %}
				{% endif %}
				{% endfor %}
				{%- if doc.discount_amount -%}
				<tr><td></td></tr>
				<tr>
				    <td colspan="3">
			            <div><strong>Total HT</strong></div>
				    </td>
				    <td>
			            <div class="value"><strong>{{ frappe.utils.fmt_money(ns.totalAmount, currency=doc.currency) }}</strong></div>
				    </td>
				</tr>
				<tr>
					<td class="bold print-title" colspan="3">{{ doc.discount_description or "Remise Exceptionnelle" }}</td>
				    <td class="bold print-title" colspan="2">{{ doc.get_formatted("discount_amount", doc) }}</td>
				</tr>
				{% endif %}
			</tbody>
		</table>
	</div>

Bon week-end

Bonjour,

Je rebondis sur ton message Charles-Henri !

Pouvoir avoir des sous-totaux serait absolument magnifique et amĂšnerait des rĂ©ponses Ă  beaucoup d’autres questions que les options (en plus d’apporter une solution Ă©lĂ©gantes aux options aussi) ! Pour des devis Ă  tiroir, des diffĂ©rentiations par coĂ»t unique / rĂ©current (mise en place d’un outil + maintenance annuelle par exemple), etc.

Je note l’astuce des catĂ©gories proposĂ©es, je vais voir si ça peut nous suffire, mais une intĂ©gration par dĂ©faut serait vraiment super ! Par exemple via une ligne (comme un article) du type “nouvelle section”, oĂč l’intitulĂ© serait le titre de la section, avec des sous-totaux A, B(, etc.), puis le total habituel, du coup A+B(+
) !

Merci en tout cas pour tout ça :slight_smile:

1 Like