<!-- Modal -->
{% if not userRestrictions is defined %}
{% set userRestrictions=''|getUserRestrictions %}
{% endif %}
<div class="modal fade" id="newExpenseModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
<div class="modal-dialog modal-lg" role="document">
<form class="form-horizontal addCreatedByDataForm expenseForm" method="post" action="{{ url('add_expense') }}"
enctype="multipart/form-data">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title" id="myModalLabel">Add New Expense</h4>
</div>
<div class="modal-body">
<div class="row clearfix">
<div class="col-md-6 col-sm-12">
<div class="form-group">
<label for="inputEmail3" class="col-sm-4 control-label">Documents</label>
<div class="col-sm-8">
<label class="btn btn-file ">
<label class="btn btn-file ">
<i class="fa fa-file"></i>
Upload Images/Documents
<input type="file" class="form-control exp_att_file" name="file[]"
placeholder="File"
id="sig_file"
multiple/>
</label>
</div>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-4 control-label">Expense Date</label>
<div class="col-sm-8">
<input name="expense_date" type="text" class="form-control add_basic_day_picker"
placeholder="Date" value="{{ ''|date('F d, Y') }}" style=""/>
</div>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-4 control-label">Expense Type</label>
<div class="col-sm-8">
<select
class="form-control selectize_me filter_by_this" name="expense_type"
id="expenseModalExpenseType">
{# {% for category in itemgroup %} #}
<option value="0">General</option>
<option value="1">Against Purchase
</option>
<option value="2">Against Sales/Project</option>
<option value="3">Against Sales Lead/Tender</option>
{# {% endfor %} #}
</select>
</div>
</div>
<div class="form-group" style="display: none;">
<label for="inputEmail3" class="col-sm-4 control-label">Record As</label>
{% set expSubTypes=''|getExpSubTypes %}
<div class="col-sm-8">
<select
class="form-control selectize_me" name="expense_sub_type">
{# {% for category in itemgroup %} #}
{% for g,d in expSubTypes %}
<option value="{{ g }}">{{ d.alias }}</option>
{% endfor %}
{# <option value="2">As Advance</option
> #}
{# <option value="3">As Loan</option
> #}
{# {% endfor %} #}
</select>
</div>
</div>
{# <div class="form-group"> #}
{# <label for="inputEmail3" class="col-sm-4 control-label">Expense Sub Type</label> #}
{# <div class="col-sm-8"> #}
{# <select class="form-control selectize_me" name="expense_sub_type"> #}
{# <option value="1">Food</option> #}
{# </select> #}
{# </div> #}
{# </div> #}
<div class="form-group">
<label for="inputEmail3" class="col-sm-4 control-label">Amount</label>
<div class="col-sm-8">
<input type="number" name="expense_amount" step="0.01" class="form-control"
id="expense_amount" placeholder="Amount"/>
</div>
</div>
<div class="form-group filter filter-1">
<label for="inputEmail3" class="col-sm-4 control-label">Advance Amount</label>
<div class="col-sm-8">
<input type="number" name="prev_advance_amount" step="0.01" class="form-control"
id="prev_advance_amount" placeholder="Amount" value="0"/>
</div>
</div>
<div class="form-group ">
<label for="inputEmail3" class="col-sm-4 control-label">Expense name and Cost
Centre</label>
<div
class="col-sm-8">
{# {% set head_list=''|GetParentLedgerHeads %} #}
{% set
exp_head_list=''|GetParentLedgerHeads('exp') %}
<select class="form-control selectize_me change_check_narration" name="expense_id"
id="expenseModalExpenseId">
{% for head in exp_head_list %}
<option value="{{ head['id'] }}">{{ head["text"] }}</option>
{% endfor %}
</select>
{% set cc_list=''|GetCostCenterHeads %}
<select class="form-control selectize_me " name="ccId">
<option value="">Select Cost Centre</option>
<option value="0">None</option>
{% for entry in cc_list %}
<option value="{{ entry.id }}">{{ entry.text }}
</option>
{% endfor %}
</select>
<input type="text" name="expense_to_note_0" class="form-control"
placeholder="Notes about this"/>
</div>
</div>
<div class="form-group filter filter-2">
<label for="inputEmail3" class="col-sm-4 control-label">Sales Order/Project</label>
<div class="col-sm-8">
{# {% set so_list=''|SoList %} #}
<select class="form-control change_check_narration soIdExp" name="soId"
id="expenseModalSoId">
{# {% for entry in so_list %} #}
{# <option value="{{ entry.salesorderId }}">{{ entry.documentHash }}</option> #}
{# {% endfor %} #}
</select>
<input type="text" name="expense_to_note_2" class="form-control"
placeholder="Notes about this"/>
</div>
</div>
<div class="form-group filter filter-3">
<label for="inputEmail3" class="col-sm-4 control-label">Lead/Bid</label>
<div class="col-sm-8">
{# {% set so_list=''|SoList %} #}
<select class="form-control change_check_narration leadIdExp" name="leadId"
id="expenseModalLeadId">
{# {% for entry in so_list %} #}
{# <option value="{{ entry.salesorderId }}">{{ entry.documentHash }}</option> #}
{# {% endfor %} #}
</select>
<input type="text" name="expense_to_note_3" class="form-control"
placeholder="Notes about this"/>
</div>
</div>
<div class="form-group filter filter-1">
<label for="inputEmail3" class="col-sm-4 control-label">Purchase Order</label>
<div class="col-sm-8">
{# {% set po_list=''|PoList %} #}
<select class="form-control change_check_narration poIdExp" name="poId"
id="expenseModalPoId">
</select>
<input type="text" name="expense_to_note_1" class="form-control"
placeholder="Notes about this"/>
</div>
</div>
<div class="form-group filter filter-1">
<label for="inputEmail3" class="col-sm-4 control-label">Invocation Strategy</label>
<div class="col-sm-8">
<select class="form-control selectize_me " name="expenseInvocationStrategyOnGrn">
<option value="1">Previous Received Product(s) if available (same Order)
</option>
<option value="2">Hold for next GRN</option>
</select>
</div>
</div>
<div class="form-group filter filter-1">
<label for="inputEmail3" class="col-sm-4 control-label">Invocation Type on Received
Items</label>
<div class="col-sm-8">
<select class="form-control selectize_me " name="expenseInvocationTypeOnItems">
<option value="1">Full on Received Products</option>
<option value="2">Weighted on PO amount</option>
</select>
</div>
</div>
<div class="form-group ">
<label for="inputEmail3" class="col-sm-4 control-label">Balance against head</label>
<div
class="col-sm-8">
{# {% set head_list='pv'|GetParentLedgerHeads('',0) %} #}
{% set
head_list='pv'|GetParentLedgerHeads('') %}
{# {{
dump(head_list.found_id)
}} #}
{# {{ dump(head_list.DEBIT_HEADS_BY_ID) }} #}
<select class="form-control expense_change_check_number expenseToBePaidTo childOnly"
name="expense_to_be_paid_to" id="expenseModalToBePaidTo">
{# <option value="">Select</option> #}
</select>
<input type="text" name="expense_from_note" class="form-control"
placeholder="Notes about this"/>
</div>
</div>
<div class="form-group" style="">
<label for="inputEmail3" class="col-sm-4 control-label">Pay From (optional)</label>
<div class="col-sm-8">
{% set head_list='pv'|GetParentLedgerHeads %}
<select class="form-control selectize_me expense_change_check_number"
name="expense_from"
id="expenseModalPayFrom">
<option value="">Select</option>
{% if head_list.CREDIT_HEADS is defined %}
{% for head in
head_list.CREDIT_HEADS %}
<option value="{{ head['id'] }}">{{ head["text"] }}</option>
{% endfor %}
{% endif %}
</select>
{# <input type="text" name="expense_from_note" class="form-control" placeholder="Notes about this"/> #}
</div>
</div>
<div class="form-group ">
<label for="inputEmail3" class="col-sm-4 control-label">Cheque No.</label>
<div class="col-sm-8">
<select name="check_id" class="form-control" id="expense_check_id"
></select>
</div>
</div>
<div class="form-group filter expense_check_number_div">
<label for="inputEmail3" class="col-sm-4 control-label">Check Date</label>
<div class="col-sm-8">
<input type="hidden" name="check_number" class="form-control"
id="expense_check_number_here"
placeholder=""/>
<input name="check_date" type="text" class="form-control add_basic_day_picker"
placeholder="Date" value="{{ ''|date('F d, Y') }}" style=""/>
</div>
</div>
<div class="form-group filter expense_check_number_div">
<label for="inputEmail3" class="col-sm-4 control-label">Check Narration</label>
<div class="col-sm-8">
<input type="text" name="check_narration" class="form-control"
id="expense_check_narration"
placeholder="Check Narration (default)" value=""/>
</div>
</div>
<div class="form-group filter filter-default filter-1">
<label for="inputEmail3" class="col-sm-4 control-label"></label>
<div class="col-sm-8">
<div class="checkbox checkbox-styled" bis_skin_checked="1">
<label>
<input type="checkbox" name="auto_balance_1" value="1"
id="exp_check_auto_balance"
checked>
<span>Automatically Balance Invoice and Order</span>
</label>
</div>
</div>
</div>
</div>
<div class="col-md-6 col-sm-12">
<div class="form-group filter filter-1">
<label for="inputEmail3" class="col-sm-4 control-label">Cost Distribution</label>
<div class="col-sm-8">
<div class="checkbox checkbox-styled" bis_skin_checked="1">
<label>
<input type="checkbox" name="exp_check_expense_distribution_on_product"
value="1" id="exp_check_expense_distribution_on_product">
<span>Distribute Expense Individually</span>
</label>
</div>
</div>
</div>
<div class="form-group exp_distribution_on_product_pre_div filter filter-1">
<label for="inputEmail3" class="col-sm-4 control-label">Product</label>
<div class="col-sm-4 ">%</div>
<div class="col-sm-4 ">Amount</div>
</div>
<div class="form-group exp_distribution_on_product_post_div filter filter-1">
<label for="inputEmail3" class="col-sm-4 control-label">Total</label>
<div class="col-sm-4 exp_total_distribution_percentage"></div>
<div class="col-sm-4 exp_total_distribution_amount"></div>
</div>
<div class="form-group ">
<label for="inputEmail3" class="col-sm-4 control-label">Description/Narration</label>
<div
class="col-sm-8 desc_cont">
<textarea name="description" class="form-control attach_ckeditor"
rows="2"></textarea>
</div>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">
Close
</button>
<button type="submit" class="btn btn-primary expenseModalSubmit">Save</button>
</div>
</div>
</form>
</div>
</div>
<style>
#newExpenseModal .form-control.selectize-control {
border-bottom: 1px solid rgba(12, 12, 12, 0.12);
height: auto;
max-height: 31px;
}
#newExpenseModal input.form-control {
font-size: 14px;
font-weight: bold;
padding-left: 12px;
}
#newExpenseModal .selectize-dropdown,
#newExpenseModal .selectize-input,
#newExpenseModal .selectize-input input {
color: #0c0c0c;
font-weight: bold;
font-size: 14px;
}
#newExpenseModal .selectize-input.not-full input {
/*color: #0c0c0c;*/
/*font-weight: normal;*/
/*font-size: 14px;*/
}
#newExpenseModal .selectize-input.has-items .item {
line-height: 1;
height: 14px;
overflow: hidden;
}
#newExpenseModal .selectize-input.has-items .item:hover {
overflow: visible;
}
/*#newExpenseModal .form-control.selectize-control:hover {*/
/* border-bottom: 1px solid rgba(12, 12, 12, 0.12);*/
/* height: auto;*/
/* max-height: unset !important;*/
/* min-height: 0px !important;*/
/*}*/
@media (min-width: 769px) {
#newExpenseModal .desc_cont {
padding-top: 5.5px;
}
}
</style>
<script>
var canSelectAnyHeadForExpenseBalancing ={{ userRestrictions.canSelectAnyHeadForExpenseBalancing is defined?userRestrictions.canSelectAnyHeadForExpenseBalancing:1 }}
var newExpenseModalSystem =
{
modalMode: 'standalone', //or edit
soSelector: {},
leadSelector: {},
checkSelector: {},
poSelector: {},
soData: {},
leadData: {},
checkData: {},
poData: {},
toBeBalancedFromSelector: {},
headSelector: {},
toBeBalancedFromSelectorFilterGenerator: function () {
if ($('#expenseModalExpenseType').val() == 1) //purchase
{
var markers = [
'_ALL_',
// '_CASP_',
// '_NCASP_',
// '_CLP_',
// '_NCLP_',
// '_SPAH_',
// '_SPAH_',
]
return markers.join(',')
} else if ($('#expenseModalExpenseType').val() == 2) //sales
{
var markers = [
'_ALL_',
// '_CASP_',
// '_CLP_',
// '_NCLP_',
// // '_NCASP_',
// '_SPAH_',
// '_IPAH_',
]
return markers.join(',')
} else {
var markers = [
'_ALL_',
// '_CASP_',
// // '_NCASP_',
// '_CLP_',
// '_NCLP_',
// '_SPAH_',
// '_IPAH_',
]
return markers.join(',')
}
},
refreshDistributedProductListForExpenseBalancing: function () {
$('.exp_distribution_row').remove();
// alert('here')
if (newExpenseModalSystem.poSelector.getValue() == '')
newExpenseModalSystem.distributedProductAmountTotalRecalculate();
else if ($('#exp_check_expense_distribution_on_product').prop('checked') == true) {
var pika_ind_id = '_NONE_'
$.ajax({
url: BaseURL + "select_data_ajax",
type: 'POST',
dataType: 'json',
// render: {
// option: function (item, escape) {
// return '<div class="p-l-10 p-r-10">'
// + '<h6> #'+escape(item[value])+' ' + escape(item[document_hash]) + ' -- '+ escape(item[lc_number])+'</h6> '
// + '<span>Supplier:' + escape(item[supplier_name]) + '</span> '
// //+ '<span>Name:'+item.name+'</span> '
// //+ '<span>DEBUG:'+item.score+'</span>'
// + '</div>';
// }
// },
data: {
//returnJson: 1,
//sessionData: sessionData
query: '_EMPTY_',
tableName: "purchase_order_item",
valueField: "id",
textField: "rendered_text",
entity_group: 0,
selectorId: '_NONE_',
isMultiple: 0,
dataId: pika_ind_id,
//
renderTextFormat: "#__product_name__ ",
andConditions: [],
andOrConditions: [
// // {type: "=", field: "supplier_id", value: isNaN(query) ? '' : query},
// {type: "=", field: "purchase_order_id", value: isNaN(query) ? '' : query},
// {type: "like", field: "document_hash", value: query},
// {type: "like", field: "acc_suppliers_0.supplier_name", value: query},
// {type: "like", field: "lc_number", value: query},
],
mustConditions: [
{
type: "=",
field: "purchase_order_id",
value: newExpenseModalSystem.poSelector.getValue()
},
],
joinTableData: [
{
tableName: "inv_products",
joinFieldPrimary: "product_id",
joinOn: 'id',
tableJoinType: 'left join',
// fieldJoinType: '=',
selectPrefix: 'product_',
selectFieldList: [
'name'
]
},
{
tableName: "acc_service",
joinFieldPrimary: "service_id",
joinOn: 'service_id',
tableJoinType: 'left join',
// fieldJoinType: '=',
// selectPrefix: 'supplier_',
selectFieldList: [
'service_name'
]
},
],
convertToObject: [
// 'accessories', 'issues'
],
skipDefaultCompanyId: 1
// setDataForSingle: 1,
},
error: function () {
// callback();
},
success: function (res) {
for (var exp_j = 0; exp_j < res.data.length; exp_j++) {
var productName = res.data[exp_j].product_name;
var poItemId = res.data[exp_j].id;
var toAddStr = '<div class="form-group filter exp_distribution_row">' +
'<label for="inputEmail3" class="col-sm-4 control-label">' + productName + '</label>' +
'<div class="col-sm-4">' +
'<input type="number" ' +
'name="exp_distribution_percentage[]" ' +
'class="form-control exp_distribution_percentage exp_distribution_percentage' + poItemId + '" ' +
'data-id="' + poItemId + '"' +
'id="exp_distribution_percentage' + poItemId + '" ' +
'value=""/>' +
'</div>' +
'<div class="col-sm-4">' +
'<input type="hidden" ' +
'name="exp_distribution_poitemId[]" ' +
'class="form-control exp_distribution_poitemId exp_distribution_poitemId' + poItemId + '" ' +
'data-id="' + poItemId + '"' +
'id="exp_distribution_poitemId' + poItemId + '" ' +
'value="' + poItemId + '"/>' +
'<input type="number" ' +
'name="exp_distribution_amount[]" ' +
'class="form-control exp_distribution_amount exp_distribution_amount' + poItemId + '" ' +
'data-id="' + poItemId + '"' +
'id="exp_distribution_amount' + poItemId + '" ' +
'value=""/>' +
'</div>' +
'</div>';
$('.exp_distribution_on_product_pre_div').after(toAddStr);
}
newExpenseModalSystem.distributedProductAmountTotalRecalculate();
}
});
} else
newExpenseModalSystem.distributedProductAmountTotalRecalculate();
},
distributedProductAmountTotalRecalculate: function (changeExpAmount) {
changeExpAmount = changeExpAmount || 0
var total_distribution_percentage = 0;
var total_distribution_amount = 0;
$('.exp_distribution_percentage').each(function (ind_exp, elem) {
if (elem.val() != '')
total_distribution_percentage += (1 * elem.val());
})
$('.exp_distribution_amount').each(function (ind_exp, elem) {
if (elem.val() != '')
total_distribution_amount += (1 * elem.val());
})
$('.exp_total_distribution_amount').text(total_distribution_amount.toFixed(2));
if (changeExpAmount == 1)
$('#expense_amount').val(total_distribution_amount.toFixed(2));
$('.exp_total_distribution_percentage').text(total_distribution_percentage.toFixed(2));
},
checkAndAddExpenseDataToList: function () {
var validated = true;
if (validated == true)
addExpenseRow();
},
triggerExpenseModal: function (config) {
config = config || {
soItemFound: 0,
soItemDelivered: 0,
id: 0,
alias: '',
note: '',
unit: 0,
warranty: 0,
unitTypeId: 0,
unit_price: 0,
fdm: '',
product_name: '',
soItemId: 0,
total_price: 0,
isForeignItem: isForeignItem,
isSegment: isSegment,
};
var dataRow =
{
currencyId: 0,
currencyMultiplyRate: 1,
currencyText: '',
scope: '', //scope type 0/null/1 is own 2: V3endor 3:entity 4 :others
scopeHolderId: '', //Supplier Id or APp Id
scopeHolderName: '', //
scopeDescription: '', //
}
$.each(config, function (key, valueObj) {
dataRow[key] = valueObj;
});
// if (typeof dataRow.isSegment !== 'undefined')
// isSegment = dataRow.isSegment;
///populate data here
//then trigger modal
$('#newExpenseModal').modal('show');
},
}
const toBase64 = file => new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = reject;
});
// function toDataURL(url, callback) {
// var xhr = new XMLHttpRequest();
// xhr.onload = function() {
// var reader = new FileReader();
// reader.onloadend = function() {
// callback(reader.result);
// }
// reader.readAsDataURL(xhr.response);
// };
// xhr.open('GET', url);
// xhr.responseType = 'blob';
// xhr.send();
// }
//
// toDataURL('https://www.gravatar.com/avatar/d50c83cc0c6523b4d3f6085295c953e0', function(dataUrl) {
// console.log('RESULT:', dataUrl)
// })
const edenAiUrl = "https://api.edenai.run/v2/workflow/4261f761-07b5-4ee3-b81e-a55733a81e8c/execution/";
const edenAiUrlDirect = "https://api.edenai.run/v2/ocr/financial_parser";
const edenApiKey = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNDIwZTEwNDktOTFjNC00YzZhLWJhNjEtZDk3MDhjZWI4MjFjIiwidHlwZSI6ImFwaV90b2tlbiJ9.IXXp0DsFHyCrtkY0Ck1M9CQkXH8ZxCOfVs4lpHhOy2s"; // Replace with your actual API key
var executionDetailsUrl = '';
var edenAiExecutionId = 0;
var edenAiRowIdByExecutionId = {};
var parseDataPending = [
//{rowId :1,filepath:''}
];
var exp_head_list ={{ exp_head_list|json_encode|raw }};
function nextParseOcr() {
if (parseDataPending.length > 0) {
initiateOcr()
}
}
function initiateOcr(selectorId, fileIndex, refRowId, fileUrl) {
refRowId = refRowId || '_NONE_';
fileIndex = fileIndex || 0;
fileUrl = fileUrl || '';
fileUrl = '{{ absolute_url(path('dashboard')) }}' + parseDataPending[0]['filePath']
const options = {
method: 'POST',
headers: {
accept: 'application/json',
'content-type': 'application/json',
authorization: `Bearer ${edenApiKey}`
},
body: JSON.stringify({
response_as_dict: false,
attributes_as_list: false,
show_base_64: false,
show_original_response: false,
document_type: 'invoice',
convert_to_pdf: false,
file_url: fileUrl,
// providers: ['google'],
providers: ['amazon'],
language: 'en'
})
};
// const payload = { file: fileData }; // Replace with actual file data
fetch('https://api.edenai.run/v2/ocr/financial_parser', options)
.then(res => res.json())
.then(res => {
console.log(res)
if (newExpenseModalSystem.modalMode == 'standalone') {
$('#newExpenseModal .trigger_ckeditor').html(
'<p><b>Merchant Name:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.name + '</p>' +
'<p><b>Merchant Address:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.address + '</p>' +
'<p><b>Merchant Phone:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.phone + '</p>'
);
$('#newExpenseModal textarea').val(
'<p><b>Merchant Name:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.name + '</p>' +
'<p><b>Merchant Address:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.address + '</p>' +
'<p><b>Merchant Phone:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.phone + '</p>'
);
$('#newExpenseModal #expense_amount').val(
1 * (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].payment_information.amount_due) +
1 * (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].payment_information.total_tax)
)
if (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].document_metadata.document_type == 'restaurant_statement') {
for (var hopo = 0; hopo < exp_head_list.length; hopo++) {
if ((exp_head_list[hopo]['text']).search(/food/i) != -1) {
newExpenseModalSystem.headSelector.setValue(exp_head_list[hopo]['id'])
}
}
}
} else {
if (parseDataPending.length > 0) {
populateExpRowBasedOnOcr(res[0].extracted_data[0], parseDataPending[0]['rowId'])
parseDataPending.shift(); // removes the first element, which is 1
}
if (parseDataPending.length > 0) {
nextParseOcr()
// console.log(parseDataPending);
}
}
})
.catch(err => console.error(err));
}
function parseOcr(ffEdenAiExecutionId) {
// const payload = { file: fileData }; // Replace with actual file data
(async () => {
try {
const ggExecutionDetailsUrl = `https://api.edenai.run/v2/workflow/4261f761-07b5-4ee3-b81e-a55733a81e8c/execution/${ffEdenAiExecutionId}/`
const detailsResponse = await fetch(ggExecutionDetailsUrl, {
headers: {
"Content-Type": "application/json",
// 'Authorization': `Bearer ${edenApiKey}`
'Authorization': `Bearer ${edenApiKey}`
},
});
const executionData = await detailsResponse.json();
// Process the execution details (detailsData) here
console.log(executionData);
var ggEdenAiExecutionId = executionData.id;
if (typeof executionData.content !== 'undefined') {
if (executionData.content.status == 'running') {
setTimeout(function () {
parseOcr(ggEdenAiExecutionId);
}, 2000);
} else if (executionData.content.status == 'success') {
if (newExpenseModalSystem.modalMode == 'standalone') {
$('#newExpenseModal .trigger_ckeditor').html(
'<p><b>Merchant Name:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.name + '</p>' +
'<p><b>Merchant Address:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.address + '</p>' +
'<p><b>Merchant Phone:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.phone + '</p>'
);
$('#newExpenseModal textarea').val(
'<p><b>Merchant Name:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.name + '</p>' +
'<p><b>Merchant Address:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.address + '</p>' +
'<p><b>Merchant Phone:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.phone + '</p>'
);
$('#newExpenseModal #expense_amount').val(
1 * (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].payment_information.amount_due) +
1 * (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].payment_information.total_tax)
)
if (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].document_metadata.document_type == 'restaurant_statement') {
for (var hopo = 0; hopo < exp_head_list.length; hopo++) {
if ((exp_head_list[hopo]['text']).search(/food/i) != -1) {
newExpenseModalSystem.headSelector.setValue(exp_head_list[hopo]['id'])
}
}
}
} else {
populateExpRowBasedOnOcr(executionData.content.results.ocr__financial_parser.results[0].extracted_data[0], ggEdenAiExecutionId)
}
} else {
}
}
} catch (error) {
console.error("Error:", error);
}
})();
}
function initiateOcrBackup(selectorId, fileIndex, refRowId, fileUrl) {
refRowId = refRowId || '_NONE_';
fileIndex = fileIndex || 0;
fileUrl = fileUrl || '';
// const payload = { file: fileData }; // Replace with actual file data
(async () => {
try {
const options = {
method: 'POST',
headers: {
accept: 'application/json',
'content-type': 'application/json',
authorization: `Bearer ${edenApiKey}`
},
body: JSON.stringify({
response_as_dict: false,
document_type: 'auto-detect',
file_url: fileUrl,
language: 'en'
})
};
// const options = {
// method: 'POST',
// headers: {
// accept: 'application/json',
// 'content-type': 'application/json',
// authorization: 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiNDIwZTEwNDktOTFjNC00YzZhLWJhNjEtZDk3MDhjZWI4MjFjIiwidHlwZSI6ImFwaV90b2tlbiJ9.IXXp0DsFHyCrtkY0Ck1M9CQkXH8ZxCOfVs4lpHhOy2s'
// },
// body: JSON.stringify({
// response_as_dict: true,
// attributes_as_list: false,
// show_base_64: true,
// show_original_response: false,
// document_type: 'invoice',
// convert_to_pdf: false,
// file_url: 'https://www.ourhoneybee.xyz/uploads/ExpenseInvoice/dc561ca5db4b674f67dacf5eb523832d.png',
// providers: ['google'],
// language: 'en'
// })
// };
//
// fetch('https://api.edenai.run/v2/ocr/financial_parser', options)
// .then(res => res.json())
// .then(res => console.log(res))
// .catch(err => console.error(err));
console.log(fileUrl)
const responseInit = await fetch(edenAiUrl, options);
// //formdata_start
//
// const formData = new FormData();
// // formData.append('file', document.getElementById(selectorId).files[fileIndex]);
// formData.append('refRowId', refRowId);
// formData.append('file_url', fileUrl);
// formData.append('language', 'en');
//
// console.log(fileUrl)
//
// const headers = {
// 'Authorization': `Bearer ${edenApiKey}`
// };
//
// const responseInit = await fetch(edenAiUrl, {
// method: 'POST',
// headers: headers,
// body: formData
// });
//
// //form_data_end
const executionData = await responseInit.json();
console.log(executionData)
// Retrieve the execution ID from the response data
edenAiExecutionId = executionData.id;
var ggEdenAiExecutionId = executionData.id;
edenAiRowIdByExecutionId[edenAiExecutionId] = refRowId;
executionDetailsUrl = `https://api.edenai.run/v2/workflow/4261f761-07b5-4ee3-b81e-a55733a81e8c/execution/${edenAiExecutionId}/`
if (typeof executionData.content !== 'undefined') {
if (executionData.content.status == 'running') {
setTimeout(function () {
parseOcr(ggEdenAiExecutionId);
}, 2000);
} else if (executionData.content.status == 'success') {
if (newExpenseModalSystem.modalMode == 'standalone') {
$('#newExpenseModal .trigger_ckeditor').html(
'<p><b>Merchant Name:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.name + '</p>' +
'<p><b>Merchant Address:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.address + '</p>' +
'<p><b>Merchant Phone:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.phone + '</p>'
);
$('#newExpenseModal textarea').val(
'<p><b>Merchant Name:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.name + '</p>' +
'<p><b>Merchant Address:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.address + '</p>' +
'<p><b>Merchant Phone:</b> ' + executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].merchant_information.phone + '</p>'
);
$('#newExpenseModal #expense_amount').val(
1 * (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].payment_information.amount_due) +
1 * (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].payment_information.total_tax)
)
if (executionData.content.results.ocr__financial_parser.results[0].extracted_data[0].document_metadata.document_type == 'restaurant_statement') {
for (var hopo = 0; hopo < exp_head_list.length; hopo++) {
if ((exp_head_list[hopo]['text']).search(/food/i) != -1) {
newExpenseModalSystem.headSelector.setValue(exp_head_list[hopo]['id'])
}
}
}
} else {
populateExpRowBasedOnOcr(executionData.content.results.ocr__financial_parser.results[0].extracted_data[0], ggEdenAiExecutionId)
}
} else {
}
}
} catch (error) {
console.error("Error:", error);
}
})();
}
async function triggerOcr(selectorIdWithHash) {
const file = document.querySelector(selectorIdWithHash).files[0];
const base64String = await toBase64(file);
// Now you can use the base64String
console.log(base64String);
initiateOcr(base64String)
}
$(document).ready(function () {
newExpenseModalSystem.soSelector = $('#newExpenseModal .soIdExp').selectize({
placeholder: 'Choose a project or Order',
multiple: false,
// options: APTL.productListArray,
options: [],
valueField: 'value',
labelField: 'text',
preload: 'focus',
searchField: ['text', 'value'],
load: function (query, callback) {
// if (!query.length) return // callback();
if (!query.length) query = '_EMPTY_';
var pika_ind_id = $($(this)[0].$input["0"]).attr('data-id')
$.ajax({
url: BaseURL + "select_data_ajax",
type: 'POST',
dataType: 'json',
data: {
//returnJson: 1,
//sessionData: sessionData
query: query,
tableName: "sales_order",
valueField: "sales_order_id",
textField: "rendered_text",
entity_group: 0,
selectorId: $($(this)[0].$input["0"]).attr('id'),
isMultiple: 0,
dataId: pika_ind_id,
// isMultiple: 0,
//textField: "rendered_text",
//
renderTextFormat: "#__value__ __document_hash__ ( __client_name__ ) - __project_name__",
andConditions: [],
andOrConditions: [
{type: "=", field: "approved", value: 1},
],
mustConditions: [
{type: "=", field: "approved", value: 1},
],
joinTableData: [
{
tableName: "project",
joinFieldPrimary: "project_id",
joinOn: 'project_id',
tableJoinType: 'left join',
// fieldJoinType: '=',
// selectPrefix: '',
selectFieldList: [
'project_name', 'sales_project_asset_head_id', 'internal_project_asset_head_id'
]
},
{
tableName: "acc_clients",
joinFieldPrimary: "client_id",
joinOn: 'client_id',
tableJoinType: 'join',
// fieldJoinType: '=',
// selectPrefix: 'client_',
selectFieldList: [
'client_name'
]
},
],
convertToObject: [
// 'accessories', 'issues'
],
skipDefaultCompanyId: 1,
itemLimit: '_ALL_'
// setDataForSingle: 1,
},
error: function () {
// callback();
},
success: function (res) {
newExpenseModalSystem.soData = res.dataById
callback(res.data);
if (res.setValueArray.length != 0 && res.selectorId != '') {
if (res.isMultiple == 1)
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValueArray)
else
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValue)
}
// alert('pika master')
}
});
},
onChange: function (value) {
// alert(value )
// newExpenseModalSystem.toBeBalancedFromSelector.setValue('')
// if(!value.length)return;
//// alert(newExpenseModalSystem.soData[value].sales_project_asset_head_id )
// if(newExpenseModalSystem.soData[value].sales_project_asset_head_id !=null && newExpenseModalSystem.soData[value].sales_project_asset_head_id !='') {
//// alert('here')
// populateAndSetSelectByAjaxSelector(newExpenseModalSystem.toBeBalancedFromSelector, [newExpenseModalSystem.soData[value].sales_project_asset_head_id])
// }
// else if(newExpenseModalSystem.soData[value].internal_project_asset_head_id !=null && newExpenseModalSystem.soData[value].internal_project_asset_head_id !='')
// populateAndSetSelectByAjaxSelector(newExpenseModalSystem.toBeBalancedFromSelector, [newExpenseModalSystem.soData[value].internal_project_asset_head_id]);
}
})[0].selectize;
newExpenseModalSystem.leadSelector = $('#newExpenseModal .leadIdExp').selectize({
placeholder: 'Choose a Lead/Bid/tender',
multiple: false,
// options: APTL.productListArray,
options: [],
valueField: 'value',
labelField: 'text',
preload: 'focus',
searchField: ['text', 'value'],
load: function (query, callback) {
// if (!query.length) return // callback();
if (!query.length) query = '_EMPTY_';
var pika_ind_id = $($(this)[0].$input["0"]).attr('data-id')
$.ajax({
url: BaseURL + "select_data_ajax",
type: 'POST',
dataType: 'json',
data: {
//returnJson: 1,
//sessionData: sessionData
query: query,
tableName: "sales_lead",
valueField: "lead_id",
textField: "rendered_text",
entity_group: 0,
selectorId: $($(this)[0].$input["0"]).attr('id'),
isMultiple: 0,
dataId: pika_ind_id,
// isMultiple: 0,
//textField: "rendered_text",
//
renderTextFormat: "#__value__ __document_hash__ - Bid: __bid_number__",
andConditions: [],
andOrConditions: [
{type: "=", field: "approved", value: 1},
],
mustConditions: [
{type: "=", field: "approved", value: 1},
],
joinTableData: [
//
// {
// tableName: "project",
// joinFieldPrimary: "project_id",
// joinOn: 'project_id',
// tableJoinType: 'left join',
// // fieldJoinType: '=',
// // selectPrefix: '',
// selectFieldList: [
// 'project_name', 'sales_project_asset_head_id', 'internal_project_asset_head_id'
//
// ]
// },
//
// {
// tableName: "acc_clients",
// joinFieldPrimary: "client_id",
// joinOn: 'client_id',
// tableJoinType: 'join',
// // fieldJoinType: '=',
// // selectPrefix: 'client_',
// selectFieldList: [
// 'client_name'
//
// ]
// },
],
convertToObject: [
// 'accessories', 'issues'
],
skipDefaultCompanyId: 1,
itemLimit: '_ALL_'
// setDataForSingle: 1,
},
error: function () {
// callback();
},
success: function (res) {
newExpenseModalSystem.leadData = res.dataById
callback(res.data);
if (res.setValueArray.length != 0 && res.selectorId != '') {
if (res.isMultiple == 1)
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValueArray)
else
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValue)
}
// alert('pika master')
}
});
},
onChange: function (value) {
// alert(value )
// newExpenseModalSystem.toBeBalancedFromSelector.setValue('')
// if(!value.length)return;
//// alert(newExpenseModalSystem.soData[value].sales_project_asset_head_id )
// if(newExpenseModalSystem.soData[value].sales_project_asset_head_id !=null && newExpenseModalSystem.soData[value].sales_project_asset_head_id !='') {
//// alert('here')
// populateAndSetSelectByAjaxSelector(newExpenseModalSystem.toBeBalancedFromSelector, [newExpenseModalSystem.soData[value].sales_project_asset_head_id])
// }
// else if(newExpenseModalSystem.soData[value].internal_project_asset_head_id !=null && newExpenseModalSystem.soData[value].internal_project_asset_head_id !='')
// populateAndSetSelectByAjaxSelector(newExpenseModalSystem.toBeBalancedFromSelector, [newExpenseModalSystem.soData[value].internal_project_asset_head_id]);
}
})[0].selectize;
newExpenseModalSystem.modalMode = typeof expenseModalMode !== 'undefined' ? expenseModalMode : 'standalone';
newExpenseModalSystem.poSelector = $('#newExpenseModal .poIdExp').selectize({
placeholder: 'Choose an Order',
multiple: false,
// options: APTL.productListArray,
options: [],
valueField: 'value',
labelField: 'text',
preload: 'focus',
searchField: ['text', 'value', 'lc_number', 'supplier_name'],
load: function (query, callback) {
// if (!query.length) return // callback();
if (!query.length) query = '_EMPTY_';
var pika_ind_id = $($(this)[0].$input["0"]).attr('data-id')
$.ajax({
url: BaseURL + "select_data_ajax",
type: 'POST',
dataType: 'json',
// render: {
// option: function (item, escape) {
// return '<div class="p-l-10 p-r-10">'
// + '<h6> #'+escape(item[value])+' ' + escape(item[document_hash]) + ' -- '+ escape(item[lc_number])+'</h6> '
// + '<span>Supplier:' + escape(item[supplier_name]) + '</span> '
// //+ '<span>Name:'+item.name+'</span> '
// //+ '<span>DEBUG:'+item.score+'</span>'
// + '</div>';
// }
// },
data: {
//returnJson: 1,
//sessionData: sessionData
query: query,
tableName: "purchase_order",
valueField: "purchase_order_id",
textField: "rendered_text",
entity_group: 0,
selectorId: $($(this)[0].$input["0"]).attr('id'),
isMultiple: 0,
dataId: pika_ind_id,
//
renderTextFormat: "#__value__ __document_hash__ ( __supplier_name__ ) -- __lc_number__",
andConditions: [],
andOrConditions: [
// {type: "=", field: "supplier_id", value: isNaN(query) ? '' : query},
{type: "=", field: "purchase_order_id", value: isNaN(query) ? '' : query},
{type: "like", field: "document_hash", value: query},
{type: "like", field: "acc_suppliers_0.supplier_name", value: query},
{type: "like", field: "lc_number", value: query},
],
mustConditions: [
{type: "=", field: "approved", value: 1},
],
joinTableData: [
{
tableName: "acc_suppliers",
joinFieldPrimary: "supplier_id",
joinOn: 'supplier_id',
tableJoinType: 'left join',
// fieldJoinType: '=',
// selectPrefix: 'supplier_',
selectFieldList: [
'supplier_name'
]
},
],
convertToObject: [
// 'accessories', 'issues'
],
skipDefaultCompanyId: 1
// setDataForSingle: 1,
},
error: function () {
// callback();
},
success: function (res) {
callback(res.data);
if (res.setValueArray.length != 0 && res.selectorId != '') {
if (res.isMultiple == 1)
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValueArray)
else
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValue)
}
// alert('pika master')
}
});
},
onChange: function (value) {
newExpenseModalSystem.refreshDistributedProductListForExpenseBalancing()
}
})[0].selectize;
newExpenseModalSystem.headSelector = $('#newExpenseModal #expenseModalExpenseId').selectize({})[0].selectize;
$(document).on('change', '#exp_check_expense_distribution_on_product', function () {
newExpenseModalSystem.refreshDistributedProductListForExpenseBalancing();
});
$(document).on('change', '.exp_distribution_percentage', function () {
var this_data_id = $(this).data('id');
if ($(this).val() == '') $(this).val(0)
if ($('#expense_amount').val() == '') $('#expense_amount').val(0)
$('.exp_distribution_amount' + this_data_id).val(($('#expense_amount').val() * $(this).val() / 100).toFixed(2));
newExpenseModalSystem.distributedProductAmountTotalRecalculate();
})
$(document).on('change', '.exp_distribution_amount', function () {
var this_data_id = $(this).data('id');
if ($(this).val() == '') $(this).val(0)
if ($('#expense_amount').val() == '') $('#expense_amount').val(0)
if ($('#expense_amount').val() != 0)
$('.exp_distribution_percentage' + this_data_id).val((($(this).val() * 100) / ($('#expense_amount').val())).toFixed(2));
else
$('.exp_distribution_percentage' + this_data_id).val((0).toFixed(2));
newExpenseModalSystem.distributedProductAmountTotalRecalculate(1);
})
if (canSelectAnyHeadForExpenseBalancing == 1) {
newExpenseModalSystem.toBeBalancedFromSelector = update_head_selectors('#newExpenseModal .expenseToBePaidTo', {
markerHash: newExpenseModalSystem.toBeBalancedFromSelectorFilterGenerator(),
// markerHash: '_AEMP_',
// renderText: '#__value__ - __name__ ',
// markerHashStrictMatch: 1
}, 1);
} else {
newExpenseModalSystem.toBeBalancedFromSelector = $('#newExpenseModal .expenseToBePaidTo').selectize({
placeholder: 'Choose a Head',
multiple: false,
// options: APTL.productListArray,
options: [
{
value: -1,
text: 'My General Head',
},
{
value: -2,
text: 'My Advance',
}
],
valueField: 'value',
labelField: 'text',
preload: 'focus',
searchField: ['text', 'value'],
onChange: function (value) {
}
})[0].selectize;
newExpenseModalSystem.toBeBalancedFromSelector.setValue(-2)
}
newExpenseModalSystem.checkSelector = $('#newExpenseModal #expense_check_id').selectize({
placeholder: 'Choose a Cheque',
multiple: false,
// options: APTL.productListArray,
options: [],
valueField: 'value',
labelField: 'text',
preload: 'focus',
searchField: ['text', 'value'],
load: function (query, callback) {
// if (!query.length) return // callback();
if (!query.length) query = '_EMPTY_';
var pika_ind_id = $($(this)[0].$input["0"]).attr('data-id')
$.ajax({
url: BaseURL + "select_data_ajax",
type: 'POST',
dataType: 'json',
data: {
//returnJson: 1,
//sessionData: sessionData
query: query,
tableName: "acc_check",
valueField: "check_id",
// textField: "check_number",
entity_group: 0,
selectorId: $($(this)[0].$input["0"]).attr('id'),
isMultiple: 0,
dataId: pika_ind_id,
// isMultiple: 0,
textField: "rendered_text",
//
renderTextFormat: "__acc_number__ -- __check_number__ ",
andConditions: [],
andOrConditions: [
// {type: "=", field: "accounts_head_id", value: },
{type: "like", field: "check_number", value: query},
{type: "like", field: "acc_number", value: query},
],
mustConditions: [
{type: "!=", field: "assigned", value: 1},
{
type: "in",
field: "accounts_head_id",
value: [($('#expenseModalPayFrom').val() == '' ? 0 : $('#expenseModalPayFrom').val()), ($('#expenseModalToBePaidTo').val() == '' ? 0 : $('#expenseModalToBePaidTo').val())]
},
// {type: "not_in", field: "accounts_head_id", value: [0,'null']},
],
orderByConditions: [ //sequential
{
field: 'check_id',
// fieldValues: [5,6,9],
sortType: 'ASC'
}
],
joinTableData: [
{
tableName: "acc_accounts_head",
joinFieldPrimary: "accounts_head_id",
joinOn: 'accounts_head_id',
tableJoinType: 'left join',
// fieldJoinType: '=',
selectPrefix: 'check_head_',
selectFieldList: [
'name', 'accounts_head_id'
]
},
],
convertToObject: [
// 'accessories', 'issues'
],
skipDefaultCompanyId: 1
// setDataForSingle: 1,
},
error: function () {
// callback();
},
success: function (res) {
newExpenseModalSystem.checkData = res.dataById
callback(res.data);
if (res.setValueArray.length != 0 && res.selectorId != '') {
if (res.isMultiple == 1)
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValueArray)
else
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.setValue)
} else if (res.data.length > 0) {
$('#' + res.selectorId).selectize()[0].selectize.setValue(res.data[0].value)
}
// alert('pika master')
}
});
},
onChange: function (value) {
if (!value.length) {
$('#expense_check_number_here').val('');
// $('#expense_check_id').val('');
$('.expense_check_number_div').hide();
}
$('#expense_check_number_here').val(newExpenseModalSystem.checkData[value].check_number);
$('.expense_check_number_div').show();
}
})[0].selectize;
if (newExpenseModalSystem.modalMode == 'standalone') {
$('.expense_change_check_number').change(function () {
populateAndSetSelectByAjaxSelector(newExpenseModalSystem.checkSelector, '_ALL_')
})
var expenseOptions = {
beforeSubmit: function (arr, $form, options) {
$('.expenseForm').prepend(' <div class="form_ongoing_submit"></div>');
},
success: showResponsExpense // post-submit callback
};
function showResponsExpense(responseText, statusText, xhr, $form) {
if (statusText == 'success') {
if (responseText.success == true) {
alertify.alert('Successfully Added The Expense. Document Name: ' + responseText.docHash);
alertify.success("Expense Added");
} else {
alertify.alert('Action Failed');
alertify.error("Could not Add the Expense");
addCreateConfirmed = 0;
}
} else {
alertify.alert('No response from server');
alertify.error("Could not Add the Expense");
addCreateConfirmed = 0;
}
$('.expenseForm .form_ongoing_submit').remove();
// alert('status: ' + statusText + '\n\nresponseText: \n' + responseText +
// '\n\nThe output div should have already been updated with the responseText.');
// // console.log('status: ' + statusText + '\n\nresponseText: \n' + responseText +
// '\n\nThe output div should have already been updated with the responseText.');
}
$('.expenseForm').ajaxForm(expenseOptions);
$('.expenseModalSubmit').click(function (e) {
e.preventDefault();
if (!$('.expenseForm .form_ongoing_submit').length) {
$('.expenseForm').submit()
}
});
} else {
$('.expenseModalSubmit').click(function (e) {
e.preventDefault();
newExpenseModalSystem.checkAndAddExpenseDataToList();
});
}
$(document).on('click', '.triggerEditExpenseModal', function (e) {
e.preventDefault();
var this_data_row_id = $(this).data('rowId')
var dataRow = {}
newExpenseModalSystem.triggerExpenseModal(dataRow);
});
$('.filter').hide();
$('.filter-default').show();
$('.filter_by_this').change(function () { // alert('here')
var filter_ind = $(this).val()
$('.filter').hide();
$('.filter-' + filter_ind).show();
})
$('.exp_att_file').change(function () {
// triggerOcr('#'+$(this).attr('id'))
if (BUDDYBEE_COIN_BALANCE >= 1)
initiateOcr($(this).attr('id'))
});
});
</script>