diff --git a/controllers_v2/finstitutions/payments/base.py b/controllers_v2/finstitutions/payments/base.py index 95001ee..a09fdd8 100644 --- a/controllers_v2/finstitutions/payments/base.py +++ b/controllers_v2/finstitutions/payments/base.py @@ -359,6 +359,15 @@ class PaymentsController(CoreAuthTokenController, ABC): if sql_json["status"] == 1: return True else: return False + async def add_sales_line_item( + self, + sql_conn: AsyncMySQL, + mongo_data_conn: AsyncMongo, + payment: CorePaymentModel, + session_token: str = None + ): + pass + async def add_sales_transaction( self, sql_conn: AsyncMySQL, @@ -376,7 +385,7 @@ class PaymentsController(CoreAuthTokenController, ABC): :return: True is the receipt was added, else False. """ - # Call the database's procedure: + # Add the master entry of the sales transaction: sql_json = await self.call_procedure( sql_conn = sql_conn, proc_name = "sales_transaction_add", @@ -396,9 +405,56 @@ class PaymentsController(CoreAuthTokenController, ABC): alert_on_all_failures = True ) - # Return the response: - if sql_json["status"] == 1: return True - else: return False + # If we could not create the master, + # we return with failure: + if sql_json["status"] != 1: return False + + # We format the line items to a simple array: + line_items = [] + for account_group_id in payment.metadata.againstReference.keys(): + for line_item in payment.metadata.againstReference[account_group_id]: + line_item["accountGroupId"] = account_group_id + line_items.append(line_item) + + print("LINE ITEMS:", json.to_string(line_items, default=str)) + + # Now we add the line items for each entry: + journal_entry_id = sql_json["data"]["sales_id"] + success_count = 0 + total_count = len(line_items) + for line_item in line_items: + sql_json = await self.call_procedure( + sql_conn = sql_conn, + proc_name = "sales_transaction_details_add", + proc_args = ( + payment.user.userId, + payment.user.billingAccountId, + journal_entry_id, + line_item["accountId"], + json.to_string( + python_data = { + "clientId": payment.metadata.idClient, + "accountId": line_item.get("accountId"), + "accountName": line_item.get("accountName"), + "quantity": line_item.get("quantity"), + "uom": line_item.get("uom"), + "unitPrice": line_item.get("unitPrice"), + "hsnCode": line_item.get("hsnCode"), + }, + no_space = True + ), + line_item["total"], + ), + retry_count = 1, + backoff_seconds = 0.5, + backoff_multiplier = 1.1, + session_token = session_token, + alert_on_all_failures = True + ) + if sql_json["status"] == 1: success_count += 1 + + # Done here: + return True if total_count == success_count else False async def add_event_by_payment_id( self,