【问题标题】:Netsuite scheduled script creates and applies customerpayment to invoice, but after save different invoice is appliedNetsuite 计划脚本创建客户付款并将其应用于发票,但在保存后应用不同的发票
【发布时间】:2022-08-03 00:23:19
【问题描述】:

我的预定脚本在循环中创建customerpayment 对象并将其应用于选定的发票。

预期:客户付款记录保存后,客户付款应应用准确的发票。

问题:客户付款记录保存后,我打开客户付款并应用不同的发票。

创建客户付款的代码:

if (paydata != null) {
    paymentfee = paydata.paymentFee;
    for (var y = 0; y < paydata.payments.length; y++) {
            var paymentrec = null;
            log.debug(\'entity\', paydata.payments[y].customerRef);
            paymentrec = record.create({
                    type: \'customerpayment\',
                    defaultValues: {
                            \'entity\': paydata.payments[y].customerRef
                    }
            });
            paymentrec.setValue({
                    fieldId: \'subsidiary\',
                    value: paydata.subsidiaryId
            });


            // when we create the payment with account - it\'s automatically deposited
            paymentrec.setValue({
                fieldId: \'account\',
                value: paydata.account
            });

            // adding support for custom form functionality
            if (paydata.payments[y].customform) {
                paymentrec.setValue({
                    fieldId: \'customform\',
                    value: paydata.payments[y].customform
                });
                log.debug(\'Custom form applied\', paydata.payments[y].customform);
            }

            paymentrec.setValue({
                    fieldId: \'memo\',
                    value: paydata.payments[y].note
            });
            paymentrec.setValue({
                    fieldId: \'payment\',
                    value: paydata.payments[y].paymentAmount
            });

            // // debugging the auto-application on the invoices
            // paymentrec.setValue({
            //     fieldId: \'autoapply\',
            //     value: false
            // })

            paymentrec.setValue({
                    fieldId: \'custbody_peakflo_payref\',
                    value: paydata.peakfloPaymentRef
            });
            paymentrec.setValue({
                    fieldId: \'custbody_peakflo_payacct\',
                    value: paydata.account
            });
            paymentrec.setValue({
                    fieldId: \'custbody_peakflo_payfee\',
                    value: paydata.paymentFee
            });
            paymentrec.setText({
                    fieldId: \'currency\',
                    value: paydata.currency
            });

            for (var z = 0; z < paydata.payments[y].invoiceLines.length; z++) {
                    if (paydata.payments[y].invoiceLines[z].NetSuiteInvoiceInternalId != \'\' && paydata.payments[y].invoiceLines[z].NetSuiteInvoiceInternalId != null) {
                            log.debug(\'count\', paymentrec.getLineCount({
                                    sublistId: \'apply\'
                            }));

                            for (var al = 0; al < paymentrec.getLineCount({sublistId: \'apply\'}); al++) {
                                    log.debug(\'comparison data\', JSON.stringify(
                                        {
                                            recordInternalId: paymentrec.getSublistValue({
                                                sublistId: \'apply\',
                                                fieldId: \'internalid\',
                                                line: al
                                            }),
                                            payloadInvoiceId: paydata.payments[y].invoiceLines[z].NetSuiteInvoiceInternalId,
                                            isEqual: paymentrec.getSublistValue({
                                                sublistId: \'apply\',
                                                fieldId: \'internalid\',
                                                line: al
                                            }) == paydata.payments[y].invoiceLines[z].NetSuiteInvoiceInternalId
                                        }));

                                if (paymentrec.getSublistValue({
                                            sublistId: \'apply\',
                                            fieldId: \'internalid\',
                                            line: al
                                    }) == paydata.payments[y].invoiceLines[z].NetSuiteInvoiceInternalId) {
                                            paymentrec.setSublistValue({
                                                    sublistId: \'apply\',
                                                    fieldId: \'apply\',
                                                    line: al,
                                                    value: true
                                            });
                                            paymentrec.setSublistValue({
                                                    sublistId: \'apply\',
                                                    fieldId: \'amount\',
                                                    line: al,
                                                    value: paydata.payments[y].invoiceLines[z].PaymentAmount
                                            });
                                            var inv_qm = record.create({type: \'customrecord_peakflo_history_qm\'});
                                            inv_qm.setValue({fieldId: \'custrecord_pf_hqm_dg_pri\', value: \'2\'});
                                            inv_qm.setValue({
                                                    fieldId: \'custrecord_pf_hqm_recsub\',
                                                    value: paymentrec.getValue({fieldId: \'subsidiary\'})
                                            });
                                            inv_qm.setValue({
                                                    fieldId: \'custrecord_pf_hqm_rectype\',
                                                    value: \'transaction\'
                                            });
                                            inv_qm.setValue({
                                                    fieldId: \'custrecord_pf_hqm_recid\',
                                                    value: paydata.payments[y].invoiceLines[z].NetSuiteInvoiceInternalId
                                            });
                                            var inv_qmid = inv_qm.save();
                                            log.debug(\'payment amt\', paydata.payments[y].invoiceLines[z].PaymentAmount);
                                            log.debug(\'HQM created id\', inv_qmid);

                                    }
                                    log.debug(\'Selected\', paymentrec.getSublistValue({
                                        sublistId: \'apply\',
                                        fieldId: \'apply\',
                                        line: al
                                    }));
                            }
                    }
            }
            var paymentrecid = paymentrec.save({
                    ignoreMandatoryFields: true,
                    enableSourcing: true
            });
            record.submitFields({
                    type:\'customrecord_peakflo_qm\',
                    id:pfp_s_res[x].id,
                    values:{
                            custrecord_pf_processed:true
                    }
            });
            log.debug(\'payment id\', paymentrecid);
            if (paymentrecid) {
                    paymentref.push(paymentrecid);
            }
    }
}

根据日志,customerpayment 应应用发票 9236675。

但是,当我打开 customerpayment 时,它显示已应用发票 9236677。

我可以在客户端实例中重现它,但它似乎在我自己的实例中正常工作。这背后的原因是什么?

    标签: netsuite suitescript2.0


    【解决方案1】:

    也许事情发生了变化,但在过去,当我尝试手动管理付款时,发票内部 ID 转到子列表字段 doc,而不是 internalid。是的,这是奇怪的不一致。

    如果您尝试支付单张发票,那么您应该从发票而不是客户中初始化客户付款。这意味着您的付款将自动应用于正确的发票:

    var paymentrec = record.transform({
        fromType:'invoice',
        fromId: paydata.payments[y].invoiceLines[z].NetSuiteInvoiceInternalId,
        toType:'customerpayment',
    });
    

    为了查看您的代码可能出错的地方,我进行了快速重写以使用doc 并出于其他几个注释原因。试试下面的代码:

    if (paydata) {
        paymentfee = paydata.paymentFee;
        paydata.payments.forEach(function(pd, y) {
            log.debug('entity', pd.customerRef);
            var paymentrec = record.create({
                type: 'customerpayment',
                defaultValues: {
                    'entity': pd.customerRef
                }
            });
            paymentrec.setValue({
                fieldId: 'subsidiary',
                value: paydata.subsidiaryId
            });
    
    
            // when we create the payment with account - it's automatically deposited
            paymentrec.setValue({
                fieldId: 'account',
                value: paydata.account
            });
    
            // adding support for custom form functionality
            if (pd.customform) {
                paymentrec.setValue({
                    fieldId: 'customform',
                    value: pd.customform
                });
                log.debug('Custom form applied', pd.customform);
            }
    
            paymentrec.setValue({
                fieldId: 'memo',
                value: pd.note
            });
            paymentrec.setValue({
                fieldId: 'payment',
                value: pd.paymentAmount
            });
    
            // // debugging the auto-application on the invoices
            // paymentrec.setValue({
            //     fieldId: 'autoapply',
            //     value: false
            // })
    
            paymentrec.setValue({
                fieldId: 'custbody_peakflo_payref',
                value: paydata.peakfloPaymentRef
            });
            paymentrec.setValue({
                fieldId: 'custbody_peakflo_payacct',
                value: paydata.account
            });
            paymentrec.setValue({
                fieldId: 'custbody_peakflo_payfee',
                value: paydata.paymentFee
            });
            paymentrec.setText({
                fieldId: 'currency',
                value: paydata.currency
            });
    
            var anyApplied = false;
    
            iter(paymentrec, 'apply', function(al, getV, setV) { // make the payment apply lines the outer loop so can also turn off application if a line is not matched
                var didFind = false;
    
                pd.invoiceLines.forEach(function(invLine, z) {
                    if (!invLine.NetSuiteInvoiceInternalId || getV('doc') != invLine.NetSuiteInvoiceInternalId) return;
    
    
                    didFind = true;
                    anyApplied = true;
    
                    setV('apply', true);
                    setV('amount', invLine.PaymentAmount);
    
                    var inv_qm = record.create({
                        type: 'customrecord_peakflo_history_qm'
                    });
                    inv_qm.setValue({
                        fieldId: 'custrecord_pf_hqm_dg_pri',
                        value: '2'
                    });
                    inv_qm.setValue({
                        fieldId: 'custrecord_pf_hqm_recsub',
                        value: paymentrec.getValue({
                            fieldId: 'subsidiary'
                        })
                    });
                    inv_qm.setValue({
                        fieldId: 'custrecord_pf_hqm_rectype',
                        value: 'transaction'
                    });
                    inv_qm.setValue({
                        fieldId: 'custrecord_pf_hqm_recid',
                        value: invLine.NetSuiteInvoiceInternalId
                    });
                    var inv_qmid = inv_qm.save();
                    log.debug('payment amt', invLine.PaymentAmount);
                    log.debug('HQM created id', inv_qmid);
    
    
                    log.debug('Selected', paymentrec.getSublistValue({
                        sublistId: 'apply',
                        fieldId: 'apply',
                        line: al
                    }));
                });
                if (!didFind) setV('apply', false);
    
            });
    
            if (anyApplied) {
    
                var paymentrecid = paymentrec.save({
                    ignoreMandatoryFields: true,
                    enableSourcing: false //the default is false. true can cause interesting behaviour. You have already initialized it to the customer defaults so further sourcing shouldn't be needed
                });
                record.submitFields({
                    type: 'customrecord_peakflo_qm',
                    id: pfp_s_res[x].id,
                    values: {
                        custrecord_pf_processed: true
                    }
                });
                log.debug('payment id', paymentrecid);
                if (paymentrecid) {
                    paymentref.push(paymentrecid);
                }
            } else {
                log.error({
                    title: 'no open invoice found',
                    details: JSON.stringify(pd)
                });
            }
        });
    
        function iter(rec, listName, cb) {
            var lim = rec.getLineCount({
                sublistId: listName
            });
            var i = 0;
            var getV = function(fld) {
                return rec.getSublistValue({
                    sublistId: listName,
                    fieldId: fld,
                    line: i
                });
            };
            var setV = function(fld, val) {
                return rec.setSublistValue({
                    sublistId: listName,
                    fieldId: fld,
                    line: i,
                    value: val
                });
            };
            for (; i < lim; i++) {
                cb(i, getV, setV);
            }
        }
    }
    

    【讨论】:

    • >当我尝试手动管理付款时,发票内部 ID 转到子列表字段文档,而不是内部 ID。是的,这是奇怪的不一致。我正在comparison data 日志中记录 internalid 字段的值。您的意思是读取来自字段并且写入应该在另一个字段中?此外,在我的用例中,一次付款中可以有多张发票。这种情况也有可靠的解决方案吗?
    • 通过重写代码查看更新
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2019-03-13
    • 2016-03-20
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    相关资源
    最近更新 更多