Created
September 1, 2015 21:43
-
-
Save viktor1190/d5c812c660fba37a70a0 to your computer and use it in GitHub Desktop.
Clase para digitar producto
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.homeelementsweb.pedidosrecaudosmovilsantander.Controladores.Actividades.Pedido; | |
import android.app.Activity; | |
import android.os.Bundle; | |
import android.util.Log; | |
import android.view.Gravity; | |
import android.view.KeyEvent; | |
import android.view.Menu; | |
import android.view.MenuItem; | |
import android.view.View; | |
import android.view.inputmethod.EditorInfo; | |
import android.widget.ArrayAdapter; | |
import android.widget.EditText; | |
import android.widget.Spinner; | |
import android.widget.TextView; | |
import android.widget.Toast; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Configuracion.Conf_App; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Configuracion.Exceptions.DatosNoEncontradosException; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Controladores.Interfaces.RepositoryInterface; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Entidades.Descuento; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Entidades.Empaque; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Entidades.Producto; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Entidades.ProductoDescuento; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Entidades.TipoPedido; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Repositorio.DescuentoRepository; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Repositorio.EmpaqueRepository; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Repositorio.ListaPreciosRepository; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Repositorio.ProductoRepository; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Modelos.Repositorio.TipoPedidoRepository; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.R; | |
import com.homeelementsweb.pedidosrecaudosmovilsantander.Utilidades.Validaciones.PedidosValidaciones; | |
import java.sql.SQLException; | |
import java.util.ArrayList; | |
import java.util.List; | |
/** | |
* Actividad encargada de controlar la pantalla donde se digita la información de un producto | |
* que se está pidiendo como por ejemplo la cantidad a pedir y los descuentos que se otorgan | |
* @author Alejandro Arroyave Pérez | |
* @version 1 | |
*/ | |
public class DigitaProductoPedidoActivity extends Activity implements RepositoryInterface { | |
/** | |
* Text View que contiene el nombre del producto que esta seleccionado en el momento | |
*/ | |
private TextView tv_nombre; | |
/** | |
* Text View que contiene el nombre del cliente al cual se le esta realizando el pedido | |
*/ | |
private TextView tv_nombreCliente; | |
/** | |
* Text View que contiene el nombre del subcanal al cual pertenece el cliente | |
*/ | |
private TextView tv_subcanal; | |
/** | |
* Text View en el cual se muestra el precio unitario (iva incluido) del producto seleccionado | |
*/ | |
private TextView tv_precio; | |
/** | |
* Text View en el cual se muestra el subtotal (cantidad * precio_sin_iva) | |
*/ | |
private TextView tv_subtotal; | |
/** | |
* Muestra el valor total del pedido (La sumatoria del valor de todos los productos pedidos con el iva y los descuentos aplicados) | |
*/ | |
private TextView tv_totalPedido; | |
/** | |
* Text View en el cual se muestra el total (cantidad * precio_con_iva) | |
*/ | |
private TextView tv_total; | |
/** | |
* Spinner donde se muestra las unidades de medida (Empaque: UND, C2U, C6U etc) | |
*/ | |
private Spinner sp_UnidadesMedida; | |
/** | |
* Text View que contiene el saldo (cantidad de unidades en inventario). Es donde se muestra Cant. Inventario | |
*/ | |
private TextView tv_saldo; | |
/** | |
* Edit Text que contiene la cantidad del producto seleccionado que esta pidiendo el cliente | |
*/ | |
private EditText et_cantidad; | |
/** | |
* Label o etiqueta para el campo de entrada de descuento base | |
*/ | |
private TextView tv_descuentoBase; | |
/** | |
* Edit Text que contiene el descuento base digitado para el producto seleccionado (El descuento base es con respecto al subcanal del cliente) | |
*/ | |
private EditText et_descuentoBase; | |
/** | |
* Label o etiqueta del campo de entrada descuento promocional | |
*/ | |
private TextView tv_descuentoPromocional; | |
/** | |
* Edit Text en el cual se digita el descuento promocional para el producto seleccionado | |
*/ | |
private EditText et_descuentoPromocional; | |
/** | |
* Edit text que toma la nota por producto | |
*/ | |
private EditText et_observacionProducto; | |
/** | |
* Variable que contiene la lista de precios a la cual pertenece el cliente que se le esta realizando el pedido | |
*/ | |
private String listaPrecios; | |
/** | |
* El iva que se esta manejando actualmete (Tomado de parametros de configuracion) | |
*/ | |
private float iva; | |
/** | |
* Repositorio de listas de precios, para poder realizar las consultas necesarias a la listas de precio (en el hilo actual o en un hilo aparte) | |
*/ | |
private ListaPreciosRepository listaPreciosRepository; | |
/** | |
* Repositorio de Empaque, para poder realizar las consultas necesarias a los empaques (en el hilo acutal o en un hilo aparte) | |
*/ | |
private EmpaqueRepository empaqueRepository; | |
/** | |
* Producto seleccionado actualmente | |
*/ | |
private Producto productoSelected; | |
/** | |
* Repositorio de descuentos, para poder realizar las consultas necesarias de descuentos (en el hilo acutal o en un hilo aparte) | |
*/ | |
private DescuentoRepository descuentoRepository; | |
/** | |
* Repositorio de productos, para poder realizar las consultas necesarias de productos | |
*/ | |
private ProductoRepository productoRepository; | |
/** | |
* Codigo del subcanal al cual pertenece el cliente que se le esta realizando el pedido | |
*/ | |
private String codSubcanal; | |
/** | |
* Precio unitario del producto seleccionado (Sin iva y basado en la lista de precios del cliente) | |
*/ | |
private float precioProductoSeleccionado; | |
/** | |
* Atributo que se pone en true para determinar si el producto es un obsequio | |
*/ | |
private boolean productoObsequio; | |
/** | |
* Almacena el tipo de pedido que se esta realizando | |
*/ | |
private String tipoPedido; | |
/** | |
* Text View para mostrar el codigo del producto (item) | |
*/ | |
private TextView tv_codigoProducto; | |
/** | |
* TextView para mostrar el valor del descuento (el dinero que se está descontando) | |
*/ | |
private TextView tv_valorDescuento; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.activity_digita_producto_pedido); | |
init(savedInstanceState); | |
} | |
@Override | |
public boolean onCreateOptionsMenu(Menu menu) { | |
// Inflate the menu; this adds items to the action bar if it is present. | |
getMenuInflater().inflate(R.menu.menu_digita_producto_pedido, menu); | |
return true; | |
} | |
@Override | |
public boolean onOptionsItemSelected(MenuItem item) { | |
// Handle action bar item clicks here. The action bar will | |
// automatically handle clicks on the Home/Up button, so long | |
// as you specify a parent activity in AndroidManifest.xml. | |
int id = item.getItemId(); | |
//noinspection SimplifiableIfStatement | |
if (id == R.id.productoPedidoOK) | |
{ | |
agregarProducto(); | |
return true; | |
} | |
return super.onOptionsItemSelected(item); | |
} | |
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
/** | |
* Inicializa todos los componentes necesarios | |
* para el correcto funcionamiento de ProductoFragment | |
*/ | |
private void init(Bundle savedInstanceState){ | |
initViews(); | |
initValidacionEditText(); | |
et_cantidad.setText("0"); | |
et_descuentoBase.setText("0"); | |
et_descuentoPromocional.setText("0"); | |
descuentoRepository = new DescuentoRepository(this); | |
listaPreciosRepository = new ListaPreciosRepository(this); | |
empaqueRepository = new EmpaqueRepository(this); | |
productoRepository = new ProductoRepository(this); | |
Bundle datosActivity = this.getIntent().getExtras(); | |
/*String nombre = datosActivity.getString("NombreCliente"); | |
String subcanal = datosActivity.getString("NombreCanal"); | |
tv_subcanal.setText(subcanal); | |
tv_nombreCliente.setText(nombre);*/ | |
listaPrecios = datosActivity.getString("ListaPrecios"); | |
codSubcanal = datosActivity.getString("SubcanalCliente"); | |
int idProductoSeleccionado = datosActivity.getInt("IdProducto"); | |
setPrecioTotalPedido(datosActivity.getFloat("totalPedido")); | |
productoSelected = productoRepository._obtenerProductoPorId(idProductoSeleccionado); | |
tv_codigoProducto.setText(productoSelected.getItem()); | |
cargarPrecioProductoSeleccionado(productoSelected); | |
String textoSinFormato; | |
try { | |
Descuento descuentoBase = descuentoRepository. | |
_obtenerDescuentoBase(codSubcanal, productoSelected.getItem()); | |
textoSinFormato = getResources().getString(R.string.pedido_descuentoBase); | |
tv_descuentoBase.setText( | |
String.format( | |
textoSinFormato, | |
descuentoBase.getValor() | |
)); | |
} catch (SQLException e) { | |
e.printStackTrace(); | |
} catch (DatosNoEncontradosException e) { | |
e.printStackTrace(); | |
} | |
textoSinFormato = getResources().getString(R.string.pedido_descuentoPromocional); | |
Descuento descuentoPromocional = null; | |
try { | |
descuentoPromocional = | |
descuentoRepository._obtenerDescuentoPromocional( | |
productoSelected.getItem(), | |
codSubcanal | |
); | |
} catch (SQLException e){ | |
Log.e("VMS", "error", e); | |
} catch (DatosNoEncontradosException e){ | |
Log.e("VMS", "error", e); | |
} | |
float descuento = descuentoPromocional==null? | |
0: | |
descuentoPromocional.getValor(); | |
tv_descuentoPromocional.setText( | |
String.format( | |
textoSinFormato, | |
descuento | |
)); | |
this.iva = productoSelected.getIva(); | |
setTipoPedido(datosActivity.getString("TipoPedido")); | |
productoSeleccionado(productoSelected); | |
} | |
public void setTipoPedido(String tipo){ | |
this.tipoPedido = tipo; | |
boolean enabled = !tipoPedido.equals(Conf_App.TIPO_PEDIDO_OBSEQUIO); | |
et_descuentoBase.setEnabled(enabled); | |
et_descuentoPromocional.setEnabled(enabled); | |
} | |
/** | |
* Metodo encargado de agregar los listeners necesarios a los campos | |
* de cantidad, descuento base y descuento promocional para poder | |
* realizar las validaciones necesarias sobre estos campos | |
*/ | |
private void initValidacionEditText(){ | |
et_cantidad.setOnEditorActionListener(new TextView.OnEditorActionListener() { | |
@Override | |
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { | |
if(actionId == EditorInfo.IME_ACTION_NEXT) | |
{ | |
et_descuentoBase.requestFocus(); | |
realizarCalculos(); | |
return true; | |
} | |
return false; | |
} | |
}); | |
et_descuentoBase.setOnEditorActionListener(new TextView.OnEditorActionListener() { | |
@Override | |
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { | |
if (actionId == EditorInfo.IME_ACTION_NEXT) { | |
et_descuentoPromocional.requestFocus(); | |
realizarCalculos(); | |
return true; | |
} | |
return false; | |
} | |
}); | |
et_descuentoPromocional.setOnEditorActionListener(new TextView.OnEditorActionListener() { | |
@Override | |
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { | |
if(actionId == EditorInfo.IME_ACTION_NEXT) | |
{ | |
et_observacionProducto.requestFocus(); | |
realizarCalculos(); | |
return true; | |
} | |
return false; | |
} | |
}); | |
et_cantidad.setOnFocusChangeListener(new View.OnFocusChangeListener() { | |
@Override | |
public void onFocusChange(View v, boolean hasFocus) { | |
if (hasFocus && et_cantidad.getText().toString().equals("0")) | |
et_cantidad.setText(""); | |
else if (!hasFocus && et_cantidad.getText().toString().equals("")) | |
et_cantidad.setText("0"); | |
} | |
}); | |
et_descuentoBase.setOnFocusChangeListener(new View.OnFocusChangeListener() { | |
@Override | |
public void onFocusChange(View v, boolean hasFocus) { | |
if (hasFocus && et_descuentoBase.getText().toString().equals("0")) | |
et_descuentoBase.setText(""); | |
else if (!hasFocus && et_descuentoBase.getText().toString().equals("")) | |
et_descuentoBase.setText("0"); | |
} | |
}); | |
et_descuentoPromocional.setOnFocusChangeListener(new View.OnFocusChangeListener() { | |
@Override | |
public void onFocusChange(View v, boolean hasFocus) { | |
if (hasFocus && et_descuentoPromocional.getText().toString().equals("0")) | |
et_descuentoPromocional.setText(""); | |
else if (!hasFocus && et_descuentoPromocional.getText().toString().equals("")) | |
et_descuentoPromocional.setText("0"); | |
} | |
}); | |
et_cantidad.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
if (et_cantidad.getText().toString().equals("0")) { | |
et_cantidad.setText(""); | |
} | |
} | |
}); | |
et_descuentoBase.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
if (et_descuentoBase.getText().toString().equals("0")) { | |
et_descuentoBase.setText(""); | |
} | |
} | |
}); | |
et_descuentoPromocional.setOnClickListener(new View.OnClickListener() { | |
@Override | |
public void onClick(View view) { | |
if (et_descuentoPromocional.getText().toString().equals("0")) { | |
et_descuentoPromocional.setText(""); | |
} | |
} | |
}); | |
} | |
/** | |
* Metodo encargado de inicializar en sus respectivas variables | |
* los elementos visuales sobre los cuales se necesita tener | |
* control | |
*/ | |
private void initViews(){ | |
tv_nombre = (TextView) findViewById(R.id.txtNombreProducto); | |
tv_precio = (TextView) findViewById(R.id.tv_precio); | |
tv_subtotal = (TextView) findViewById(R.id.tv_valor); | |
tv_saldo = (TextView) findViewById(R.id.tv_saldo); | |
tv_total = (TextView) findViewById(R.id.tv_total); | |
tv_totalPedido = (TextView) findViewById(R.id.tv_totalPedido); | |
tv_codigoProducto = (TextView) findViewById(R.id.tv_codigoProducto); | |
tv_valorDescuento = (TextView) findViewById(R.id.tv_valorDescuento); | |
sp_UnidadesMedida = (Spinner) findViewById(R.id.spinnerUnidadMedida); | |
et_cantidad = (EditText) findViewById(R.id.et_Cantidad); | |
tv_descuentoBase = (TextView) findViewById(R.id.tv_descuentoBase); | |
et_descuentoBase = (EditText) findViewById(R.id.et_Descuento); | |
tv_descuentoPromocional = (TextView) findViewById(R.id.tv_descuentoPromocional); | |
et_descuentoPromocional = (EditText) findViewById(R.id.et_DescuentoPromocional); | |
et_observacionProducto = (EditText) findViewById(R.id.et_observacion); | |
} | |
/** | |
* Metodo que se ejecuta en el momento que se selecciona un producto de la lista | |
* y carga los datos necesarios del producto | |
* @param producto | |
*/ | |
public void productoSeleccionado(Producto producto){ | |
//Se comprueba si el producto ya ha sido agregado a la venta | |
ProductoDescuento productoDescuento = PedidosActivity.productoAgregado(producto.getItem()); | |
productoSelected = producto; | |
this.iva = producto.getIva(); | |
//limpiarValores(); | |
//Se cargan los empaques del producto seleccionado | |
List empaques = empaqueRepository._empaquesDeProducto(producto); | |
llenarSpinner(sp_UnidadesMedida, empaques); | |
//Carga del nombre del producto seleccionado | |
String descripcion = producto.getDescripcion(); | |
tv_nombre.setText(descripcion); | |
//Se carga el saldo del producto (cantidad en inventario) | |
tv_saldo.setText(Conf_App.FORMATO_DECIMAL.format(producto.getSaldo())); | |
tv_precio.setText(Conf_App.FORMATO_DECIMAL.format(calcularPrecioConIva(precioProductoSeleccionado))); | |
//Si el pedido fue agregado a la venta se cargan los valores que ya habian sido escritos | |
if (productoDescuento != null) | |
{ | |
String cantidad = String.valueOf(productoDescuento.getDetallePedido().getCantidad()); | |
String descuentoBase = Conf_App.FORMATO_DECIMAL.format(productoDescuento.getDescuento().getDescuentoBase()); | |
descuentoBase = descuentoBase.replace(',', '.'); // 3,5 ==> 3.5 | |
String descuentoPromocional = Conf_App.FORMATO_DECIMAL.format(productoDescuento.getDescuento().getDescuentoPromocional()); | |
descuentoPromocional = descuentoPromocional.replace(',', '.'); | |
seleccionarCodigoEmpaque(productoDescuento.getDetallePedido().getCodigoEmpaque()); | |
et_cantidad.setText(cantidad); | |
et_descuentoBase.setText(descuentoBase); | |
et_descuentoPromocional.setText(descuentoPromocional); | |
realizarCalculos(); | |
} | |
} | |
/** | |
* Metodo encarcado de instanciar en el atributo precioProductoSeleccionado | |
* el valor de un producto dependiendo de la lista de precios que se encuentra | |
* en el atributo listaPrecios | |
* @param producto producto del cual se desea instanciar el precio | |
*/ | |
private void cargarPrecioProductoSeleccionado(Producto producto) | |
{ | |
try | |
{ | |
//Se carga el precio del producto dependiendo de la lista de precios a la que pertenece el cliente | |
precioProductoSeleccionado = listaPreciosRepository._getPrecioDeItem(producto.getItem(), listaPrecios); | |
} | |
catch (SQLException e) | |
{ | |
mostrarMensaje("Se present� un error al intentar cargar el precio del producto de la lista de precios " + listaPrecios); | |
} | |
} | |
/** | |
* Metodo encargado de seleccionar en el spinner de unidad de medida | |
* el Empaque que corresponda con el codigo de empaque que es pasado como parametro | |
* @param codigo codigo de empaque que se desea seleccionar | |
*/ | |
private void seleccionarCodigoEmpaque(String codigo){ | |
if(sp_UnidadesMedida!=null) | |
{ | |
int cantidadEmaques = sp_UnidadesMedida.getAdapter().getCount(); | |
for (int i =0; i < cantidadEmaques; i++) | |
{ | |
Empaque empaque = (Empaque) sp_UnidadesMedida.getAdapter().getItem(i); | |
if(empaque!=null) | |
{ | |
if (empaque.getCodigo().equals(codigo)) | |
{ | |
sp_UnidadesMedida.setSelection(i); | |
break; | |
} | |
} | |
} | |
} | |
} | |
/** | |
* Metodo para llenar un spinner con una lista | |
* @param spiner | |
* @param listaDeDatos | |
*/ | |
private void llenarSpinner(Spinner spiner, List listaDeDatos){ | |
ArrayAdapter adaptador = new ArrayAdapter(this,android.R.layout.simple_spinner_item,listaDeDatos); | |
spiner.setAdapter(adaptador); | |
} | |
/** | |
* Metodo encargado de agregar un producto a la venta (pedido) | |
* | |
*/ | |
private void agregarProducto(){ | |
if(validarAgregar()) | |
{ | |
realizarCalculos(); | |
int cantidad = Integer.parseInt(et_cantidad.getText().toString()); | |
Descuento descuento = obtenerDescuentoAgregar(cantidad, precioProductoSeleccionado); | |
Empaque empaque = (Empaque) sp_UnidadesMedida.getSelectedItem(); | |
float precioTotal = obtenerTotalAgregar(); | |
float subtotal = (cantidad * empaque.getTipoEmpaque().getContenido()) * precioProductoSeleccionado; | |
String observacion = et_observacionProducto.getText().toString(); | |
PedidosActivity.agregarLinea(productoSelected, descuento, cantidad, iva, precioTotal,subtotal,observacion,precioProductoSeleccionado,empaque); | |
Toast.makeText(this,"Producto agregado a la venta: "+ productoSelected.getDescripcion(),Toast.LENGTH_SHORT).show(); | |
onBackPressed(); | |
} | |
} | |
/** | |
* Metodo encargado de poner en 0 los valores visualizados en pantalla | |
*/ | |
private void limpiarValores(){ | |
et_cantidad.setText("0"); | |
et_descuentoBase.setText("0"); | |
et_descuentoPromocional.setText("0"); | |
tv_precio.setText("000000"); | |
tv_total.setText("000000"); | |
tv_subtotal.setText("000000"); | |
tv_valorDescuento.setText("000000"); | |
} | |
/** | |
* Obtiene el descuento total que se le va a aplicar al producto | |
* por ejemplo si se tiene un descuento base del 8% y un descuento | |
* promocional del 10%, este metodo retorna 17.2 que seria el descuento | |
* toal que se le aplica al producto | |
* @return | |
*/ | |
private Descuento obtenerDescuentoAgregar(int cantidad, float precio){ | |
float descuentoBase = Float.parseFloat(et_descuentoBase.getText().toString()); | |
float descuentoPromocional = Float.parseFloat(et_descuentoPromocional.getText().toString()); | |
float descuentoTotal = 1 - ((1-(descuentoBase/100)) * (1-(descuentoPromocional/100))); | |
float valorDescuento = (cantidad * precio) * descuentoTotal; | |
Descuento descuento = new Descuento(); | |
descuento.setValor(valorDescuento); | |
descuento.setTipoDescuento("APLICADO"); | |
descuento.setDescuentoBase(descuentoBase); | |
descuento.setCodigoProducto(productoSelected.getItem()); | |
descuento.setDescuentoPromocional(descuentoPromocional); | |
return descuento; | |
} | |
/** | |
* Obtiene el valor total del producto que se va a agregar | |
* @return | |
*/ | |
private float obtenerTotalAgregar(){ | |
int cantidad = Integer.parseInt(et_cantidad.getText().toString()); | |
float descuentoBase = Float.parseFloat(et_descuentoBase.getText().toString()); | |
float descuentoPromocional = Float.parseFloat(et_descuentoPromocional.getText().toString()); | |
Empaque empaque = (Empaque) sp_UnidadesMedida.getSelectedItem(); | |
return calcularTotal(cantidad, precioProductoSeleccionado, descuentoBase, descuentoPromocional, empaque); | |
} | |
/** | |
* Valida los campos campos necesarios para poder agregar una linea de producto | |
* @return | |
*/ | |
private boolean validarAgregar(){ | |
String cantidadString = (et_cantidad.getText().toString().equals(""))?"0":et_cantidad.getText().toString(); | |
String descuentoBaseString = (et_descuentoBase.getText().toString().equals(""))?"0":et_descuentoBase.getText().toString(); | |
String descuentoPromocionalString = (et_descuentoPromocional.getText().toString().equals(""))?"0":et_descuentoPromocional.getText().toString(); | |
Empaque empaque = (sp_UnidadesMedida.getCount()>0)? (Empaque) sp_UnidadesMedida.getSelectedItem() : null; | |
et_cantidad.setText(cantidadString); | |
et_descuentoBase.setText(descuentoBaseString); | |
et_descuentoPromocional.setText(descuentoPromocionalString); | |
int cantidad = Integer.parseInt(cantidadString); | |
float descuentoBase = Float.parseFloat(descuentoBaseString); | |
float descuentoPromocional = Float.parseFloat(descuentoPromocionalString); | |
return validarCampos(cantidad, descuentoBase, descuentoPromocional, codSubcanal, empaque); | |
} | |
/** | |
* Metodo para mostrar una notificacion Toast centrada en la pantalla | |
* @param mensaje texto que se desea mostrar en el Toast | |
*/ | |
private void mostrarMensaje(String mensaje){ | |
Toast toast = Toast.makeText(this,mensaje,Toast.LENGTH_SHORT); | |
toast.setGravity(Gravity.CENTER,0,0); | |
toast.show(); | |
} | |
/** | |
* Metodo encargado de realizar los calculos correspondientes | |
* para establecer el descuento, total y subtotal | |
*/ | |
private void realizarCalculos(){ | |
//Se obtienen los descuentos y la cantidad que el usuario digito | |
String descuentoBaseString = et_descuentoBase.getText().toString(); | |
String descuentoPromocionalString = et_descuentoPromocional.getText().toString(); | |
String cantidadString = et_cantidad.getText().toString(); | |
Empaque empaque = (sp_UnidadesMedida.getCount()>0)? (Empaque) sp_UnidadesMedida.getSelectedItem() : null; | |
//Se verifica que si no existe nada digitado, se iguale a cero (0) | |
descuentoBaseString = (descuentoBaseString.equals(""))?"0":descuentoBaseString; | |
descuentoPromocionalString = (descuentoPromocionalString.equals(""))?"0":descuentoPromocionalString; | |
cantidadString = (cantidadString.equals(""))?"0":cantidadString; | |
//Se convierten los descuentos y la cantidad a sus respectivos tipos de datos | |
float descuentoBase = Float.parseFloat(descuentoBaseString); | |
float descuentoPromocional = Float.parseFloat(descuentoPromocionalString); | |
float cantidad = Float.parseFloat(cantidadString); | |
float cantidadUnd = (empaque==null)? 0 : cantidad * empaque.getTipoEmpaque().getContenido(); | |
//Se verifica que los campos sean validos | |
if(validarCampos(cantidadUnd,descuentoBase,descuentoPromocional,codSubcanal,empaque)) | |
{ | |
//Se calculan los valores que se van a mostrar | |
float total = calcularTotal(cantidad, precioProductoSeleccionado, descuentoBase, descuentoPromocional,empaque); | |
float subtotal = (cantidad * empaque.getTipoEmpaque().getContenido()) * precioProductoSeleccionado; | |
float precioConIva = calcularPrecioConIva(precioProductoSeleccionado); | |
float valorDescuento = calcularValorDescuento(); | |
//Se muestran los valores en pantalla | |
tv_precio.setText(Conf_App.FORMATO_DECIMAL.format(precioConIva)); | |
tv_subtotal.setText(Conf_App.FORMATO_DECIMAL.format(subtotal)); | |
tv_total.setText(Conf_App.FORMATO_DECIMAL.format(total)); | |
tv_valorDescuento.setText(Conf_App.FORMATO_DECIMAL.format(valorDescuento)); | |
} | |
} | |
/** | |
* Calcula el precio total. (cantidad * precio con iva) y con los descuentos aplicados | |
* @param cantidad La cantidad que se esta pidiendo del producto | |
* @param precio El precio unitario del producto sin iva | |
* @param descuentoBase El descuento base digitado | |
* @param descuentoPromocional El descuento promocional digitado | |
* @param empaque El empaque (Unidad medida) que selecciono el usuario | |
* @return El valor toal. | |
*/ | |
public float calcularTotal(float cantidad, float precio, float descuentoBase, float descuentoPromocional,Empaque empaque){ | |
if (!tipoPedido.equals(Conf_App.TIPO_PEDIDO_OBSEQUIO)) | |
{ | |
float precioConDescuento = aplicarDescuento(precio); | |
float cantidadUnd = empaque.getTipoEmpaque().getContenido() * cantidad; | |
float total = calcularPrecioConIva(precioConDescuento*cantidadUnd); | |
return total; | |
} | |
return 0f; | |
} | |
/** | |
* Calucla el iva para un precio | |
* @param precio precio al que se le desea calcular el iva | |
* @return El precio con el iva incluido | |
*/ | |
private float calcularPrecioConIva(float precio){ | |
return precio * (1+(this.iva/100)); | |
} | |
/** | |
* Metodo para aplicarle el descuento total (descuento base y descuento promocional) a un valor | |
* @param valor valor al que se le desea aplicar el descuento | |
* @return valor con el descuento aplicado | |
*/ | |
private float aplicarDescuento(float valor){ | |
String descuentoBaseString = et_descuentoBase.getText().toString(); | |
String descuentoPromocionalString = et_descuentoPromocional.getText().toString(); | |
descuentoBaseString = (descuentoBaseString.equals(""))?"0":descuentoBaseString; | |
descuentoPromocionalString = (descuentoPromocionalString.equals(""))?"0":descuentoPromocionalString; | |
float descuentoBase = Float.parseFloat(descuentoBaseString)/100; | |
float descuentoPromocional = Float.parseFloat(descuentoPromocionalString)/100; | |
float descuentoTotal = (1-descuentoBase) * (1-descuentoPromocional); | |
return descuentoTotal * valor; | |
} | |
/** | |
* Metodo para calcular el valor del descuento (es decir cuanto dinero se esta descontando) | |
* por ejemplo si el precio del producto (sin iva) es de 2000, la cantidad es 1 y tiene un descuento base del 8% y uno promocional del 4% | |
* este metodo retornara 233,6 | |
* @return | |
*/ | |
private float calcularValorDescuento(){ | |
String descuentoBaseString = et_descuentoBase.getText().toString(); | |
String descuentoPromocionalString = et_descuentoPromocional.getText().toString(); | |
String cantidadString = et_cantidad.getText().toString(); | |
descuentoBaseString = (descuentoBaseString.equals(""))?"0":descuentoBaseString; | |
descuentoPromocionalString = (descuentoPromocionalString.equals(""))?"0":descuentoPromocionalString; | |
cantidadString = (cantidadString.equals(""))?"0":cantidadString; | |
float descuentoBase = Float.parseFloat(descuentoBaseString)/100; | |
float descuentoPromocional = Float.parseFloat(descuentoPromocionalString)/100; | |
int cantidad = Integer.parseInt(cantidadString); | |
float porcentajeDescuento = 1 - ( (1-descuentoBase) * (1-descuentoPromocional) ); | |
float precio = cantidad * precioProductoSeleccionado; | |
float valorDescuento = precio * porcentajeDescuento; | |
return valorDescuento; | |
} | |
/** | |
* Valida que los campos de cantidad, descuento base y descuento promocional sean correctos | |
* En caso de que sea correcto retorna true y en caso de que alguno de los campos este mal | |
* muestra un mensaje de error y retorna false, ademas de poner en 0 el campo con que tuvo problemas | |
* @param cantidad Cantidad digitada por el usuario | |
* @param descuentoBase Descuento base digitado por el usuario | |
* @param descuentoPromocional Descuento promocional digitado por el usuario | |
* @param codSubcanal Codigo del subcanal al cual pertenece el cliente que se le esta tomando el pedido | |
* @return True si son validos. False si son no son validos | |
*/ | |
private boolean validarCampos(float cantidad, float descuentoBase, float descuentoPromocional,String codSubcanal,Empaque empaque){ | |
if (empaque!= null) | |
{ | |
String validacionUnidadMinima = PedidosValidaciones.validarUnidadMinima(cantidad, productoSelected, this.tipoPedido); | |
String validacionDescuentoBase = PedidosValidaciones.validarDescuentoBase(descuentoBase, codSubcanal, productoSelected.getItem(), this, this.tipoPedido); | |
String validacionDescuentoPromocional = PedidosValidaciones.validarDescuentoPromocional(descuentoPromocional, productoSelected, this, this.tipoPedido,codSubcanal); | |
String OK = PedidosValidaciones.SUCCESS; | |
if (!validacionUnidadMinima.equals(OK)) | |
{ | |
et_cantidad.setText("0"); | |
mostrarMensaje(validacionUnidadMinima); | |
return false; | |
} | |
else if (!validacionDescuentoBase.equals(OK)) | |
{ | |
et_descuentoBase.setText("0"); | |
mostrarMensaje(validacionDescuentoBase); | |
return false; | |
} | |
else if (!validacionDescuentoPromocional.equals(OK)) | |
{ | |
et_descuentoPromocional.setText("0"); | |
mostrarMensaje(validacionDescuentoPromocional); | |
return false; | |
} | |
return true; | |
} | |
else | |
{ | |
mostrarMensaje("El producto no tiene codigo de empaque. No se pudo realizar el cálculo"); | |
return false; | |
} | |
} | |
public void setPrecioTotalPedido(float total){ | |
tv_totalPedido.setText(Conf_App.FORMATO_DECIMAL.format(total)); | |
} | |
/** | |
* Metodo que se ejecuta al llamar un metodo de un repositorio el cual se ejecuta en segundo plano | |
* @param nombreMetodo Nombre del metodo que se ejecuto en segundo plano | |
* @param resultado Objeto devuelto por el metodo que se ejecuto en segundo plano | |
*/ | |
@Override | |
public void consultaFinalizada(String nombreMetodo, Object resultado) { | |
if(nombreMetodo.equals(TipoPedidoRepository.METODO_OBTENER_TIPOS_DE_PEDIDO)) | |
{ | |
ArrayList<TipoPedido> tiposPedido = (ArrayList<TipoPedido>) resultado; | |
TipoPedido tipoPedidoDefault = tiposPedido.get(0); | |
setTipoPedido(tipoPedidoDefault.getTipo()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment