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 add_one(cls, idMaterial, cant, concepto, fecha): try: format_str = '%Y-%m-%d' # Formato de la fecha fecha = datetime.strptime(fecha, format_str) if DatosEntradaExterna.add_one(idMaterial, cant, concepto, fecha): DatosMaterial.addStock(idMaterial, float(cant)) except Exception as e: raise e
def update_desc(cls, idMat, desc): """ Actualiza la desc de un material en la BD """ try: DatosMaterial.update_desc(idMat, desc) except Exception as e: raise (e)
def alta(cls, id_mat,id_pd,cantidad,cant_ep): """ Añade un nuevo depósito. """ try: DatosMaterial.addStock(id_mat,cantidad) return DatosDeposito.add(int(id_mat),int(id_pd),float(cantidad),float(cant_ep)) except Exception as e: raise e
def add(cls, nombre, unidad, costoRecoleccion, color, estado, desc): """ Agrega un material a la BD """ try: DatosMaterial.add(nombre, unidad, costoRecoleccion, color, estado, desc) except Exception as e: raise (e)
def delete(cls, id): """ Elimina un material de la BD a partir de su id """ try: DatosMaterial.delete(id) DatosCantMaterial.deshabilitar(id, True) except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_material.delete()", msj=str(e), msj_adicional= "Error en la capa de Negocio eliminando un material de la base de Datos" )
def update(cls, idMat, nombre, unidad, costoRecoleccion, color, estado): """ Actualiza un material en la BD """ try: DatosMaterial.update(idMat, nombre, unidad, costoRecoleccion, color, estado) ins_afectados = DatosInsumo.get_ins_afectados(idMat) for idIns in ins_afectados: print("corrigiendo valor de insumo: ", str(idIns)) NegocioInsumo.calcular_costos(idIns) except Exception as e: raise (e)
def get_materialesPd_by_id(cls, idPunto, json_return=True): """ Obtiene los materiales que acepta un punto de depósito en base al ID que recibe como parámetro. """ #Conexión con el motor de BD. try: materiales = DatosMaterial.get_all_byIdPuntoDep(idPunto) materiales_ = [] if json_return == False: return materiales else: for material in materiales: materiales_.append({ "id": material.id, "nombre": material.nombre, "unidadMedida": material.unidadMedida, "color": material.color, "estado": material.estado }) return materiales_ except custom_exceptions.ErrorDeConexion as e: raise e except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio.get_materialesPd_by_id()", msj=str(e), msj_adicional= "Error en la capa de Negocio obtieniendo los materiales que acepta un PD de la capa de Datos." )
def get_by_id(cls, id): """ Obtiene un Punto de Depósito de la BD segun su ID. """ try: cls.abrir_conexion() sql = ( "select * from puntosDeposito where estadoEliminacion = 'disponible' AND idPunto={} order by nombre ASC" ).format(id) cls.cursor.execute(sql) punto = cls.cursor.fetchall()[0] #Se instancia sin los horarios ya que no se muestran, para no generar tráfico de datos innecesario. direccion = DatosDireccion.get_one_id(punto[4]) materiales_ = DatosMaterial.get_all_byIdPuntoDep(punto[0], True) materiales = [] for mat in materiales_: materiales.append(mat.id) pd = PuntoDeposito(punto[0], direccion, punto[1], punto[2], materiales, None) return pd except Exception as e: raise custom_exceptions.ErrorDeConexion( origen="data.get_by_id()", msj=str(e), msj_adicional= "Error obteniendo un Punto de Depósito desde la BD.") finally: cls.cerrar_conexion()
def get_all_sin_filtro(cls, noClose=False): """ Obtiene todos los Puntos de Depósito de la BD. """ try: cls.abrir_conexion() sql = ("select * from puntosDeposito order by nombre ASC") cls.cursor.execute(sql) puntosDeposito = cls.cursor.fetchall() puntosDeposito_ = [] for punto in puntosDeposito: #Se instancia sin los horarios ya que no se muestran, para no generar tráfico de datos innecesario. if punto[3] == 'eliminado': direccion = None else: direccion = DatosDireccion.get_one_id(punto[4]) materiales_ = DatosMaterial.get_all_byIdPuntoDep( punto[0], True) materiales = [] for mat in materiales_: materiales.append(mat.id) puntosDeposito_.append( PuntoDeposito(punto[0], direccion, punto[1], punto[2], materiales, None)) return puntosDeposito_ except Exception as e: raise custom_exceptions.ErrorDeConexion( origen="data.get_all()", msj=str(e), msj_adicional="Error otodos los Puntos de Depósito desde la BD." ) finally: if not (noClose): cls.cerrar_conexion()
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 get_by_id(cls, id): """ Obtiene un Material de la BD segun su ID """ try: material = DatosMaterial.get_by_id(id) return material except Exception as e: raise e
def get_info_cancelar(cls, id): errores = {"EP":-1,"Stock":0} dep = DatosDeposito.get_by_id(id) if dep.isAcreditado(): errores["EP"] = 0 user_id = cls.get_user_id(id) user = NegocioUsuario.get_by_id(user_id) if user.totalEcopuntos < dep.ecoPuntos.cantidad: errores["EP"] = dep.ecoPuntos.cantidad-user.totalEcopuntos material = DatosMaterial.get_by_id(dep.material.idMaterial) if material.stock < dep.material.cantidad: errores["Stock"] = dep.material.cantidad-material.stock return errores
def get_movimientos_stock(cls, id, stock): """ Obtiene los movimientos de stock de un material durante el último año en base a su ID, recibiendo stock actual como parámetro. """ try: return DatosMaterial.get_movimientos_stock(id, stock)[::-1] except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_material.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 cancelar(cls,id): """ Cancela un depósito. Si el depósito ha sido acreditado, los EP se le restan al usuario. Si el usuario no tiene suficientes EP para restar, se lo deja en 0 EP. Se descuenta, asimismo, el stock de materiales generado por el deposito. Si no hay suficiente stock para restar, se genera una entrada correspondiente al stock faltante """ try: dep = DatosDeposito.get_by_id(id) DatosDeposito.update_estado(id,"cancelado") if dep.isAcreditado(): user_id = cls.get_user_id(id) NegocioUsuario.descontarEPDeposito(user_id,dep.ecoPuntos.cantidad) material = DatosMaterial.get_by_id(dep.material.idMaterial) if material.stock >= dep.material.cantidad: DatosMaterial.updateStock(material.id,material.stock - dep.material.cantidad) else: DatosMaterial.updateStock(material.id,0) restante = dep.material.cantidad-material.stock DatosEntradaExterna.add_one(material.id,restante,"Compensación por cancelación de depósito número "+str(id)+".",datetime.now()) except Exception as e: raise e
def get_all(cls, noFilter=False): """ Obtiene todos los materiales de la BD. """ try: materiales = DatosMaterial.get_all(noFilter) return materiales except Exception as e: raise custom_exceptions.ErrorDeNegocio( origen="negocio_materiales.get_all()", msj=str(e), msj_adicional= "Error en la capa de Negocio obteniendo los materiales de la capa de Datos." )