Skip to content

Instantly share code, notes, and snippets.

@viktor1190
Created September 1, 2015 21:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save viktor1190/d5c812c660fba37a70a0 to your computer and use it in GitHub Desktop.
Save viktor1190/d5c812c660fba37a70a0 to your computer and use it in GitHub Desktop.
Clase para digitar producto
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