def calcular_costos(cls, id): """ Recalcula los costos de un artículo, y su precio """ #Obtiene el articulo art = cls.get_by_id(id) #Calcula el nuevo costo de Insumos nuevoCostoIns = 0 for ins in art.insumos: nuevoCostoIns += DatosInsumo.get_costo_total( ins.idInsumo) * ins.cantidad #Si el nuevo costo de insumos es distinto al anterior if nuevoCostoIns != art.costoInsumos: art.costoTotal -= art.costoInsumos art.costoTotal += nuevoCostoIns art.costoInsumos = nuevoCostoIns #Se actualizan los costos de insumos y el total DatosArticulo.updateCostos(art.id, art.costoInsumos, art.costoTotal) #Y se actualiza el valor art.valor = art.costoTotal * (1 + art.margenGanancia) DatosValor.add(id, datetime.now().strftime('%Y-%m-%d %H:%M:%S'), art.valor)
def confirmar_produccion(cls, id, cant, kind): try: fecha = datetime.now() idNuevaProd = DatosProduccion.add(id, fecha, cant, kind) if kind == "art": #sumar stock art DatosArticulo.addStock(id, cant) #restar stock ins insumos = DatosCantInsumo.get_from_TAid(id) for i in insumos: DatosCantInsumo.addComponenteUtilizado( i.idInsumo, idNuevaProd, i.cantidad * cant) DatosInsumo.removeStock(i.idInsumo, i.cantidad * cant) elif kind == "ins": #sumar stock ins DatosInsumo.addStock(id, cant) #restar stock mat materiales = DatosCantMaterial.get_from_Insid(id) for m in materiales: DatosCantMaterial.addComponenteUtilizado( m.idMaterial, idNuevaProd, m.cantidad * cant) DatosMaterial.removeStock(m.idMaterial, m.cantidad * cant) except Exception as e: raise e
def delete(cls, id): """ Elimina un artículo de la BD a partir de su id """ try: DatosArticulo.delete(id) except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_articulo.delete()", msj=str(e), msj_adicional= "Error en la capa de Negocio eliminando un artículo de la base de Datos" )
def update(cls,idIns,nombre,unidad,costoMateriales,costoProduccion,otrosCostos,color,mats): """ Actualiza un insumo en la BD """ try: materiales = cls.get_by_id(int(idIns)).materiales for m in mats: if m.idMaterial in [i.idMaterial for i in materiales]: if m.cantidad == 0: # delete DatosCantMaterial.deleteComponente(m.idMaterial,idIns) print("Delete mat: " + str(m.idMaterial)) elif m.cantidad != [i.cantidad for i in materiales if i.idMaterial == m.idMaterial ][0]: # update DatosCantMaterial.updateComponente(m.idMaterial,idIns,m.cantidad) print("Update mat: " + str(m.idMaterial)) elif m.cantidad > 0: # add DatosCantMaterial.addComponente(m.idMaterial,idIns,m.cantidad) print("Add mat: " + str(m.idMaterial)) costoTotal = float(costoMateriales)+float(costoProduccion)+float(otrosCostos) DatosInsumo.update(idIns,nombre,unidad,costoMateriales,costoProduccion,otrosCostos,costoTotal,color) arts_afectados = DatosArticulo.get_arts_afectados(idIns) for idArt in arts_afectados: print("corrigiendo valor de articulo: ",str(idArt)) NegocioArticulo.calcular_costos(idArt) except Exception as e: raise(e)
def add(cls, carrito, usuario, idPR, totalEP, totalARS): #verificaciones for art in carrito: NegocioArticulo.checkStock(art.idTipoArticulo, art.cantidad) NegocioUsuario.checkEP(usuario.id, totalEP) #Pedido puntoRetiro = DatosPuntoRetiro.get_by_id(idPR) fechaEnc = datetime.now() fechaRet = fechaEnc + timedelta(days=puntoRetiro.demoraFija) idPedido = DatosPedido.add(fechaEnc, fechaRet, totalEP, totalARS, idPR, usuario.id) #EcoPuntos nuevos_ep = NegocioUsuario.useEP(usuario.id, totalEP) #Nivel NegocioUsuario.update_nivel(usuario.id, nuevos_ep) #Articulos y Stock for art in carrito: NegocioArticulo.disminuirStock(art.idTipoArticulo, art.cantidad) mg = DatosArticulo.get_margen_ganancia(art.idTipoArticulo) DatosCantArticulo.addArticuloPedido(art.idTipoArticulo, idPedido, art.cantidad, mg) return idPedido
def calcular_costos(cls,id): """ Recalcula los costos de un insumo """ #Obtiene el insumo ins = cls.get_by_id(id) #Calcula el nuevo costo de Materiales nuevoCostoMat = 0 for mat in ins.materiales: nuevoCostoMat += DatosMaterial.get_costo_rec(mat.idMaterial)*mat.cantidad #Si el nuevo costo de insumos es distinto al anterior if nuevoCostoMat != ins.costoMateriales: ins.costoTotal -= ins.costoMateriales ins.costoTotal += nuevoCostoMat ins.costoMateriales = nuevoCostoMat #Se actualizan los costos de insumos y el total DatosInsumo.updateCostos(ins.id,ins.costoMateriales,ins.costoTotal) #Y se actualizan los arts afectados arts_afectados = DatosArticulo.get_arts_afectados(ins.id) for idArt in arts_afectados: print("corrigiendo valor de articulo: ",str(idArt)) NegocioArticulo.calcular_costos(idArt)
def update_estado(cls, id, estado): try: DatosPedido.update_estado(id, estado) if estado == "cancelado": result = DatosPedido.get_one(id) pedido = result[0] id_usuario = result[1] #Devovler EPs a User NegocioUsuario.addEP(id_usuario, pedido.totalEP) #Devolver Stock al articulo for art in pedido.articulos: DatosArticulo.addStock(art.idTipoArticulo, art.cantidad) except Exception as e: raise e
def checkStock(cls, idTA, cant): articulo = DatosArticulo.get_by_id(idTA) nueva_cant = articulo.stock - cant if nueva_cant < 0: raise custom_exceptions.ErrorDeNegocio( origen="negocio_articulo.disminuirStock()", msj="error-stock", msj_adicional="Stock insuficiente para realizar pedido")
def update(cls, idArt, nombre, unidad, ventaUsuario, costoInsumos, costoProduccion, otrosCostos, costoObtencionAlt, margen, valor, ins): """ Actualiza un articulo en la BD """ try: insumos = cls.get_by_id(int(idArt)).insumos for i in ins: if i.idInsumo in [j.idInsumo for j in insumos]: if i.cantidad == 0: # delete DatosCantInsumo.deleteComponente(i.idInsumo, idArt) print("Delete ins: " + str(i.idInsumo)) elif i.cantidad != [ j.cantidad for j in insumos if j.idInsumo == i.idInsumo ][0]: # update DatosCantInsumo.updateComponente( i.idInsumo, idArt, i.cantidad) print("Update ins: " + str(i.idInsumo)) elif i.cantidad > 0: # add DatosCantInsumo.addComponente(i.idInsumo, idArt, i.cantidad) print("Add mat: " + str(i.idInsumo)) costoTotal = float(costoInsumos) + float(costoProduccion) + float( otrosCostos) margen = float(margen) / 100 DatosArticulo.update(idArt, nombre, unidad, ventaUsuario, costoInsumos, costoProduccion, otrosCostos, costoObtencionAlt, margen, costoTotal) valor_anterior = DatosValor.get_from_TAid(idArt) if valor_anterior[2] != float(valor): DatosValor.add(idArt, datetime.now().strftime('%Y-%m-%d %H:%M:%S'), valor) except Exception as e: raise (e)
def get_movimientos_stock(cls, id, stock): """ Obtiene los movimientos de stock de un artículo durante el último año en base a su ID, recibiendo stock actual como parámetro. """ try: return DatosArticulo.get_movimientos_stock(id, stock)[::-1] except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_articulo.get_movimientos_stock()", msj=str(e), msj_adicional= "Error en la capa de Negocio obteniendo los movimientos de stock de la base de Datos" )
def get_by_not_in_id_array(cls, ids): """ Obtiene TiposArticulos de la BD en base a los que no estan en una lista de IDs """ try: articulos = DatosArticulo.get_by_not_in_id_array(ids) return articulos except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_articulo.get_by_not_in_id_array()", msj=str(e), msj_adicional= "Error en la capa de Negocio obtieniendo tipos de articulo de la capa de Datos." )
def get_by_id(cls, id): """ Obtiene un TipoArticulo de la BD segun su ID """ try: articulo = DatosArticulo.get_by_id(id) return articulo except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_articulo.get_by_id()", msj=str(e), msj_adicional="Error en la capa de Negocio\ obtieniendo un tipo de articulo de \ la capa de Datos.")
def get_all(cls, noFilter=False): """ Obtiene todas los tipos de articulo de la BD. """ try: articulos = DatosArticulo.get_all(noFilter) return articulos except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_articulo.get_all()", msj=str(e), msj_adicional="Error en la capa de Negocio\ obtieniendo los tipos de articulo de \ la capa de Datos.")
def add(cls, nombre, unidad, ventaUsuario, costoInsumos, costoProduccion, otrosCostos, costoObtencionAlt, margen, valor, cants, desc): """ Agrega un articulo a la BD """ try: costoTotal = float(costoInsumos) + float(costoProduccion) + float( otrosCostos) margen = float(margen) / 100 idArt = DatosArticulo.add(nombre, unidad, ventaUsuario, costoInsumos, costoProduccion, otrosCostos, costoObtencionAlt, margen, costoTotal, desc) DatosValor.add(idArt, datetime.now().strftime('%Y-%m-%d %H:%M:%S'), valor) for c in cants: DatosCantInsumo.addComponente(c["idIns"], idArt, c["cantidad"]) return idArt except Exception as e: raise (e)
def get_nombres_by_idIns(cls, idIns): try: return DatosArticulo.get_nombres_by_idIns(idIns) except Exception as e: raise e
def cant_vendidos_mes_actual(cls, aid): try: return DatosArticulo.cant_vendidos_mes_actual(aid) except Exception as e: raise e
def update_desc(cls, aid, desc): try: DatosArticulo.update_desc(aid, desc) except Exception as e: raise e
def update_img(cls, aid, img): try: DatosArticulo.update_img(aid, img) except Exception as e: raise e
def get_recommendations(cls, id_articulo, carrito): filtro = [id_articulo] + [i.idTipoArticulo for i in carrito] return DatosArticulo.get_by_not_in_id_array_user(filtro, 4)
def disminuirStock(cls, idTA, cant): nueva_cant = DatosArticulo.get_by_id(idTA).stock - cant DatosArticulo.updateStock(idTA, nueva_cant)