{"id":3128,"date":"2017-08-21T14:49:51","date_gmt":"2017-08-21T14:49:51","guid":{"rendered":"https:\/\/answers.gurussolutions.com\/answers\/comment-optimiser-le-traitement-des-paiements-clients-dans-netsuite\/"},"modified":"2026-07-28T18:25:30","modified_gmt":"2026-07-28T18:25:30","slug":"comment-optimiser-le-traitement-des-paiements-clients-dans-netsuite","status":"publish","type":"qa_entry","link":"https:\/\/answers.gurussolutions.com\/fr\/answers\/comment-optimiser-le-traitement-des-paiements-clients-dans-netsuite\/","title":{"rendered":"Comment optimiser le traitement des paiements clients dans NetSuite"},"content":{"rendered":"","protected":false},"template":"","meta":{"_kad_blocks_custom_css":"","_kad_blocks_head_custom_js":"","_kad_blocks_body_custom_js":"","_kad_blocks_footer_custom_js":"","_kadence_starter_templates_imported_post":false,"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","ga_subtitle":"Simplifiez le processus de comptabilisation des paiements et des avoirs clients en permettant la saisie rapide du num\u00e9ro de transaction directement dans l'enregistrement de paiement.","ga_short_answer":"Pour optimiser la demande de paiement client, cr\u00e9ez trois champs de texte libre personnalis\u00e9s dans la fiche \u00ab Paiement client \u00bb. Personnalisez le formulaire de paiement afin de placer ces champs sous l\u2019onglet \u00ab Appliquer \u00bb. D\u00e9ployez un script SuiteScript 2.x c\u00f4t\u00e9 client avec un point d\u2019entr\u00e9e \u00ab fieldChanged \u00bb pour rechercher et appliquer automatiquement les transactions en fonction des chiffres saisis, ce qui r\u00e9duit consid\u00e9rablement le travail manuel.","ga_scenario":"Les utilisateurs sont souvent confront\u00e9s \u00e0 un processus manuel fastidieux lorsqu\u2019ils enregistrent les paiements ou les avoirs des clients dans NetSuite, ce qui les oblige fr\u00e9quemment \u00e0 parcourir plusieurs pages pour faire correspondre les transactions. Ce manque d\u2019efficacit\u00e9 entra\u00eene un allongement des d\u00e9lais de traitement et un risque accru d\u2019erreurs.","ga_solution":"La solution consiste \u00e0 cr\u00e9er des champs personnalis\u00e9s, \u00e0 personnaliser le formulaire de paiement client et \u00e0 mettre en \u0153uvre un script SuiteScript 2.x c\u00f4t\u00e9 client afin d\u2019automatiser l\u2019application des paiements et des avoirs.1.  **Cr\u00e9ez trois nouveaux champs personnalis\u00e9s dans l\u2019enregistrement \u00ab Paiement client \u00bb :**    *   Num\u00e9ro de transaction (alerte) avec l\u2019identifiant interne `custbody_tran_number_alert` (texte libre)    *   Num\u00e9ro de transaction (avoir) avec l\u2019identifiant interne `custbody_tran_number_credit` (texte libre)    *   Num\u00e9ro de transaction (Appliquer) avec l\u2019identifiant interne `custbody_tran_number_apply` (Texte libre)    Assurez-vous que l\u2019option \u00ab Stocker la valeur \u00bb de ces champs est d\u00e9finie sur GA_KEEP_0004, car leurs valeurs ne sont utilis\u00e9es que pour l\u2019interaction avec l\u2019interface utilisateur.2.  **Personnalisez les formulaires de paiement client :**    D\u00e9placez les champs personnalis\u00e9s nouvellement cr\u00e9\u00e9s afin qu\u2019ils soient visibles dans le sous-onglet \u00ab Appliquer \u00bb des formulaires de paiement client concern\u00e9s. 3.  **Cr\u00e9ez et d\u00e9ployez un script SuiteScript 2.x c\u00f4t\u00e9 client sur l\u2019enregistrement de paiement client :**    Le script se d\u00e9clenchera lors de modifications des champs afin de rechercher et d\u2019appliquer automatiquement les transactions en fonction des num\u00e9ros saisis dans les champs personnalis\u00e9s.\n\n```\njavascript\/** * @NApiVersion 2.x * @NScriptType ClientScript * @NModuleScope SameAccount *\/define(['N\/record'], function(record) {    \/**     * Function to be executed when field is changed.     *     * @param {object} scriptContext     * @param {record.Record} scriptContext.currentRecord - Current form record     * @param {string} scriptContext.sublistId - Sublist name     * @param {string} scriptContext.fieldId - Field name     * @param {number} scriptContext.lineNum - Line number in sublist     * @param {number} scriptContext.columnNum - Column number in matrix sublist     *     * @since 2015.2     *\/    function fieldChanged(scriptContext) {        var currentRecord = scriptContext.currentRecord;        var fieldId = scriptContext.fieldId;        if (fieldId === 'custbody_tran_number_apply') {            findAndApply(currentRecord, fieldId, 'apply', 'custbody_tran_number_alert');            currentRecord.setValue({fieldId: fieldId, value: '', ignoreFieldChange: true});        }        if (fieldId === 'custbody_tran_number_credit') {            findAndApply(currentRecord, fieldId, 'credit', 'custbody_tran_number_alert');            currentRecord.setValue({fieldId: fieldId, value: '', ignoreFieldChange: true});        }    }    \/**     * findAndApply : Gets the transaction number value given the     * transaction number field name,     * iterates through a given sublist (sublist name), finds the related     * transaction, applies and     * sets the amount to the amount due.     *     * When the transaction number cannot be found an alert message is displayed.     *     * This is done to optimize apply\/credit matching (no need to switch     * pages and go through the     * lengthy manual process; you can just input the numbers in the two     * text fields)     *     * @param {record.Record} currentRecord : The current record object.     * @param {string} transactionNumberFieldName : transaction number field id     * @param {string} sublistName : sublist id ('apply' or 'credit')     * @param {string} alertFieldName : alert field id     *     * @author frederic.jannelle@erpguru.com     *\/    function findAndApply(currentRecord, transactionNumberFieldName, sublistName, alertFieldName) {        var transactionNumberToApply = currentRecord.getValue({fieldId: transactionNumberFieldName});        if (transactionNumberToApply !== null && transactionNumberToApply !== '') {            var numberOfLines = currentRecord.getLineCount({sublistId: sublistName});            var lineFound = false;            for (var i = 0; i < numberOfLines && !lineFound; i++) {                var refNumber = currentRecord.getSublistValue({sublistId: sublistName, fieldId: 'refnum', line: i});                if (refNumber === transactionNumberToApply) {                    var amountDue = currentRecord.getSublistValue({sublistId: sublistName, fieldId: 'due', line: i});                    \/\/ Need to select line and commit, otherwise the application                    \/\/ is not triggered in the UI (ie: payment amount,                    \/\/ applied, unapplied are not updated)                    currentRecord.selectLine({sublistId: sublistName, line: i});                    currentRecord.setCurrentSublistValue({sublistId: sublistName, fieldId: 'apply', value: true});                    currentRecord.setCurrentSublistValue({sublistId: sublistName, fieldId: 'amount', value: amountDue});                    currentRecord.commitLine({sublistId: sublistName});                    currentRecord.setValue({fieldId: alertFieldName, value: '', ignoreFieldChange: true});                    lineFound = true;                }            }            if (!lineFound) {                currentRecord.setValue({fieldId: alertFieldName, value: transactionNumberToApply + ' not found.', ignoreFieldChange: true});            }        }    }    return {        fieldChanged: fieldChanged    };});\n```\n\nLe script d\u00e9finit un point d\u2019entr\u00e9e `fieldChanged` qui surveille les champs de num\u00e9ro de transaction personnalis\u00e9s. Lorsqu\u2019un num\u00e9ro est saisi, la fonction `findAndApply` est appel\u00e9e. Cette fonction parcourt la sous-liste concern\u00e9e (soit \u00ab apply \u00bb pour les paiements, soit \u00ab credit \u00bb pour les avoirs), recherche un num\u00e9ro de r\u00e9f\u00e9rence de transaction correspondant, puis s\u00e9lectionne automatiquement la ligne, coche la case \u00ab Apply \u00bb et remplit le champ \u00ab Amount \u00bb avec le \u00ab Montant d\u00fb \u00bb. Si la transaction n\u2019est pas trouv\u00e9e, un message d\u2019alerte s\u2019affiche dans le champ `custbody_tran_number_alert`.","ga_source_author":"","ga_source_author_email":"","ga_date_original":"2017-08-21T16:49:51+02:00","ga_date_verified":"2026-07-05","ga_source_subject":"Customer Payment Application Optimization","ga_ans_id":"ANS-1389","ga_publish_decision":"publish_with_edits","ga_staleness_risk":"high","ga_review_priority":"spot_check","ga_tier2_verdict":"partially_outdated","ga_tier2_concerns":"The client-side script uses SuiteScript 1.0 `nlapi` functions (e.g., `nlapiSetFieldValue`, `nlapiGetFieldValue`, `nlapiGetLineItemCount`, `nlapiSelectLineItem`, `nlapiSetCurrentLineItemValue`), which are deprecated and have been replaced by SuiteScript 2.x `N\/` modules and methods.; The `fieldChanged` client script entry point signature has changed from `function fieldChanged(type, name, linenum)` in SuiteScript 1.0 to `function fieldChanged(scriptContext)` in SuiteScript 2.x, where `scriptContext` is an object containing relevant details like `currentRecord`, `fieldId`, `sublistId`, and `lineNum`.","ga_final_category":"Accounting & Financial Configuration","footnotes":""},"ga_category":[24,98,98],"ga_audience":[89],"ga_difficulty":[94],"class_list":["post-3128","qa_entry","type-qa_entry","status-publish","hentry","ga_category-accounting-financial-configuration","ga_category-configuration-comptable-et-financiere","ga_audience-administrateur-netsuite","ga_difficulty-avance"],"taxonomy_info":{"ga_category":[{"value":24,"label":"Accounting & Financial Configuration"},{"value":98,"label":"Configuration comptable et financi\u00e8re"},{"value":98,"label":"Configuration comptable et financi\u00e8re"}],"ga_audience":[{"value":89,"label":"Administrateur NetSuite"}],"ga_difficulty":[{"value":94,"label":"Avanc\u00e9"}]},"featured_image_src_large":[],"author_info":[],"comment_info":"","_links":{"self":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/3128","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry"}],"about":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/types\/qa_entry"}],"version-history":[{"count":1,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/3128\/revisions"}],"predecessor-version":[{"id":5048,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/qa_entry\/3128\/revisions\/5048"}],"wp:attachment":[{"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/media?parent=3128"}],"wp:term":[{"taxonomy":"ga_category","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_category?post=3128"},{"taxonomy":"ga_audience","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_audience?post=3128"},{"taxonomy":"ga_difficulty","embeddable":true,"href":"https:\/\/answers.gurussolutions.com\/fr\/wp-json\/wp\/v2\/ga_difficulty?post=3128"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}