# Impuestos+Integración openShop
[TOC]
## Observaciones
1. Productos/Servicios que no necesitan shippings-methods
* Agregar casos especiales en logica del checkout
considerar un data-item o atributo para representar este estado.
2. Hooks a nivel de cambios de estados.
* Deberia poder generar mas de un hook para un estado
* Notificaciones de hooks en orden con una secuencia de pasos.
* Orden de peticiones, reitentos, etc. (revisar lo que se hizo en swipe en callback de pago) y almacenar informacion (url, data, registro de respuesta al hook)
```
ejemplo mailchimp
-> url: mail.chimp/notificacion
-> data: email, subject, ...
-> respuesta: "{ "status": ok }"
```
3. Agrupacion de productos/servicios en un solo boton de compra (checkout-cart)
* **Alternativa 1**: Implementación de lógica de agrupación por parte del cliente (construye un js que gatille las llamadas de los productos individuales)
* **Alternativa 2**: Botón que considere un "pack" de data-items de los productos individuales.
- Identificar un atributo data-item-xxx que tenga un set de ids de productos individuales que si existen en el DOM de la tienda
- El checkout-cart sera responsable de la lógica de interpretar esta agrupación y realizar las llamadas que correspondan.
- Se privilegiaría que esta agrupación se realice con un request x todos los productos en el "pack" y no uno individual x producto.
- Se debe considerar el boton "pack" de referencia para poder detectar cuales son los productos que deben si o si estar en este carrito.
4. Valor de IVA incluido y reflejar detalle de los impuestos
5. Intervalos/Duración del tiempo que compra el producto/servicio
## Impuestos
- **CASO 1**: con catalogo: valor viene con o sin impuesto, y el desglose de los impuestos.
- **CASO 2**: sin catalogo: valor viene con o sin impuesto, y el desglose de los impuestos (opcional).
```=html
data-item-tax-rate="0.5|0.1|0.02"
data-item-tax-name="IVA|CARNES|LICORES"
data-item-tax-rate="0.19"
data-item-tax-name="IVA"
10.000 price
5000 IVA(0.5)
1000 CARNES(0.1)
200 LICORES(0.02)
10.000 - 5.000 - 1.000 - 200 = 3800 sin impuestos
price - sum(price*tax)
<button hidden class="btn-individual"
*data-item-id="PA-B"
*data-item-name="PA-B"
*data-item-price="10000"
*data-item-qty="1"
data-item-minQuantity="1", // cantidad mínima de lo que se puede comprar
data-item-maxQuantity="10", // cantidad máxima de lo que se puede comprar
data-item-shippable="true|false" // si aplica o no metodo de envio
data-item-taxable="true|false" // por defecto viene en true (afecto o exento)
data-item-has-taxes-included="true|false" // el producto tiene agregado el impuesto o no.
data-item-taxes="0.5|0.001|0.02" // valor por posicion del data-item-tax-names
data-item-tax-names="IVA|CARNES|LICORES"
data-item-billing="1[+3000]|3[+2000]|6[+1500]|12[+1200]|24[+1000]|36[+500]" // valor del select, (meses: 1 3 6 12 24 36), el precio se le agrega al data-item-price
data-item-billing-options="Mensual|Trimestral|Semestral|Anual|Bianual|Trianual" //texto a mostrar del select values=> 0,1,2,3,4,5
data-item-billing-selected="2"> // selected Semestral
```
```
// data-items-id => podria ser alfanumerico (cambio en bd)
PA = APP
L = LECTOR
I = IMPRESORA
C = CHIP
T = TERMINAL
```
## Boton pack
Este boton envia de un solo click los productos que tiene en su `data-item-id-ref`
**Reversa:**
- Tendremos cada uno de los productos en la base de datos (es transaparente para el carrito)
- Validamos normal, ya que esos productos ingresados al carro como packs estaran igual que todos los demas
```=html
<button class="btn-pack"
data-item-id="pack-simpleboleta-01" // id del pack
data-item-id-ref="PA,I"> // referencia de todos los id que contiene ese pack
```
```=html
<button class="btn-pack"
data-item-id="pack-simpleboleta-02"
data-item-ref="PA,I,C">
```
# Preguntas
* Que pasa si un producto tiene shipping y otro no en un carrito.
* Si uno tiene, se debe seleccionar el shipping method, caso contrario directo al pago.
* Si no tiene catalogo utiliza envío gratis a todos los productos o tarifa plana.
* El producto no se envía porque es digital -> va a sección de pagos.
* Que pasara con la dependencia de productos, con este enfoque (el carrito permite tener múltiples items a diferencia del actual), le permitiremos comprar `n` cantidades por cada uno de los productos del carro?.
* Como vamos a solucionar los promotions? se lo delegamos a catalogo? si es asi, cómo?
* Consideraremos la opcion stackeable? que se trabajen los items diferenciados
# TO-DO
- Tener referencia del pack que compramos (a nivel de schema en servicios y bd).
- Actualizar bd para id de productos alfanumericos.
- Modificar MER(modelo entidad relación) con nuevos cambios.
- Incorporar nuevos data-items (checkout, order)
- Actualizar vistas de checkout-cart para incorporar selector de variantes de meses y desglose de impuestos, en caso de que aplique (podría existir que el usuario no configure sus impuestos)
- Incorporar nueva logica de procesamiento de items al checkout-cart (botones pack, billing, selectores)
- Incorporar lógica para checkout-backend (billings, shipping opcional, validaciones de packs y promo, impuestos)