La gestion des adresses et des contacts est une fonctionnalité centrale de Dokos qui permet de maintenir des informations précises et à jour pour vos clients, fournisseurs et autres partenaires commerciaux. Cette documentation couvre les aspects techniques et les bonnes pratiques pour configurer et utiliser efficacement ces fonctionnalités.
La refonte des cartes d'adresse et de contact introduit une interface moderne basée sur les composants Espresso, offrant une meilleure expérience utilisateur et des fonctionnalités améliorées.
Fichiers clés :
frappe/public/js/frappe/utils/address_and_contact.js : Logique principalefrappe/public/js/frappe/form/templates/address_list.html : Template des cartes d'adressefrappe/public/js/frappe/form/templates/contact_list.html : Template des cartes de contact// Exemple de méthode pour définir une adresse comme principale
set_as_primary_address: function(frm, address_name) {
frappe.call({
method: "frappe.contacts.address_and_contact.set_as_primary_address",
args: {
address_name: address_name,
party_type: frm.doctype,
party_name: frm.doc.name
},
callback: function() {
frm.reload_doc();
}
});
}
// Exemple de méthode pour définir un contact comme principal
set_as_primary_contact: function(frm, contact_name) {
frappe.call({
method: "frappe.contacts.address_and_contact.set_as_primary_contact",
args: {
contact_name: contact_name,
party_type: frm.doctype,
party_name: frm.doc.name
},
callback: function() {
frm.reload_doc();
}
});
}
# Méthode backend pour détacher une adresse
@frappe.whitelist()
def unlink_address(party_type, party_name, address_name):
frappe.db.set_value("Dynamic Link", {
"parenttype": "Address",
"parent": address_name,
"link_doctype": party_type,
"link_name": party_name
}, "is_primary", 0)
Vous pouvez personnaliser l'apparence des cartes via le fichier SCSS :
// frappe/public/scss/common/controls.scss
.address-card, .contact-card {
border: 1px solid var(--border-color);
border-radius: var(--border-radius-md);
padding: var(--padding-md);
margin-bottom: var(--margin-sm);
.primary-badge {
background-color: var(--primary-color);
color: white;
padding: 2px 8px;
border-radius: var(--border-radius-sm);
font-size: 0.8em;
}
}
Pour modifier le contenu des cartes, vous pouvez surcharger les templates HTML :
<!-- Exemple de surcharge pour les cartes d'adresse -->
<div class="address-card">
<div class="address-header">
<h4>{{ address.address_title }}</h4>
{% if address.is_primary %}
<span class="primary-badge">Principal</span>
{% endif %}
</div>
<div class="address-body">
{{ address.address_line1 }}<br>
{{ address.address_line2 }}<br>
{{ address.city }} {{ address.pincode }}<br>
{{ address.country }}
</div>
<div class="address-actions">
<button class="espresso-button espresso-button--secondary">
<i class="i-mdi-pencil"></i>
</button>
<espresso-dropdown>
<button slot="trigger" class="espresso-button espresso-button--secondary">
<i class="i-mdi-dots-vertical"></i>
</button>
<espresso-dropdown-item @click="set_as_primary">Définir comme principal</espresso-dropdown-item>
<espresso-dropdown-item @click="unlink">Détacher</espresso-dropdown-item>
</espresso-dropdown>
</div>
</div>
address_and_contact.js)@frappe.whitelist()frm.reload_doc() est appelé après les modificationsActivez la journalisation pour le débogage :
# frappe/contacts/address_and_contact.py
import frappe
import logging
logger = logging.getLogger(__name__)
@frappe.whitelist()
def set_as_primary_address(address_name, party_type, party_name):
logger.debug(f"Setting {address_name} as primary for {party_type}: {party_name}")
# ... logique existante ...
Pour la société "Maison Verte SARL" :
Pour le fournisseur "Bureau Moderne" :