Question

Invoice page Auto fill

Hello Community,

 

When clicking on the 'New' button in the Invoice lookup a new Invoice with all the details from Installment plan detail is being created and auto filled . The logic behind this implementation is helpful for me to implement the same requirement for a custom object.



https://academy.creatio.com/documents/sales-enterprise/7-16/add-invoice-based-installment-plan-step#XREF_95168



Thanks in Advance.

 

Regards,

Sivaranjani

 

Like 0

Like

1 comments

Hi,



You need to study the following chain in the debugger:



1) SupplyPaymentPageV2 schema "Invoice" lookup confguration:



"Invoice": {

                    lookupListConfig: {

                        columns: ["PaymentStatus"],

                        filter: function() {

                            return this.getInvoiceLookupFilter();

                        },

                        updateViewModel: function() {

                            if (!this.Terrasoft.Features.getIsEnabled("UseLookupInvoiceForSupplyPaymentDetail")) {

                                return;

                            }

                            this.defaultModeActionButtonClickOld = this.defaultModeActionButtonClick.bind(this);

                            this.defaultModeActionButtonClick = function(tag) {

                                if (tag === "add") {

                                    Terrasoft.LookupUtilities.HideModalBox();

                                    var info = this.getLookupInfo();

                                    info._publishGenerateInvoice();

                                } else {

                                    this.defaultModeActionButtonClickOld(tag);

                                }

                            };

                            this.initCanEdit = function() {

                                this.set("canEdit", false);

                            };

                        }

                    }

                }



in this code we can see that the logic of the "New" button was overridden that calls the _publishGenerateInvoice method once the "New" button is clicked.



2) _publishGenerateInvoice - this is a method from the SupplyPaymentPageV2 schema that performs the "CreateSupplyPaymentInvoice"  sanbox message sending (BIDIRECTIONAL message type):



...

messages:

...

"CreateSupplyPaymentInvoice": {

                    mode: this.Terrasoft.MessageMode.PTP,

                    direction: this.Terrasoft.MessageDirectionType.BIDIRECTIONAL

                }

...

methods:

...

_publishGenerateInvoice: function() {

                    this.sandbox.publish("CreateSupplyPaymentInvoice", null, [this.sandbox.id]);

                },

...



3) The subscription to the "CreateSupplyPaymentInvoice" message is performed in the SupplyPaymentDetailV2 schema in the subscribeSandboxEvents method:



this.sandbox.subscribe("CreateSupplyPaymentInvoice", function() {

                                var row = this.getActiveRow();

                                this.asyncGenerateInvoices([row]);

                            }, this, [this.sandbox.id]);



4) Once the message is received the logic in the asyncGenerateInvoices method is executed for all active rows selected in the detail.

5) asyncGenerateInvoices - method from the SupplyPaymentDetailV2 schema:



asyncGenerateInvoices: function(collection) {

                        collection = collection || [];

                        this.index = 0;

                        this.existInvoiceCount = 0;

                        collection.forEach(function(item) {

                            var methods = [];

                            methods.push(function(next) {

                                this.generateInvoice(next, item);

                            });

                            methods.push(this.hideBodyMask);

                            methods.push(this);

                            this.showBodyMask();

                            Terrasoft.chain.apply(this, methods);

                        }, this);

                    },



executes the generateInvoice method for all received active rows that don't have an invoice.



6) generateInvoice is also the method from the SupplyPaymentDetailV2 schema:



generateInvoice: function(next, item) {

                        var invoice = item.get("Invoice");

                        if ((invoice === null && this.getIsFeatureEnabled("UseLookupInvoiceForSupplyPaymentDetail")) ||

                            (invoice && this.Terrasoft.isGUID(invoice.value))) {

                            this.existInvoiceCount++;

                            this.validateResult({

                                error: result.ExistInvoice,

                                existInvoiceCount: this.existInvoiceCount

                            });

                            next();

                        } else {

                            this.setAdditionAttributes(next, item);

                        }

                    },



performs data validation and executes the setAdditionAttributes method.



7) setAdditionAttributes method from the SupplyPaymentDetailV2 schema:



setAdditionAttributes: function(next, item) {

                        this.getIncrementCode(function(result) {

                            item.set("Number", result);

                            item.set("StartDate", new Date());

                            var esq = this.getSupplyPaymentProductEntitySchemaQuery(item.get("Id"));

                            esq.getEntityCollection(function(response) {

                                if (response.success) {

                                    const products = response.collection;

                                    this.processProducts(products);

                                    item.set("ProductCollection", products);

                                    this.insertInvoice(next, item);

                                }

                            }, this);

                        }, this);

                    },



calls the insertInvoice method for each product in the supply payment (see the getSupplyPaymentProductEntitySchemaQuery method logic).



8) insertInvoice method performs the actual invoices insert:



insertInvoice: function(next, item) {

                        var insert = this.getInvoiceInsertQuery(item);

                        insert.execute(function(response) {

                            if (response.success) {

                                var config = {

                                    invoiceId: response.id,

                                    id: item.get("Id"),

                                    amount: item.get("AmountPlan"),

                                    number: item.get("Number"),

                                    startDate: item.get("StartDate"),

                                    products: item.get("ProductCollection")

                                };

                                var invoice = {

                                    displayValue: item.get("Number"),

                                    value: response.id

                                };

                                item.set("Invoice", invoice);

                                if (config.products.getCount() === 0) {

                                    this.updateSupplyPaymentElement(next, config);

                                } else {

                                    this.insertInvoiceProducts(next, config);

                                }

                            } else {

                                var message = this.generateInvoiceErrorMessage(response);

                                this.showErrorMessage(message);

                            }

                        }, this);

                    },



with products into invoices (according to the logic from the insertInvoiceProducts method here).



So the complete chain is: SupplyPaymentPageV2 schema "Invoice" lookup modification -> _publishGenerateInvoice -> asyncGenerateInvoices -> generateInvoice -> setAdditionAttributes -> insertInvoice. There is no article to share unfortunately, the code itself should be studied carefully to implement the same functionality in the custom detail.

Show all comments