From a97f5b1027597e7514145480b8fd42171a09f14f Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Mon, 28 Oct 2024 12:02:59 +0530 Subject: [PATCH] chore: GXC Update script --- gxc_update_logs/batch_1.txt | 332 ++++++++++++++++++++++ gxc_update_logs/gxc_update.py | 212 ++++++++++++++ gxc_update_logs/gxc_update_batch_1_50.csv | 51 ++++ 3 files changed, 595 insertions(+) create mode 100644 gxc_update_logs/batch_1.txt create mode 100644 gxc_update_logs/gxc_update.py create mode 100644 gxc_update_logs/gxc_update_batch_1_50.csv diff --git a/gxc_update_logs/batch_1.txt b/gxc_update_logs/batch_1.txt new file mode 100644 index 0000000..a835d9e --- /dev/null +++ b/gxc_update_logs/batch_1.txt @@ -0,0 +1,332 @@ +kube_bash_integration_prod_us netsuite-api +kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. +root@netsuite-api-5b4f8d84d5-s57q2:/fyle-netsuite-api# python manage.py shell +Python 3.10.15 (main, Oct 19 2024, 01:02:59) [GCC 12.2.0] on linux +Type "help", "copyright", "credits" or "license" for more information. +(InteractiveConsole) +>>> +>>> +>>> import json +>>> from apps.workspaces.models import NetSuiteCredentials +>>> from apps.netsuite.models import CreditCardCharge, CreditCardChargeLineItem +>>> from apps.fyle.models import Expense, ExpenseGroup +>>> from typing import Dict +>>> from requests_oauthlib import OAuth1Session +>>> import csv +>>> from datetime import datetime +>>> from apps.workspaces.models import FyleCredential, Workspace +nt_links: + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_receipt_link', + 'value': attachment_links[expense.expense_id] + } + ) + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_receipt_link_2', + 'type': 'String', + 'value': attachment_links[expense.expense_id] + } + ) + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_expense_url', + 'value': '{}/app/admin/#/enterprise/view_expense/{}?org_id={}'.format( + settings.FYLE_EXPENSE_URL, + expense.expense_id, + org_id + ) + } + ) + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_expense_url_2', + 'value': '{}/app/admin/#/enterprise/view_expense/{}?org_id={}'.format( + settings.FYLE_EXPENSE_URL, + expense.expense_id, + org_id + ) + } + ) + line = { + 'account': { + 'internalId': line.account_id + }, + 'amount': line.amount - line.tax_amount if (line.tax_item_id and line.tax_amount is not None) else line.amount, + 'memo': line.memo, + 'grossAmt': line.amount, + 'department': { + 'internalId': line.department_id + }, + 'class': { + 'internalId': line.class_id + }, + 'location': { + 'internalId': line.location_id + }, + 'customer': { + 'internalId': line.customer_id + }, + 'customFieldList': netsuite_custom_segments, + 'isBillable': line.billable, + 'taxAmount': None, + 'taxCode': { + 'name': None, + 'internalId': line.tax_item_id if (line.tax_item_id and line.tax_amount is not None) else None, + 'externalId': None, + 'type': 'taxGroup' + }, + } + lines.append(line) + return lines + +from datetime >>> from typing import List +>>> from django.conf import settings +>>> from fyle_accounting_mappings.models import DestinationAttribute +>>> +i>>> workspace_id=439 +>>> netsuite_credentials = NetSuiteCredentials.objects.get(workspace_id=workspace_id) +>>> failed_records = [] + ), + >>> + >>> def construct_credit_card_charge_lineitems( +... credit_card_charge_lineitem: CreditCardChargeLineItem, +... attachment_links: Dict, cluster_domain: str, org_id: str) -> List[Dict]: +... line = credit_card_charge_lineitem +... lines = [] +... expense = Expense.objects.get(pk=line.expense_id) +... netsuite_custom_segments = line.netsuite_custom_segments +... if attachment_links and expense.expense_id in attachment_links: +... netsuite_custom_segments.append( +... { +... 'scriptId': 'custcolfyle_receipt_link', +... 'value': attachment_links[expense.expense_id] +... } +... ) +ke... netsuite_custom_segments.append( +... { +... 'scriptId': 'custcolfyle_receipt_link_2', +... 'type': 'String', +... 'value': attachment_links[expense.expense_id] +... } +... ) +... netsuite_custom_segments.append( +... { +... 'scriptId': 'custcolfyle_expense_url', +... 'value': '{}/app/admin/#/enterprise/view_expense/{}?org_id={}'.format( +... settings.FYLE_EXPENSE_URL, +... expense.expense_id, +... org_id +... ) +... } +... ) +... netsuite_custom_segments.append( +... { +... 'scriptId': 'custcolfyle_expense_url_2', +... 'value': '{}/app/admin/#/enterprise/view_expense/{}?org_id={}'.format( +... settings.FYLE_EXPENSE_URL, +... expense.expense_id, +... org_id +... ) +ternalId'] =... } +... ) +... line = { +... 'account': { +... 'internalId': line.account_id +... }, +... 'amount': line.amount - line.tax_amount if (line.tax_item_id and line.tax_amount is not None) else line.amount, +... 'memo': line.memo, +... 'grossAmt': line.amount, +... 'department': { +... 'internalId': line.department_id +... }, +... 'class': { +... 'internalId': line.class_id +... }, +... 'location': { +... 'internalId': line.location_id +... }, +... 'customer': { +... 'internalId': line.customer_id +... }, +... 'customFieldList': netsuite_custom_segments, +... 'isBillable': line.billable, +... 'taxAmount': None, +... 'taxCode': { +... 'name': None, +... 'internalId': line.tax_item_id if (line.tax_item_id and line.tax_amount is not None) else None, +... 'externalId': None, +... 'type': 'taxGroup' +... }, +... } +... lines.append(line) +... return lines +... +>>> from datetime import datetime +>>> def construct_credit_card_charge( +... credit_card_charge: CreditCardCharge, +... credit_card_charge_lineitem: CreditCardChargeLineItem, attachment_links: Dict, transaction_date) -> Dict: +... fyle_credentials = FyleCredential.objects.get(workspace_id=credit_card_charge.expense_group.workspace_id) +... cluster_domain = fyle_credentials.cluster_domain +... org_id = Workspace.objects.get(id=credit_card_charge.expense_group.workspace_id).fyle_org_id +... if transaction_date: +... transaction_date = transaction_date +... else: +... transaction_date = credit_card_charge.transaction_date +... transaction_date = transaction_date.strftime('%m/%d/%Y') +... credit_card_charge_payload = { +... 'account': { +... 'internalId': credit_card_charge.credit_card_account_id +... }, +... 'entity': { +... 'internalId': credit_card_charge.entity_id +... }, +... 'subsidiary': { +... 'internalId': credit_card_charge.subsidiary_id +... }, +... 'location': { +... 'internalId': credit_card_charge.location_id +... }, +... 'currency': { +... 'internalId': credit_card_charge.currency +... }, +... 'department': { +... 'internalId': credit_card_charge.department_id +... }, +... 'class': { +... 'internalId': credit_card_charge.class_id +... }, +... 'tranDate': transaction_date, +... 'memo': credit_card_charge.memo, +... 'tranid': credit_card_charge.reference_number, +... 'expenses': construct_credit_card_charge_lineitems( +... credit_card_charge_lineitem, attachment_links, cluster_domain, org_id +... ), +... 'externalId': credit_card_charge.external_id +... } +... return credit_card_charge_payload +... +>>> def post_credit_card_charge(credit_card_charge: CreditCardCharge, +... credit_card_charge_lineitem: CreditCardChargeLineItem, attachment_links: Dict, +... refund: bool, netsuite_credentials, transaction_date=None): +... """ +... Post vendor credit_card_charges to NetSuite +... """ +... account = netsuite_credentials.ns_account_id.replace('_', '-') +... consumer_key = netsuite_credentials.ns_consumer_key +... consumer_secret = netsuite_credentials.ns_consumer_secret +... token_key = netsuite_credentials.ns_token_id +... token_secret = netsuite_credentials.ns_token_secret +... is_sandbox = False +... if '-SB' in account: +... is_sandbox = True +... url = f"https://{account.lower()}.restlets.api.netsuite.com/app/site/hosting/restlet.nl?" \ +... f"script=customscript_cc_charge_fyle&deploy=customdeploy_cc_charge_fyle" +... if refund: +... credit_card_charge_lineitem.amount = abs(credit_card_charge_lineitem.amount) +... url = f"https://{account.lower()}.restlets.api.netsuite.com/app/site/hosting/restlet.nl?" \ +... f"script=customscript_cc_refund_fyle&deploy=customdeploy_cc_refund_fyle" +... credit_card_charges_payload = construct_credit_card_charge( +... credit_card_charge, credit_card_charge_lineitem, attachment_links, transaction_date) +... credit_card_charges_payload['internalId'] = credit_card_charge.expense_group.response_logs['internalId'] +... oauth = OAuth1Session( +... client_key=consumer_key, +... client_secret=consumer_secret, +... resource_owner_key=token_key, +... resource_owner_secret=token_secret, +... realm=netsuite_credentials.ns_account_id.upper() if is_sandbox else account, +... signature_method='HMAC-SHA256' +... ) +... raw_response = oauth.put( +... url, headers={ +... 'Content-Type': 'application/json', +... 'Accept': 'application/json' +... }, data=json.dumps(credit_card_charges_payload)) +... status_code = raw_response.status_code +... if status_code == 200 and 'success' in json.loads(raw_response.text) and json.loads(raw_response.text)['success']: +... print(json.loads(raw_response.text)) +... else: +... failed_records.append({credit_card_charge.expense_group.response_logs['internalId']: json.loads(raw_response.text)}) +... print(failed_records) +... +>>> +>>> +>>> +>>> file_path = 'gxc_update_batch_1_50.csv' +>>> with open(file_path, mode='r') as file: +... reader = csv.DictReader(file) +... for r in reader: +... expense: Expense = Expense.objects.get(expense_number=r['expense_number'], workspace_id=workspace_id) +... expense_group = ExpenseGroup.objects.get(expenses=expense, workspace_id=workspace_id) +... credit_card_charge = CreditCardCharge.objects.get(expense_group=expense_group) +... credit_card_charge_lineitems = CreditCardChargeLineItem.objects.get(credit_card_charge=credit_card_charge) +... refund = False +... transaction_date = None +... if expense.amount < 0: +... refund = True +... credit_card_account_id = None +... attachment_links = {} +... attachment_links[expense.expense_id] = r['receipt_url'] +... credit_card_charge_lineitems.amount = r['netsuite_amount'] if r['netsuite_amount'] != "" else credit_card_charge_lineitems.amount +... if r['netsuite_date'] != "": +... transaction_date = r['netsuite_date'] +... if r['netsuite_account'] != "": +... credit_card_account_id = DestinationAttribute.objects.filter(workspace_id=workspace_id, attribute_type='CREDIT_CARD_ACCOUNT', value=r['netsuite_account']).first() +... credit_card_charge.credit_card_account_id = credit_card_account_id.destination_id if credit_card_account_id else credit_card_charge.credit_card_account_id +... credit_card_charge.netsuite_receipt_url = r['receipt_url'] +... credit_card_charge.save() +... credit_card_charge_lineitems.save() +... post_credit_card_charge(credit_card_charge, credit_card_charge_lineitems, attachment_links, refund, netsuite_credentials, transaction_date) +... +{'internalId': 81778, 'success': True} +{'internalId': 80540, 'success': True} +{'internalId': 14055, 'success': True} +{'internalId': 26304, 'success': True} +{'internalId': 26087, 'success': True} +{'internalId': 77569, 'success': True} +{'internalId': 14798, 'success': True} +{'internalId': 62243, 'success': True} +{'internalId': 84323, 'success': True} +{'internalId': 83470, 'success': True} +{'internalId': 83465, 'success': True} +{'internalId': 67383, 'success': True} +{'internalId': 83467, 'success': True} +{'internalId': 64636, 'success': True} +{'internalId': 78312, 'success': True} +{'internalId': 71708, 'success': True} +{'internalId': 69852, 'success': True} +{'internalId': 62541, 'success': True} +{'internalId': 84757, 'success': True} +{'internalId': 62554, 'success': True} +{'internalId': 83464, 'success': True} +{'internalId': 87472, 'success': True} +{'internalId': 32654, 'success': True} +{'internalId': 50859, 'success': True} +{'internalId': 36973, 'success': True} +{'internalId': 36974, 'success': True} +{'internalId': 37481, 'success': True} +{'internalId': 37489, 'success': True} +{'internalId': 37480, 'success': True} +{'internalId': 37479, 'success': True} +{'internalId': 58327, 'success': True} +{'internalId': 37988, 'success': True} +{'internalId': 50871, 'success': True} +{'internalId': 53348, 'success': True} +{'internalId': 43816, 'success': True} +{'internalId': 53354, 'success': True} +{'internalId': 46199, 'success': True} +{'internalId': 46626, 'success': True} +{'internalId': 46624, 'success': True} +{'internalId': 47803, 'success': True} +{'internalId': 47804, 'success': True} +{'internalId': 55442, 'success': True} +{'internalId': 55443, 'success': True} +{'internalId': 47809, 'success': True} +{'internalId': 55352, 'success': True} +{'internalId': 55444, 'success': True} +{'internalId': 55357, 'success': True} +{'internalId': 58430, 'success': True} +{'internalId': 51119, 'success': True} +{'internalId': 58535, 'success': True} +>>> \ No newline at end of file diff --git a/gxc_update_logs/gxc_update.py b/gxc_update_logs/gxc_update.py new file mode 100644 index 0000000..1e87128 --- /dev/null +++ b/gxc_update_logs/gxc_update.py @@ -0,0 +1,212 @@ +#add the file to pod before running this script +# kube_prod_integrations_us cp /Users/ruuushhh/workspace/netsuite-sdk-py/gxc_update_batch_1_50.csv integrations/netsuite-api-5b4f8d84d5-s57q2:gxc_update_batch_1_50.csv + + +import json +from apps.workspaces.models import NetSuiteCredentials +from apps.netsuite.models import CreditCardCharge, CreditCardChargeLineItem +from apps.fyle.models import Expense, ExpenseGroup +from typing import Dict +from requests_oauthlib import OAuth1Session +import csv +from datetime import datetime +from apps.workspaces.models import FyleCredential, Workspace +from typing import List +from django.conf import settings +from fyle_accounting_mappings.models import DestinationAttribute + +workspace_id=439 +netsuite_credentials = NetSuiteCredentials.objects.get(workspace_id=workspace_id) +failed_records = [] + +def construct_credit_card_charge_lineitems( + credit_card_charge_lineitem: CreditCardChargeLineItem, + attachment_links: Dict, cluster_domain: str, org_id: str) -> List[Dict]: + line = credit_card_charge_lineitem + lines = [] + expense = Expense.objects.get(pk=line.expense_id) + netsuite_custom_segments = line.netsuite_custom_segments + if attachment_links and expense.expense_id in attachment_links: + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_receipt_link', + 'value': attachment_links[expense.expense_id] + } + ) + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_receipt_link_2', + 'type': 'String', + 'value': attachment_links[expense.expense_id] + } + ) + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_expense_url', + 'value': '{}/app/admin/#/enterprise/view_expense/{}?org_id={}'.format( + settings.FYLE_EXPENSE_URL, + expense.expense_id, + org_id + ) + } + ) + netsuite_custom_segments.append( + { + 'scriptId': 'custcolfyle_expense_url_2', + 'value': '{}/app/admin/#/enterprise/view_expense/{}?org_id={}'.format( + settings.FYLE_EXPENSE_URL, + expense.expense_id, + org_id + ) + } + ) + line = { + 'account': { + 'internalId': line.account_id + }, + 'amount': line.amount - line.tax_amount if (line.tax_item_id and line.tax_amount is not None) else line.amount, + 'memo': line.memo, + 'grossAmt': line.amount, + 'department': { + 'internalId': line.department_id + }, + 'class': { + 'internalId': line.class_id + }, + 'location': { + 'internalId': line.location_id + }, + 'customer': { + 'internalId': line.customer_id + }, + 'customFieldList': netsuite_custom_segments, + 'isBillable': line.billable, + 'taxAmount': None, + 'taxCode': { + 'name': None, + 'internalId': line.tax_item_id if (line.tax_item_id and line.tax_amount is not None) else None, + 'externalId': None, + 'type': 'taxGroup' + }, + } + lines.append(line) + return lines + +from datetime import datetime +def construct_credit_card_charge( + credit_card_charge: CreditCardCharge, + credit_card_charge_lineitem: CreditCardChargeLineItem, attachment_links: Dict, transaction_date) -> Dict: + fyle_credentials = FyleCredential.objects.get(workspace_id=credit_card_charge.expense_group.workspace_id) + cluster_domain = fyle_credentials.cluster_domain + org_id = Workspace.objects.get(id=credit_card_charge.expense_group.workspace_id).fyle_org_id + if transaction_date: + transaction_date = transaction_date + else: + transaction_date = credit_card_charge.transaction_date + transaction_date = transaction_date.strftime('%m/%d/%Y') + credit_card_charge_payload = { + 'account': { + 'internalId': credit_card_charge.credit_card_account_id + }, + 'entity': { + 'internalId': credit_card_charge.entity_id + }, + 'subsidiary': { + 'internalId': credit_card_charge.subsidiary_id + }, + 'location': { + 'internalId': credit_card_charge.location_id + }, + 'currency': { + 'internalId': credit_card_charge.currency + }, + 'department': { + 'internalId': credit_card_charge.department_id + }, + 'class': { + 'internalId': credit_card_charge.class_id + }, + 'tranDate': transaction_date, + 'memo': credit_card_charge.memo, + 'tranid': credit_card_charge.reference_number, + 'expenses': construct_credit_card_charge_lineitems( + credit_card_charge_lineitem, attachment_links, cluster_domain, org_id + ), + 'externalId': credit_card_charge.external_id + } + return credit_card_charge_payload + +def post_credit_card_charge(credit_card_charge: CreditCardCharge, + credit_card_charge_lineitem: CreditCardChargeLineItem, attachment_links: Dict, + refund: bool, netsuite_credentials, transaction_date=None): + """ + Post vendor credit_card_charges to NetSuite + """ + account = netsuite_credentials.ns_account_id.replace('_', '-') + consumer_key = netsuite_credentials.ns_consumer_key + consumer_secret = netsuite_credentials.ns_consumer_secret + token_key = netsuite_credentials.ns_token_id + token_secret = netsuite_credentials.ns_token_secret + is_sandbox = False + if '-SB' in account: + is_sandbox = True + url = f"https://{account.lower()}.restlets.api.netsuite.com/app/site/hosting/restlet.nl?" \ + f"script=customscript_cc_charge_fyle&deploy=customdeploy_cc_charge_fyle" + if refund: + credit_card_charge_lineitem.amount = abs(credit_card_charge_lineitem.amount) + url = f"https://{account.lower()}.restlets.api.netsuite.com/app/site/hosting/restlet.nl?" \ + f"script=customscript_cc_refund_fyle&deploy=customdeploy_cc_refund_fyle" + credit_card_charges_payload = construct_credit_card_charge( + credit_card_charge, credit_card_charge_lineitem, attachment_links, transaction_date) + credit_card_charges_payload['internalId'] = credit_card_charge.expense_group.response_logs['internalId'] + oauth = OAuth1Session( + client_key=consumer_key, + client_secret=consumer_secret, + resource_owner_key=token_key, + resource_owner_secret=token_secret, + realm=netsuite_credentials.ns_account_id.upper() if is_sandbox else account, + signature_method='HMAC-SHA256' + ) + raw_response = oauth.put( + url, headers={ + 'Content-Type': 'application/json', + 'Accept': 'application/json' + }, data=json.dumps(credit_card_charges_payload)) + status_code = raw_response.status_code + if status_code == 200 and 'success' in json.loads(raw_response.text) and json.loads(raw_response.text)['success']: + print(json.loads(raw_response.text)) + else: + failed_records.append({credit_card_charge.expense_group.response_logs['internalId']: json.loads(raw_response.text)}) + print(failed_records) + +file_path = 'gxc_update_batch_1_50.csv' +with open(file_path, mode='r') as file: + reader = csv.DictReader(file) + for r in reader: + expense: Expense = Expense.objects.get(expense_number=r['expense_number'], workspace_id=workspace_id) + expense_group = ExpenseGroup.objects.get(expenses=expense, workspace_id=workspace_id) + credit_card_charge = CreditCardCharge.objects.get(expense_group=expense_group) + credit_card_charge_lineitems = CreditCardChargeLineItem.objects.get(credit_card_charge=credit_card_charge) + refund = False + transaction_date = None + if expense.amount < 0: + refund = True + credit_card_account_id = None + attachment_links = {} + attachment_links[expense.expense_id] = r['receipt_url'] + credit_card_charge_lineitems.amount = r['netsuite_amount'] if r['netsuite_amount'] != "" else credit_card_charge_lineitems.amount + if r['netsuite_date'] != "": + transaction_date = r['netsuite_date'] + if r['netsuite_account'] != "": + credit_card_account_id = DestinationAttribute.objects.filter(workspace_id=workspace_id, attribute_type='CREDIT_CARD_ACCOUNT', value=r['netsuite_account']).first() + credit_card_charge.credit_card_account_id = credit_card_account_id.destination_id if credit_card_account_id else credit_card_charge.credit_card_account_id + credit_card_charge.netsuite_receipt_url = r['receipt_url'] + credit_card_charge.save() + credit_card_charge_lineitems.save() + post_credit_card_charge(credit_card_charge, credit_card_charge_lineitems, attachment_links, refund, netsuite_credentials, transaction_date) + +print("Final Failed records", failed_records) + + +# CSV generate query +# \copy (select une.internalid, une.expense_number, une.fyle_amount, une.netsuite_amount, une.fyle_account, une.fyle_account_name, une.netsuite_account, une.fyle_date, une.netsuite_date, une.receipt_url, e.accounting_export_summary->>'url' as export_url from update_netsuite_expenses une join expenses e on une.expense_number=e.expense_number where e.workspace_id=439) to '/Users/ruuushhh/Downloads/gxc_update_batch_1_50.csv' with csv header; \ No newline at end of file diff --git a/gxc_update_logs/gxc_update_batch_1_50.csv b/gxc_update_logs/gxc_update_batch_1_50.csv new file mode 100644 index 0000000..d8947a2 --- /dev/null +++ b/gxc_update_logs/gxc_update_batch_1_50.csv @@ -0,0 +1,51 @@ +internalid,expense_number,fyle_amount,netsuite_amount,fyle_account,fyle_account_name,netsuite_account,fyle_date,netsuite_date,receipt_url,export_url +84323,E/2024/06/T/392,435,236.11,654,Chase Unlimited - 9186,,2024-06-18 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=55742&c=7168963&h=BDWijByZwPL5MPA1FROU0LMN2V37NjmGXehh-o1zSXFilRj2,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=84323 +83465,E/2024/06/T/353,411,211.24,654,Chase Unlimited - 9186,,2024-06-18 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=55342&c=7168963&h=x8UfYmimBAODqvHWQTCeqRZntBOJRjfp7k8173pdVr15pGWv,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=83465 +83470,E/2024/06/T/348,262.13,232.13,654,Chase Unlimited - 9186,,2024-06-17 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=55539&c=7168963&h=Svgwd1t6hpWtnLKEKFgG28dimrLJ99VP-4Er_5rQKdDmfs4Y,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=83470 +84757,E/2024/06/T/405,155.45,115.45,654,Chase Unlimited - 9186,,2024-06-19 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=56248&c=7168963&h=Ksr23aHPMR3OtVTRa4av1oUwJkFgWM_fM03Gkz4clLVwag_1,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=84757 +87472,E/2024/06/T/460,27.58,26.33,654,Chase Unlimited - 9186,,2024-06-24 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=58373&c=7168963&h=fsVF6XT8RvZ6CnZpC4AX-KszKsAS7E1KHTmdKEYCdm6X35bY,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=87472 +83467,E/2024/06/T/333,391,191.36,654,Chase Unlimited - 9186,,2024-06-17 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=55344&c=7168963&h=PA2VfNHTbxxQ6nVUoIDHU7OgFrQTBmORF61RQT0gK8hExwxT,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=83467 +83464,E/2024/06/T/338,290,72.44,654,Chase Unlimited - 9186,,2024-06-17 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=55341&c=7168963&h=zQaPXl-avbZ-O3ecf2RC-XUlC2jOcehkcnzG0ghtgdrJGNoF,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=83464 +81778,E/2024/06/T/214,304.1,1737.98,654,Chase Unlimited - 9186,,2024-06-11 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=54519&c=7168963&h=Cal603uQjSwW5APhH8GFQ_JdmydaR5sPGOSI7ocoiMFVwJow&_xt=.pdf,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=81778 +80540,E/2024/06/T/64,1628.13,1398.33,654,Chase Unlimited - 9186,,2024-06-04 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=53513&c=7168963&h=t-hSvvNP0ScXqGvEAj5QN_DjMZ1CjG46jCJZBjnsGVUrzYSD,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=80540 +64636,E/2024/04/T/393,245.33,190.6,654,Chase Unlimited - 9186,,2024-04-20 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=41769&c=7168963&h=lSwUlDX5O1aMMLt8n-wzukSEKpzHhHy1tcJbL31TlRuIlzHL,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=64636 +62554,E/2024/04/T/332,1380.42,85.75,654,Chase Unlimited - 9186,,2024-04-17 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=40783&c=7168963&h=Gumhy3DgmAhjcCJom3-SInSPGjFukLTixfbCvq3W235_I57T,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=62554 +58327,E/2024/03/T/362,173.42,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-19 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=37498&c=7168963&h=-El_pFwvJhJml5BQ6XzmPavKhEHFjpi3OyIFlYHh4qklUmK9,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=58327 +55443,E/2024/03/T/264,42,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-14 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=36471&c=7168963&h=pX9d2vEYCHP1Y2ox1gfax02eQF3Jd_kiqpfu1nh6yOBWQAR5,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=55443 +55444,E/2024/03/T/175,1234.19,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-08 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=36472&c=7168963&h=g84udrgNvAyBQ8lDglukNsg1CZWlsBLDxFNI_Utp3CHCk-Q4&_xt=.pdf,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=55444 +71708,E/2024/05/T/281,191.86,166.86,654,Chase Unlimited - 9186,,2024-05-13 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=46654&c=7168963&h=hlF4ZJRN257Js3h2-HasOoXfyWUTUQUTSBygXV2KQB1DMG-W,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=71708 +78312,E/2024/06/T/28,239.28,189.28,654,Chase Unlimited - 9186,,2024-06-03 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=52491&c=7168963&h=QJCRD3uL_EwfT0IBkDinbQwdSFJ1dNtDHW4KTxS2btTF9DTm,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=78312 +55442,E/2024/03/T/232,62,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-13 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=36470&c=7168963&h=WLjX_foTHhoP13Y6PhWfGWPLBRSNvkOWlAzidC9PA6kHnUkt,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=55442 +58535,E/2024/03/T/460,35,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-22 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=37798&c=7168963&h=jzBQvAaluYSFXM_i_j3BcZIjs4zJRrr7OmbzKVRA54CAOh1v,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=58535 +69852,E/2024/05/T/168,183.94,133.94,654,Chase Unlimited - 9186,,2024-05-08 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=45333&c=7168963&h=vJSAsrzdbGb2mR7ekoMOBqf0wqU6eKbeconqF3QfZSez49iy,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=69852 +67383,E/2024/04/T/572,209,209.03,654,Chase Unlimited - 9186,,2024-04-30 00:00:00+00,05/02/2024,https://7168963.app.netsuite.com/core/media/media.nl?id=43507&c=7168963&h=Ghkg2Mb-RJPZacRVUxZMe4wSFY9BZeXz3IMZpI_YEdnFczfc,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=67383 +62541,E/2024/04/T/315,332,131.85,654,Chase Unlimited - 9186,,2024-04-16 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=40770&c=7168963&h=PqtoEGNvt1y2QLloXfnkLHnOyPWOuBQZ7JEr3DlKMCA521i9,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=62541 +55352,E/2024/03/T/141,9.5,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-08 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=36371&c=7168963&h=FYe6cFm24ODP54Hh0tG4mBbR9jI7bF1uhDvbv56y5RFcDNID,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=55352 +62243,E/2024/04/T/233,379.66,329.66,654,Chase Unlimited - 9186,,2024-04-08 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=40552&c=7168963&h=gxGYQfea2yCtA-lrUcb1VRbrzya9NyADdTm8qGm-2hSmBGNX,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=62243 +55357,E/2024/03/T/29,85.88,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-03 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=36372&c=7168963&h=zEnQTngveEbHLGAiBowGYt3JFlTyk_GxsftYjP7S0tb55cVZ,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=55357 +58430,E/2024/03/T/443,180.86,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-03-20 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=37695&c=7168963&h=HLSe3soOhkO8WNCczRNLT3NpddmCu7hbqzuX_e7nvIcEUt7_,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=58430 +77569,E/2024/06/T/21,755,555.49,654,Chase Unlimited - 9186,,2024-06-03 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=51873&c=7168963&h=UoJ6sLxcMuMbUXe3lkiBCSFYkcePIJRx-wabiNO1ZWY0fTaf,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=77569 +47803,E/2024/02/T/50,302.55,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-03 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=31639&c=7168963&h=7DI5ZnLtkwtk_o4ow2wyn2Tc6aJ3oHg0E4E3ltEr5IM9MByH,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=47803 +47809,E/2024/02/T/53,872.36,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-03 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=31642&c=7168963&h=JmEbjvZa1XVinmHJ4Tkm9V1x4DZrdJ0NNfCCWmpFV4Y6rNS7,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=47809 +47804,E/2024/02/T/57,107.75,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-04 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=31640&c=7168963&h=7CU_e5xvHkT5rRdO1tlhovg9MnPddyqhWKq8cy_2wjBWD_HN,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=47804 +46626,E/2024/01/T/539,73.3,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-01-31 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=30832&c=7168963&h=nUMx_X55J91X2ZI79D98jkiIWHxJis7_OKJE09fXXt80-o-8,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=46626 +46624,E/2024/02/T/24,67.47,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-01 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=30831&c=7168963&h=-Bdxbk4Hm67BM2ovJpvskmQzdXeZ3_aOIqvH12h4ZzJCByHA,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=46624 +46199,E/2024/02/T/32,24,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-02 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=30520&c=7168963&h=aqaN0XBLrBjKSRkpfssnFriV3K2yLaHeD_7Cm3X3znhJGwDI,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=46199 +43816,E/2024/01/T/39,64.97,,654,Chase Unlimited - 9186,,2024-01-05 00:00:00+00,01/08/2024,https://7168963.app.netsuite.com/core/media/media.nl?id=28803&c=7168963&h=oahufnTHLAx7i8QZxtMrfzwhP6G1npi3vCRGlll_kPILBuQQ,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=43816 +37988,E/2023/12/T/72,53.2,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2023-12-05 00:00:00+00,12/06/2023,https://7168963.app.netsuite.com/core/media/media.nl?id=24732&c=7168963&h=6pqaJmYtlf9Pl0es0TKdrg4ZWiB6FlALHiaGiNsEyab13vNL&_xt=.pdf,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=37988 +37489,E/2023/11/T/429,156.5,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2023-11-28 00:00:00+00,12/01/2023,https://7168963.app.netsuite.com/core/media/media.nl?id=24409&c=7168963&h=yCR76JITfo5gB6kZUnFRLX2Z0mM2U15DWnMyv095VgsFmstZ,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=37489 +37481,E/2023/11/T/428,30,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2023-11-29 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=24401&c=7168963&h=sdVJtjKo_uEnB7jVg9u54a_HWsXjifpg7mhVXf9Gx7Q3e-9D,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=37481 +37479,E/2023/11/T/445,80,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2023-11-29 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=24399&c=7168963&h=a_a5OKJb4zlErXf2Tk4QL-DCZ4axcAU7NN-VcmOk5fU0nFO0,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=37479 +37480,E/2023/11/T/436,20.96,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2023-11-29 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=24400&c=7168963&h=mSwmVzhqYgNDlzSJfn9jmOfdkExOGGR5FuXUOf-4nhNTRo_9,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=37480 +36974,E/2023/12/T/54,101.09,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2023-12-04 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=24104&c=7168963&h=BdVE6gUC9SZ0bxrtC6uT7zZ1D74cqK3CJkpv7q2JBSggSSWz,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=36974 +36973,E/2023/11/T/409,2.3,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2023-11-28 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=24103&c=7168963&h=VQUN2oudFeKWcw6ctbs4acFQ8pRs7_lJ94Lb2T5JkJvIr4F5,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=36973 +32654,E/2023/09/T/400,18.5,18.51,439,Chase Unlimited - 0434,,2023-09-25 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=21488&c=7168963&h=soA8KozbAWQKk-g-mFXrQryhcItAXqZef02CWMVNjElN_Pqn,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=32654 +26087,E/2023/10/T/93,626.46,622.96,439,Chase Unlimited - 0434,,2023-09-22 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=17370&c=7168963&h=T_7i3SKo1dKnn4wIZaEVRo8lJ-7DVXnExecHXc6FkCmjKNsw&_xt=.pdf,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=26087 +53348,E/2024/02/T/444,38.53,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-25 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=35140&c=7168963&h=8vXTUu1tIebsrsjKK1Z0SrjXPmcntZ-XvDFun5kuKKw_RvJG,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=53348 +53354,E/2024/02/T/492,94.54,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-28 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=35141&c=7168963&h=kvw5ofzCMp6fIbDTP9J21N1CB06OMF4sd5s14NT31Q9Kr7Bv,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=53354 +51119,E/2024/02/T/363,30,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-21 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=33742&c=7168963&h=QJcMQ-E_KsQrL3VeV9oI4DlbFYVZ8l3RA6kttnG3JUJd15L-,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=51119 +50871,E/2024/02/T/193,3.5,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-09 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=33643&c=7168963&h=8kkExEoJ_FJ5_5eTUzyML_7Xo4BQhSuRVzhjU5D_GOkC-J_2,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=50871 +50859,E/2024/02/T/190,3.5,,439,Chase Unlimited - 0434,Chase Unlimited - 9186,2024-02-12 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=33631&c=7168963&h=jHy0q7IZZaz1v7jQkDTlD1BhNnd9Wbzkl1nSpKvKEpL9vKEO,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=50859 +14055,E/2023/07/T/407,1497,1253.59,439,Chase Unlimited - 0434,,2023-07-26 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=9625&c=7168963&h=kxgSKUI1iaN_SblXxC_tMf70nZPkttife7fdDtsyemA4Dl89,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=14055 +14798,E/2023/08/T/114,735,534.57,439,Chase Unlimited - 0434,,2023-08-08 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=10144&c=7168963&h=5N5CwOVZ2ycX6QwXBbC0LMYYNRfgeNcwpvLJkFVFKf8skE0n,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=14798 +26304,E/2023/10/T/67,759.29,755.79,439,Chase Unlimited - 0434,,2023-10-04 00:00:00+00,,https://7168963.app.netsuite.com/core/media/media.nl?id=17506&c=7168963&h=iOBYCbgB9-1YQ1Gg1j8Bxjgiw2TcX5f1uyrWsmrpkRisAbLl,https://7168963.app.netsuite.com/app/accounting/transactions/cardchrg.nl?id=26304