Skip to content

Instantly share code, notes, and snippets.

@monroy95
Created December 21, 2017 19:16
Show Gist options
  • Save monroy95/e795482c6bf43d9cd1567f6da7b2ed97 to your computer and use it in GitHub Desktop.
Save monroy95/e795482c6bf43d9cd1567f6da7b2ed97 to your computer and use it in GitHub Desktop.
calculations_tax_gt = function(frm, cdt, cdn) {
var this_row_qty, this_row_rate, this_row_amount, this_row_conversion_factor, this_row_stock_qty, this_row_tax_rate, this_row_tax_amount;
var net_fuel_tally = 0;
var net_goods_tally = 0;
var net_services_tally = 0;
var sales_tax_temp;
frm.doc.items.forEach((item_row, index) => {
if (item_row.name == cdn) {
console.log('Se encuentra en el indice: ' + index)
// if (index == 0) {
this_row_qty = item_row.qty;
this_row_rate = item_row.rate;
this_row_amount = (item_row.qty * item_row.rate);
this_row_conversion_factor = item_row.conversion_factor;
this_row_stock_qty = (item_row.qty * item_row.conversion_factor);
this_row_tax_rate = (item_row.tax_rate_per_uom);
this_row_tax_amount = (this_row_stock_qty * this_row_tax_rate);
this_row_taxable_amount = (this_row_amount - this_row_tax_amount);
// console.log("El campo qty es ahora de esta fila contiene: " + this_row_qty);
// console.log("El campo rate es ahora de esta fila contiene: " + this_row_rate);
// console.log("El campo conversion_factor de esta fila contiene: " + this_row_conversion_factor);
// console.log("El campo stock_qty de esta fila contiene: " + this_row_stock_qty);
// console.log("El campo tax_rate de esta fila contiene: " + this_row_tax_rate);
// console.log("El campo tax_amount de esta fila contiene: " + this_row_tax_amount);
// console.log("El campo taxable_amount de esta fila contiene: " + this_row_taxable_amount);
//frm.doc.items[index].other_tax_amount = Number(this_row_tax_rate * this_row_stock_qty);
//frm.doc.items[index].amount_minus_excise_tax = Number(this_row_amount - this_row_tax_amount);
// Convert a number into a string, keeping only two decimals:
frm.doc.items[index].other_tax_amount = ((this_row_tax_rate * this_row_stock_qty).toFixed(2));
frm.doc.items[index].amount_minus_excise_tax = ((this_row_amount - this_row_tax_amount).toFixed(2));
// Comprbaciones individuales para detectar si es combustible, bien o servicio.
if (item_row.is_fuel == true) {
console.log("The item you added is FUEL!" + item_row.is_fuel);
// Sumatoria de todos los que tengan el check combustibles
total_fuel = 0;
$.each(frm.doc.items || [], function(i, d) {
// total_qty += flt(d.qty);
if (d.is_fuel == true) {
total_fuel += flt(d.amount_minus_excise_tax);
}
});
console.log(total_fuel);
frm.doc.gt_tax_fuel = total_fuel
// FIXME: Extract sales tax properly from the default sales tax table
//net_fuel_tally = ((this_row_taxable_amount / (1 + (sales_tax_temp / 100))).toFixed(2));
//console.log("El valor en combustibles para el libro de compras es: " + net_fuel_tally);
//frm.doc.gt_tax_fuel = net_fuel_tally;
};
if (item_row.is_good == true) {
console.log("The item you added is a GOOD!" + item_row.is_good);
// Sumatoria de todos los que tengan el check bienes
total_goods = 0;
$.each(frm.doc.items || [], function(i, d) {
// total_qty += flt(d.qty);
if (d.is_good == true) {
total_goods += flt(d.amount_minus_excise_tax);
}
});
console.log(total_goods);
frm.doc.gt_tax_goods = total_goods
// FIXME: Extract sales tax properly from the default sales tax table
// net_goods_tally = ((this_row_taxable_amount / (1 + (sales_tax_temp / 100))).toFixed(2));
// frm.doc.gt_tax_goods = net_goods_tally;
};
if (item_row.is_service == true) {
console.log("The item you added is a SERVICE!" + item_row.is_service);
// Sumatoria de todos los que tengan el check services
total_servi = 0;
$.each(frm.doc.items || [], function(i, d) {
if (d.is_service == true) {
total_servi += flt(d.amount_minus_excise_tax);
}
});
console.log(total_servi);
frm.doc.gt_tax_services = total_servi
// FIXME: Extract sales tax properly from the default sales tax table
// net_services_tally = ((this_row_taxable_amount / (1 + (sales_tax_temp / 100))).toFixed(2));
// frm.doc.gt_tax_services = net_goods_tally;
};
// }
};
});
// console.log("Justo afuera de la funcion de la tabla hija, los valores ahora son: ");
// console.log("AFUERA: El campo qty es ahora de esta fila contiene: " + this_row_qty);
// console.log("AFUERA: El campo rate es ahora de esta fila contiene: " + this_row_rate);
// console.log("AFUERA: El campo conversion_factor de esta fila contiene: " + this_row_conversion_factor);
// console.log("AFUERA: El campo stock_qty de esta fila contiene: " + this_row_stock_qty);
// console.log("AFUERA: El campo tax_rate de esta fila contiene: " + this_row_tax_rate);
// console.log("AFUERA: El campo tax_amount de esta fila contiene: " + this_row_tax_amount);
// console.log("AFUERA: El campo taxable_amount de esta fila contiene: " + this_row_taxable_amount);
}
frappe.ui.form.on("Sales Invoice Item", {
// Add a trigger for when you ADD a new row. In this particular case, the user did NOT touch the qty field, meaning that the default value of "1" was left, so we estimate with "1" as the qty, stock qty, etc.
// es-GT: Disparadores especifico para
// en-US: Child Table triggers
items_add: function(frm, cdt, cdn) {
// es-GT: Este disparador corre al agregar una nueva fila
// en-US: This trigger runs when adding a new row.
//AB: Solo asegurarse que el indice de la fila se refiera a la correcta (la anterior, no la actual!??) FIXME
},
items_move: function(frm, cdt, cdn) {
// es-GT: Este disparador corre al mover una nueva fila
// en-US: This trigger runs when moving a new row.
},
items_before_remove: function(frm, cdt, cdn) {
// es-GT: Este disparador corre antes de eliminar una fila (FIXME: Averiguar????)
// en-US: This trigger runs before eliminating a row (not sure exactly how!!?)
console.log('FUncionado befores')
},
items_remove: function(frm, cdt, cdn) {
// es-GT: Este disparador corre al momento de eliminar una nueva fila.
// en-US: This trigger runs when removing a row.
console.log('Se elimino una fila');
calculations_tax_gt(frm, cdt, cdn);
},
// When loading the Sales Invoice Items
onload: function(frm, cdt, cdn) {
// Fetch the tax rate per unit of measure using item_code as primary key
/* frm.add_fetch("item_code", "tax_rate_per_uom", "tax_rate_per_uom");
console.log("Se acaba de cargar el impuesto por unidad de medida");
// Since we have the field with data, we can pull it onto a variable
var test_variable = frm.doc.tax_rate_per_uom;
console.log("La variable ahora contiene " + test_variable); */
// A la variable d se cargan todos los datos disponibles en el formulario (dialogo)
// # Locals es un array, y los parametros [cdt][cdn] sirven para ubicar, los campos de este documento cargado en pantalla
// # Locals se refiere a los campos del documento actual en pantalla, o "local".
// # let es lo mismo que var
//var formulario = locals[cdt][cdn];
//var cantidad = formulario.stock_qty;
},
refresh: function(frm, cdt, cdn) {
// Esta funcion se llama cuando se refresca la linea de sales invoice item line
console.log("Fields were refreshed");
//frm.add_fetch("item_code", "tax_rate_per_uom", "tax_rate_per_uom");
// Since we have the field with data, we can pull it onto a variable
//var test_variable = frm.doc.tax_rate_per_uom;
//console.log(" the variable now contains: " + test_variable);
},
item_code: function(frm, cdt, cdn) {
console.log('Trigger item_code');
// calculations_tax_gt(frm, cdt, cdn);
/* Prueba fallida, no toma los valores del instante, usar en funcion de qty?
frappe.run_serially([
// es-GT: Usando la pseudo funcion para serializar: () =>, en este caso, obteniendo el valor de el campo tax_rate_per_uom del artículo, usando item_code como llave primaria para enlace.
// en-US: Using the pseudo function to run serially: () =>, in this case fetching the value of the tax_rate_per_uom from the Item, using Item code as primary key for linking.
// Testing asynchronicity, remove the code comment lines below.
() => console.log('Primero en la serie'),
() => {
frm.doc.items.forEach((item_row, index) => {
if (item_row.name == cdn) {
calculations_tax_gt(frm, cdt, cdn);
}
});
}
]);
*/
},
qty: function(frm, cdt, cdn) {
console.log("The quantity field was changed and the code from the trigger was run");
// es-GT: Previo a correr en serie, tomamos los valores recien actualizados en los campos qty y conversion_factor.
// en-US: Prior to running anything serially, we take the recently updated values in the qty and conversion_factor fields.
// it seems to pull qty and conversion factor OK. But stock_qty is not properly pulled, because it is calculated post reload. Thus we will try to calculate it separately.
// Ejecucion de funcion, para los calculos necesarios y asi ahorrar escribir codigo
calculations_tax_gt(frm, cdt, cdn);
// es-GT: Esta funcion se llama cuando se cambia el sales invoice item quantity
//var cantidad = formulario.stock_qty;
// console.log("Item tax pulled upon change of QUANTITY field");
// Since we have the field with data, we can pull it onto a variable
//var test_variable = frm.doc.tax_rate_per_uom;
//console.log("the variable now contains: " + test_variable);
},
uom: function(frm, cdt, cdn) {
console.log("The unit of measure field was changed and the code from the trigger was run");
},
conversion_factor: function(frm, cdt, cdn) {
console.log("El disparador de factor de conversión se corrió.");
},
});
/*cambiar valor en el campo del formulario
frm.set_value(fieldname, value);*/
frappe.ui.form.on("Sales Invoice", "refresh", function(frm) {
// es-GT: Obtiene el numero de Identificacion tributaria ingresado en la hoja del cliente.
// en-US: Fetches the Taxpayer Identification Number entered in the Customer doctype.
cur_frm.add_fetch("customer", "nit_face_customer", "nit_face_customer");
console.log('hiciste click');
// Funcion para la obtencion del PDF, segun el documento generado.
function pdf_button() {
frappe.call({
// Este metodo verifica, el modo de generacion de PDF para la factura electronica
// retornara 'Manul' o 'Automatico'
method: "factura_electronica.api.save_url_pdf",
callback: function(data) {
if (data.message === 'Manual') {
// Si en la configuracion se encuentra que la generacion de PDF debe ser manual
// Se realizara lo siguiente
//cur_frm.clear_custom_buttons();
console.log(data.message);
frm.add_custom_button(__("Obtener PDF"),
function() {
var cae_fac = frm.doc.cae_factura_electronica;
var link_cae_pdf = "https://www.ingface.net/Ingfacereport/dtefactura.jsp?cae=";
//console.log(cae_fac)
window.open(link_cae_pdf + cae_fac);
}).addClass("btn-primary");
} else {
// Si en la configuracion se encuentra que la generacion de PDF debe ser Automatico
// Se realizara lo siguiente
console.log(data.message);
var cae_fac = frm.doc.cae_factura_electronica;
var link_cae_pdf = "https://www.ingface.net/Ingfacereport/dtefactura.jsp?cae=";
frappe.call({
method: "factura_electronica.api.save_pdf_server",
args: {
file_url: link_cae_pdf + cae_fac,
filename: frm.doc.name,
dt: 'Sales Invoice',
dn: frm.doc.name,
folder: 'Home/Facturas Electronicas',
is_private: 1
}
});
}
}
});
}
// Codigo para Factura Electronica FACE, CFACE
// El codigo se ejecutara segun el estado del documento, puede ser: Pagado, No Pagado, Validado, Atrasado
if (frm.doc.status === "Paid" || frm.doc.status === "Unpaid" || frm.doc.status === "Submitted" || frm.doc.status === "Overdue") {
// SI en el campo de 'cae_factura_electronica' ya se encuentra el dato correspondiente, ocultara el boton
// para generar el documento, para luego mostrar el boton para obtener el PDF del documento ya generado.
if (frm.doc.cae_factura_electronica) {
cur_frm.clear_custom_buttons();
pdf_button();
} else {
var nombre = 'Factura Electronica';
frm.add_custom_button(__(nombre), function() {
frappe.call({
method: "factura_electronica.api.generar_factura_electronica",
args: {
serie_factura: frm.doc.name,
nombre_cliente: frm.doc.customer
},
// El callback recibe como parametro el dato retornado por script python del lado del servidor
callback: function(data) {
// Asignacion del valor retornado por el script python del lado del servidor en el campo
// 'cae_factura_electronica' para ser mostrado del lado del cliente y luego guardado en la DB
cur_frm.set_value("cae_factura_electronica", data.message);
if (frm.doc.cae_factura_electronica) {
cur_frm.clear_custom_buttons();
pdf_button();
}
}
});
}).addClass("btn-primary");
}
}
// Codigo para Notas de Credito NCE
// El codigo se ejecutara segun el estado del documento, puede ser: Retornar
if (frm.doc.status === "Return") {
//var nombre = 'Nota Credito';
// SI en el campo de 'cae_nota_de_credito' ya se encuentra el dato correspondiente, ocultara el boton
// para generar el documento, para luego mostrar el boton para obtener el PDF del documento ya generado.
if (frm.doc.cae_nota_de_credito) {
cur_frm.clear_custom_buttons();
pdf_button();
} else {
frm.add_custom_button(__('Nota Credito'), function() {
frappe.call({
method: "factura_electronica.api.generar_factura_electronica",
args: {
serie_factura: frm.doc.name,
nombre_cliente: frm.doc.customer
},
// El callback recibe como parametro el dato retornado por script python del lado del servidor
callback: function(data) {
// Asignacion del valor retornado por el script python del lado del servidor en el campo
// 'cae_nota_de_credito' para ser mostrado del lado del cliente y luego guardado en la DB
cur_frm.set_value("cae_nota_de_credito", data.message);
if (frm.doc.cae_nota_de_credito) {
cur_frm.clear_custom_buttons();
pdf_button();
}
}
});
}).addClass("btn-primary");
}
}
// frappe.ui.form.on("Sales Invoice Item", {
// Cuando exista un cambio en la seleccion de codigo de producto, se ejecutara la funcion que recibe como parametros
// frm = El Formulario, cdt = Current Doctype, cdn = Current docname
/*FIXME: Por el momento, el usuario TIENE QUE Refrescar el campo de item_code,
desde la ventanita de Sales invoice Item para que funcione. Si lo refresca usando el
grid edtiable de Sales Invoice Item mostrado en Sales invoice, no jala la data.
Para arreglarlo el objetivo es como hacer trigger de tal forma, que sea irrelevante en donde
actualiza, coloca, o simplemente LEE el Sales Invoice.
*/
/*PRUEBA PARA VER EL TRIGGER DEL CAMPO QTY O cantidad*/
/*item_code: function(frm, cdt, cdn) {
//frm.add_fetch("item_code", "tax_rate_per_uom", "tax_rate_per_uom");
// A la variable d se cargan todos los datos disponibles en el formulario
// # Locals es un array, y los parametros [cdt][cdn] sirven para ubicar, los campos de este documento cargado en pantalla
// # Locals se refiere a los campos del documento actual en pantalla, o "local".
// # let es lo mismo que var
var d = locals[cdt][cdn];
//Para acceder a un campo en especifico, se colola:
// d.valor_de_campo_que_se_desea_saber
// Accediendo a los Valores que tiene el objeto cargado.
//console.log(Object.values(d));
//Utilizando JQUERY
// Funciona utilizar JQUERY?
var monto = d.amount;
console.log("La cantidad de articulos por unidad de stock es: " + cantidad);
var excise_tax = d.tax_rate_per_uom;
console.log("El impuesto es: " + excise_tax);
var prueba_impuesto = excise_tax * cantidad;
console.log("El valor total del impuesto es: " + prueba_impuesto);
//frappe.msgprint(d);
//console.log(d.amount);
console.log(d);
//console.log("Usando trigger de Item code");
console.log("El valor total del impuesto es: " + prueba_impuesto);
// frappe.model.set_value, establece un valor al campo que se desee
// recibe como parametros; frappe.model.set_value('doctype', 'docname', 'campo_a_asignar_valor', valor);
//frappe.model.set_value(cdt, cdn, 'campo_de_prueba', flt(monto) * flt(cantidad));
frappe.model.set_value(cdt, cdn, 'valor_otro_impuesto', flt(monto) * flt(cantidad));
// Actualiza el valor de los campos
cur_frm.refresh_fields();
},*/
/* qty: function(frm, cdt, cdn){
var d = locals[cdt][cdn];
//Para acceder a un campo en especifico, se colola:
// d.valor_de_campo_que_se_desea_saber
// Accediendo a los Valores que tiene el objeto cargado.
//console.log(Object.values(d));
//Utilizando JQUERY
// Funciona utilizar JQUERY?
var monto = d.amount;
var cantidad = d.stock_qty;
console.log("La cantidad de articulos por unidad de stock es: " + cantidad);
var excise_tax = d.tax_rate_per_uom;
console.log("El impuesto es: " + excise_tax);
var prueba_impuesto = excise_tax * cantidad;
console.log("El valor total del impuesto es: " + prueba_impuesto);
//frappe.msgprint(d);
//console.log(d.amount);
console.log(d);
//console.log("Usando trigger de Item code");
console.log("El valor total del impuesto es: " + prueba_impuesto);
// frappe.model.set_value, establece un valor al campo que se desee
// recibe como parametros; frappe.model.set_value('doctype', 'docname', 'campo_a_asignar_valor', valor);
//frappe.model.set_value(cdt, cdn, 'campo_de_prueba', flt(monto) * flt(cantidad));
frappe.model.set_value(cdt, cdn, 'valor_otro_impuesto', flt(monto) * flt(cantidad));
// Actualiza el valor de los campos
cur_frm.refresh_fields();
},*/
/*uom: function(frm, cdt, cdn) {
let d = locals[cdt][cdn];
var monto = d.amount;
var cantidad = d.stock_qty;
//frappe.msgprint(d);
console.log(d);
console.log("Usando trigger de UOM");
// Agregar logica para realizar calculos
frappe.model.set_value(cdt, cdn, 'campo_de_prueba', flt(monto) * flt(cantidad));
cur_frm.refresh_fields();
},*/
/*conversion_factor: function(frm, cdt, cdn) {
let d = locals[cdt][cdn];
var monto = d.amount;
var cantidad = d.stock_qty;
//frappe.msgprint(d);
console.log(d);
console.log("Usando trigger de conversion_factor");
// Agregar logica para realizar calculos
frappe.model.set_value(cdt, cdn, 'campo_de_prueba', flt(monto) * flt(cantidad));
cur_frm.refresh_fields();
}*/
// });
// Agregando nueva forma para hacer los calculos.
/* frappe.ui.form.on('Sales Invoice Item', 'item_code', function(frm, cdt, cdn){
var dd = locals[cdt][cdn];
frappe.model.set_value(dd.cdt, dd.cdn, 'valor_otro_impuesto', (dd.amount * dd.qty));
console.log('Mostrando Calculos: ', dd.amount*dd.qty);
}); */
// The next bracket has to be available!
});
// es-GT: Obtiene un valor para un campo que pertenece a la Tabla Hija "Sales Invoice Item" o "Producto de la Factura de Venta"
// en-US: Code for fetching a value for a field within the Child Table "Sales Invoice Item"
/*
frappe.ui.form.on("Sales Invoice Item", "item_code", function(frm, cdt, cdn) {
var resultado = locals[cdt][cdn];
resultado = locals[cdt][cdn];
var monto = resultado.amount;
console.log(resultado);
console.log(frm.doc.amount);
frappe.model.set_value(cdt, cdn, 'campo_de_prueba', (flt(resultado.amount) * flt(2)))
});
*/
/*
item_code: function(frm, cdt, cdn) {
var row = locals[cdt][cdn];
console.log(row);
console.log(row.item_code);
console.log(row.item_name);
console.log(row.amount);
console.log(row.qty);
}
*/
/*'item_code': function(frm) {
var resultado = frm.doc.amount * 2;
console.log(resultado);
//cur_frm.set_value("campo_de_prueba", resultado);
*/
/*
frappe.ui.form.on("Sales Invoice", "refresh", function(frm) {
frm.add_fetch("item_code", "tax_rate_per_uom", "tasa_otro_impuesto");
});
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment