protected static FR_Guid Execute(DbConnection Connection, DbTransaction Transaction, P_L3PY_CBfB_0959 Parameter, CSV2Core.SessionSecurity.SessionSecurityTicket securityTicket = null)
        {
            //Leave UserCode region to enable user code saving
            #region UserCode
            var returnValue = new FR_Guid();

            /*
             * 0. Load current fiscal year;
             * 1. Load bill header and positions
             * 2. Load taxes for products on bill positions
             * 3. Load VAT booking accounts for retrieved taxes from positions
             * 4. Load customer's account (debtor) -- from BillRecepient_BPID
             * 5. Load tenant's revenue accounts per taxes
             * 6. Create one transaction and multiple booking lines
             * 7. Create link between bill and acc. transaction
             */

            #region 0. Load current fiscal year

            Guid currentFiscalYearID = CL2_FiscalYear.Complex.Retrieval.cls_Get_Current_FiscalYear.Invoke(Connection, Transaction, securityTicket).Result.ACC_FiscalYearID;

            #endregion

            #region 1. Load bill positions

            var billPositions = CL1_BIL.ORM_BIL_BillPosition.Query.Search(Connection, Transaction,
                                                                          new CL1_BIL.ORM_BIL_BillPosition.Query
            {
                BIL_BilHeader_RefID = Parameter.BillHeaderID
            });
            if (billPositions != null && billPositions.Count > 0)
            {
                #endregion

                #region 2. Load taxes for products on bill positions

                Guid[] applicableTaxes = billPositions.Select(x => x.ApplicableSalesTax_RefID).Distinct().ToArray();

                #endregion

                #region 3. Load VAT booking accounts for retrieved taxes from positions

                var taxAccountsParam = new CL3_BookingAccounts.Atomic.Retrieval.P_L3BA_GAfTaFY_1647
                {
                    FiscalYearID     = currentFiscalYearID,
                    TaxID            = applicableTaxes,
                    IsTaxAccount     = true,
                    IsRevenueAccount = false
                };

                var taxAccountAssignments = CL3_BookingAccounts.Atomic.Retrieval.cls_Get_Assignment_for_TaxID_List_and_FiscalYearID.Invoke(
                    Connection, Transaction, taxAccountsParam, securityTicket).Result;

                #endregion

                #region 4. Load customer's account (debtor) -- from BillRecepient_BPID

                var param = new CL3_Payments.Complex.Retrieval.P_L3PY_GBAfBP_1521
                {
                    FiscalYearID = currentFiscalYearID,
                    BillHeaderID = Parameter.BillHeaderID
                };

                var billDataWithBookingAccounts = CL3_Payments.Complex.Retrieval.cls_Get_Booking_Accounts_for_Bill_Participants.Invoke(Connection, Transaction, param, securityTicket).Result;

                #endregion

                #region 5. Load tenant's revenue accounts per taxes

                var revenueAccountsParam = new CL3_BookingAccounts.Atomic.Retrieval.P_L3BA_GAfTaFY_1647
                {
                    FiscalYearID     = currentFiscalYearID,
                    TaxID            = applicableTaxes,
                    IsTaxAccount     = false,
                    IsRevenueAccount = true
                };

                var revenueAccountAssignments = CL3_BookingAccounts.Atomic.Retrieval.cls_Get_Assignment_for_TaxID_List_and_FiscalYearID.Invoke(
                    Connection, Transaction, revenueAccountsParam, securityTicket).Result;

                #endregion

                #region 6. Create one transaction and multiple booking lines

                var transactionParam = new CL3_BookingAccounts.Complex.Manipulation.P_L3BA_CATwBL_1315
                {
                    AccountingTransactionTypeID = Guid.Empty,
                    CurrencyID        = billDataWithBookingAccounts.Bill.CurrencyID,
                    DateOfTransaction = DateTime.Now
                };

                var bookingLines = new List <CL3_BookingAccounts.Complex.Manipulation.P_L3BA_CATwBL_1315a>();

                CL3_BookingAccounts.Complex.Manipulation.P_L3BA_CATwBL_1315a bookingLine = null;

                #region VAT Accounts booking lines

                foreach (var item in taxAccountAssignments)
                {
                    bookingLine = new CL3_BookingAccounts.Complex.Manipulation.P_L3BA_CATwBL_1315a();
                    bookingLine.BookingAccountID = item.ACC_BOK_BookingAccount_RefID;
                    // VAT-account: Bill VAT amount is booked with positive sign
                    decimal taxValue = billPositions.Where(x => x.ApplicableSalesTax_RefID == item.ACC_TAX_Tax_RefID).Sum(x => x.PositionValue_IncludingTax - x.PositionValue_BeforeTax);
                    bookingLine.TransactionValue = taxValue;
                    bookingLines.Add(bookingLine);
                }

                #endregion

                #region Customer Account booking line

                bookingLine = new CL3_BookingAccounts.Complex.Manipulation.P_L3BA_CATwBL_1315a();
                bookingLine.BookingAccountID = billDataWithBookingAccounts.CustomerAccount.BookingAccountID;
                // Debtor account: Bill amount including VAT is booked as receivable with negative sign
                bookingLine.TransactionValue = -(1) * billDataWithBookingAccounts.Bill.TotalValuee_with_DunningFees_IncludingTax;
                bookingLines.Add(bookingLine);

                #endregion

                #region Tenant's Revenue Account booking line

                foreach (var revenueAccount in revenueAccountAssignments)
                {
                    bookingLine = new CL3_BookingAccounts.Complex.Manipulation.P_L3BA_CATwBL_1315a();

                    bookingLine.BookingAccountID = revenueAccount.ACC_BOK_BookingAccount_RefID;
                    // Revenue account: Bill amount is booked  with positive sign
                    decimal value = billPositions.Where(x => x.ApplicableSalesTax_RefID == revenueAccount.ACC_TAX_Tax_RefID).Sum(x => x.PositionValue_BeforeTax);
                    bookingLine.TransactionValue = value;

                    bookingLines.Add(bookingLine);
                }

                #endregion

                transactionParam.BookingLines = bookingLines.ToArray();

                Guid accountTransactionID = CL3_BookingAccounts.Complex.Manipulation.cls_Create_Accounting_Transaction_with_BookingLines.Invoke(
                    Connection, Transaction, transactionParam, securityTicket).Result;

                #endregion

                #region 7. Create link between bill and acc. transaction

                var bill2Transaction = new CL1_BIL.ORM_BIL_BillHeader_2_AccountingTransaction
                {
                    AssignmentID = Guid.NewGuid(),
                    ACC_BOK_Accounting_Transaction_RefID = accountTransactionID,
                    BIL_BillHeader_RefID = Parameter.BillHeaderID,
                    Creation_Timestamp   = DateTime.Now,
                    Tenant_RefID         = securityTicket.TenantID
                };
                bill2Transaction.Save(Connection, Transaction);

                #endregion
            }
            return(returnValue);

            #endregion UserCode
        }
 ///<summary>
 /// Invokes the method for the given Connection, and Transaction, leaving them open/not commited if no exceptions occured
 ///<summary>
 public static FR_Guid Invoke(DbConnection Connection, DbTransaction Transaction, P_L3PY_CBfB_0959 Parameter, CSV2Core.SessionSecurity.SessionSecurityTicket securityTicket = null)
 {
     return(Invoke(Connection, Transaction, null, Parameter, securityTicket));
 }
        ///<summary>
        /// Method Invocation of wrapper classes
        ///<summary>
        protected static FR_Guid Invoke(DbConnection Connection, DbTransaction Transaction, string ConnectionString, P_L3PY_CBfB_0959 Parameter, CSV2Core.SessionSecurity.SessionSecurityTicket securityTicket = null)
        {
            bool cleanupConnection  = Connection == null;
            bool cleanupTransaction = Transaction == null;

            FR_Guid functionReturn = new FR_Guid();

            try
            {
                if (cleanupConnection == true)
                {
                    Connection = CSV2Core_MySQL.Support.DBSQLSupport.CreateConnection(ConnectionString);
                    Connection.Open();
                }
                if (cleanupTransaction == true)
                {
                    Transaction = Connection.BeginTransaction();
                }

                functionReturn = Execute(Connection, Transaction, Parameter, securityTicket);

                #region Cleanup Connection/Transaction
                //Commit the transaction
                if (cleanupTransaction == true)
                {
                    Transaction.Commit();
                }
                //Close the connection
                if (cleanupConnection == true)
                {
                    Connection.Close();
                }
                #endregion
            }
            catch (Exception ex)
            {
                try
                {
                    if (cleanupTransaction == true && Transaction != null)
                    {
                        Transaction.Rollback();
                    }
                }
                catch { }

                try
                {
                    if (cleanupConnection == true && Connection != null)
                    {
                        Connection.Close();
                    }
                }
                catch { }

                throw new Exception("Exception occured in method cls_Create_Bookings_for_Bill_on_Closing", ex);
            }
            return(functionReturn);
        }
 ///<summary>
 /// Opens the connection/transaction for the given connectionString, and closes them when complete
 ///<summary>
 public static FR_Guid Invoke(string ConnectionString, P_L3PY_CBfB_0959 Parameter, CSV2Core.SessionSecurity.SessionSecurityTicket securityTicket = null)
 {
     return(Invoke(null, null, ConnectionString, Parameter, securityTicket));
 }