def calculate_stock(self): try: diary_data_for_stock = crud_driver( self, 'diary', 'read', { 'pick_all': False, 'multi': False, 'pick_cols': ['*'], 'field': 'item_code', 'operator': '<>', 'order_by': ['is_new', 'date'], 'order_': ['DESC', 'ASC' ], # is_new is mandatory to be sorted desc 'sort': True, 'value': ('', ) }) data_tuples_for_stock = data_tuple_for_stock_builder( self, diary_data_for_stock) crud_driver(self, 'stock', 'delete', None) crud_driver( self, 'stock', 'create', { 'multi': True, 'fields': get_template_fields('stock'), 'value_list': data_tuples_for_stock }) return except BaseException as err: print('error on generating sales table: {}'.format(err)) raise Exception(str(err))
def calculate_capital(self): try: diary_data_for_capital = crud_driver( self, 'diary', 'read', { 'pick_all': False, 'multi': False, 'pick_cols': ['*'], 'field': 'amount', 'operator': '<>', 'order_by': ['id', 'date'], 'order_': ['ASC', 'ASC'], 'sort': True, 'value': (0, ) }) capital_data = translate_diary_data_to_table(self, 'capital', diary_data_for_capital) crud_driver(self, 'capital', 'delete', None) crud_driver( self, 'capital', 'create', { 'multi': True, 'fields': get_template_fields('capital'), 'value_list': capital_data }) return except BaseException as err: print('error on generating sales table: {}'.format(err)) raise Exception(str(err))
def status_loader_routine(self): print('loading previous status....') try: connect_toDB(self, statusDB_name, False, True) status = crud_driver(self, 'saved_status', 'read', {'pick_all': True}) print('done.....') connect_toDB(self, status[-1][0], True, False) # print('debug: status found: {}'.format(dict(list(zip(status_props,status[-1]))))) return dict(list(zip(status_props, status[-1]))) except BaseException as err: print('not found....\nreturning default values') return default_status
def status_saver_routine(self, silent=False): current_database = self.status.get('connected_to') connect_toDB(self, statusDB_name, False, True) try: # print('debug: attempting to create new table for saving app status') create_tables_onDb(self, status_table_template) except sqlite3.Error as error: print('info: %s' % error) self.status.update({'connected_to': current_database }) # if this step is ommited c_to is appStatus crud_driver(self, 'saved_status', 'delete', None) crud_driver( self, 'saved_status', 'create', { 'multi': False, 'fields': list(self.status.keys()), 'value': tuple(self.status.values()) }) print('status saved....') connect_toDB(self, current_database, False, silent) return
def import_data_to_diary(self): try: import_data( self, False) # imports the data and writes the array self.imported_data transform_imported_data(self, 'diary', 'entry_counter', entry_counter_creator) data_to_import = self.imported_data.copy() crud_driver( self, 'diary', 'create', { 'fields': get_template_fields('diary'), 'value_list': data_to_import, 'multi': True }) self.display_table_signal.emit() selfCloseInterface('Data imported to Diary Table', 3, 1, 'Import Success') return except BaseException as error: selfCloseInterface('Failed on Importing Data to Diary Table', 3, 2, 'Import Failed', str(error)) print('failed import of data') raise error
def execute_display_table(self, table_name): self.table_on_target = table_name self.headers_for_tab1 = get_template_fields(table_name) if table_name != 'diary': self.recalculate_tables_signal.emit() # what else?? self.data_to_display_on_tab1 = crud_driver(self, table_name, 'read', {'pick_all': True}) self.display_table_signal.emit() self.ui.tabWidget.setCurrentIndex(0) selfCloseInterface( 'tabla: {} ha sido cargada con exito'.format(table_name), 1, 1, 'Ver {}'.format(table_name)) return
def data_loader(self, parent): self.combo_data.clear() self.combo_data.extend( crud_driver( parent, 'stock', 'read', { 'pick_all': False, 'pick_cols': ['item_code', 'item_name', 'on_stock', 'price'], 'field': 'on_stock', 'operator': '>=', 'sort': True, 'order_by': ['item_name'], 'order_': ['ASC'], 'value': (1, ) }))
def data_loader(self, parent): self.combo_data.clear() self.combo_data.extend( crud_driver(parent, 'stock', 'read', { 'pick_all': False, 'pick_cols': ['item_code', 'item_name', 'price'], })) self.ui.codigoDelItemIncrementadoComboBox.clear() self.ui.codigoDelItemIncrementadoComboBox.addItems( list((r[0] for r in self.combo_data)) ) self.ui.nombreDelItemIncrementadoComboBox.clear() self.ui.nombreDelItemIncrementadoComboBox.addItems( list((r[1] for r in self.combo_data)) )
def export_data_from_diary(self): # steps: # 1- read the diary table # 2- export the data using export function. try: filename_path = export_data( self, crud_driver(self, 'diary', 'read', {'pick_all': True})) print('data saved on {}'.format(filename_path)) selfCloseInterface('Diary Table Data Exported ', 6, 1, 'Export Success', 'Data saved on: {}'.format(filename_path)) return except BaseException as error: print('export failed : {}'.format(error)) selfCloseInterface('Failed on Exporting Data from Diary Table', 4, 2, 'Export Failed') raise Exception(error)
def on_import_button_clicked(self, parent): user_is_aware_of_format = {'value': False} aware_of_format_dialog = MessageBox( lambda: user_is_aware_of_format.update({'value': True}), 'El formato de la tabla que va a importar debe ser\n' 'producto_pagado | nombre | total_invertido | cantidad\n' 'ademas de esto la tabla no debe tener encabezados de campos\n\n' 'si el formato de la tabla no coincide con lo descrito o usted ' 'no esta seguro, debe cancelar la importacion para evitar errores de datos', 'q', 'Alerta sobre formato', '\n\ndesea continuar con la importacion?') aware_of_format_dialog.exec_() if not user_is_aware_of_format.get('value'): return file_to_import = QFileDialog.getOpenFileName( self, 'Seleccione Bloque de Compras', os.pardir, '*.csv' ) data_to_import = list(( line.replace('\n', '') .replace('"', '') .split(';') for line in open(file_to_import[0]).readlines() )) total_to_pay = eval(str.join(' + ', list((str(item[2]) for item in data_to_import)))) cash__ = get_index_in_template('diary', 'cash_') last_row_data__ = crud_driver(parent, 'diary', 'read', {})[-1] if last_row_data__[cash__] < total_to_pay: return selfCloseInterface( 'la compra que desea realizar no puede ser completada\n' 'la cantidad de dinero en caja es: $ {:,.2f}\n' 'el total de la compra es: $ {:,.2f}\n\n' 'le falta: $ {:,.2f}'.format( float(last_row_data__[cash__]), float(total_to_pay), float(total_to_pay) - float(last_row_data__[cash__]) ), 20, 2, 'Compra Denegada', 'Vaya a:\nMenu > Herramientas > Modificar inversion\n' 'y aumente la cantidad de dinero disponible para cubrir la suma' ) else: for index, purchase in enumerate(data_to_import): self.accept_routine(parent, True, purchase) selfCloseInterface( 'procesando datos {} de {} ...'.format(index, len(data_to_import)), 0.3,1,'Procesando') selfCloseInterface('Operacion de Compra en Bloque realizada con exito', 4, 1, 'Compra Realizada') return
def calculate_statistics(self): try: last_row_on_diary = crud_driver(self, 'diary', 'read', {})[-1] capital_total = last_row_on_diary[get_index_in_template( 'diary', 'total_')] capital_invertido = last_row_on_diary[get_index_in_template( 'diary', 'invested_')] cash_en_caja = last_row_on_diary[get_index_in_template( 'diary', 'cash_')] session_resume = crud_driver( self, 'diary', 'raw_exec', { 'raw_exec': 'SELECT TOTAL(sell_price), TOTAL(price), TOTAL(salary) FROM diary WHERE is_sale = ? AND date = ? ', 'value': (True, self.date_session) })[0] session_consignations = crud_driver( self, 'diary', 'raw_exec', { 'raw_exec': 'SELECT TOTAL(price) FROM diary WHERE is_consignation = ? AND is_sale = ? AND date = ? ', 'value': (True, True, self.date_session) })[0][0] ventas_del_dia = session_resume[0] if session_resume[ 0] is not None else 0 retorno_inversion = (float(session_resume[1]) - float(session_consignations) ) if session_resume[1] is not None else 0 ganancias_netas = float(ventas_del_dia) - float( retorno_inversion) - float(session_consignations) salario_total = session_resume[2] if session_resume[ 2] is not None else 0 renta = 125 # ajustar este valor luego desde el dialog ganancias_reales_comun = ganancias_netas - renta - float(salario_total) ganancias_reales_parte = ganancias_reales_comun / 2 compras_del_dia = crud_driver( self, 'diary', 'raw_exec', { 'raw_exec': 'SELECT TOTAL(total_per_item(price,quantity)) FROM diary WHERE is_sale = ? AND is_consignation = ? AND date = ? AND item_code <> ? ', 'value': (False, False, self.date_session, '') })[0][0] compras_del_dia = compras_del_dia if compras_del_dia is not None else 0 # todo a la hora de implementar los filtros de tiempo en los datos de las estadisticas # es aqui donde se deben manipular los datos para lograr que dichos filtros funcionen. totals_resume = crud_driver( self, 'diary', 'raw_exec', { 'raw_exec': 'SELECT TOTAL(sell_price), TOTAL(price), TOTAL(salary) FROM diary WHERE is_sale = ?', 'value': (True, ) })[0] __rent_tot = crud_driver( self, 'diary', 'raw_exec', {'raw_exec': 'SELECT COUNT( DISTINCT date) FROM diary '})[0][0] ventas_totales = float( totals_resume[0]) if totals_resume[0] is not None else 0 __invert_tot = float( totals_resume[1]) if totals_resume[1] is not None else 0 __sal_tot = float( totals_resume[2]) if totals_resume[2] is not None else 0 ganancias_totales = ventas_totales - __invert_tot ganancias_reales_totales = ganancias_totales - __sal_tot - 125 * __rent_tot invertido_total = last_row_on_diary[get_index_in_template( 'diary', 'total_')] capital_de_robert = last_row_on_diary[get_index_in_template( 'diary', 'robert_')] capital_de_ariadna = last_row_on_diary[get_index_in_template( 'diary', 'ariadna_')] return (capital_total, capital_invertido, cash_en_caja, ventas_del_dia, retorno_inversion, ganancias_netas, salario_total, renta, ganancias_reales_comun, ganancias_reales_parte, compras_del_dia, ventas_totales, ganancias_totales, ganancias_reales_totales, invertido_total, capital_de_robert, capital_de_ariadna, session_consignations) except: return tuple((0 / i for i in range(1, 19)))
def apply_routine(self, parent): # props alias... data_len__ = get_template_fields('diary') date__ = get_index_in_template('diary', 'date') is_new__ = get_index_in_template('diary', 'is_new') is_sale__ = get_index_in_template('diary', 'is_sale') is_consignation__ = get_index_in_template('diary', 'is_consignation') quantity__ = get_index_in_template('diary', 'quantity') item_name__ = get_index_in_template('diary', 'item_name') price__ = get_index_in_template('diary', 'price') sell_price__ = get_index_in_template('diary', 'sell_price') comments__ = get_index_in_template('diary', 'comments') item_code__ = get_index_in_template('diary', 'item_code') salary__ = get_index_in_template('diary', 'salary') invested__ = get_index_in_template('diary', 'invested_') cash__ = get_index_in_template('diary', 'cash_') total__ = get_index_in_template('diary', 'total_') parts__ = [ get_index_in_template('diary', 'robert_'), get_index_in_template('diary', 'ariadna_') ] last_row_data__ = crud_driver(parent, 'diary', 'read', {}) last_row_data = build_data_template() if len( last_row_data__) == 0 else last_row_data__[-1] last_row_data = build_data_template( ) if len(data_len__) > len(last_row_data) else last_row_data data = build_data_template() # this block is for preventing sales form to be submitted with invalid data # protect against zero items sale if self.ui.cantidadVendidaComboBox.currentIndex() == 0: selfCloseInterface( 'No esta permitido vender "cero" {},defina una cantidad adecuada antes de hacer la operacion' .format(self.ui.nombreDelProductoComboBox.currentText()), 8, 3, 'Venta Denegada: CANTIDAD INCORRECTA', 'la menor cantidad admitida es 1, si no puede, significa que el producto se ha agotado' ) self.init_ui(parent) # init ui for clean zero items... return # protect against low price sales minimum_sell_price = self.ui.cantidadVendidaComboBox.currentIndex( ) * float(self.combo_data[ self.ui.codigoDelProductoComboBox.currentIndex()][3]) if self.ui.precioDeVentaDoubleSpinBox.value() < minimum_sell_price: low_price_switch = {'switch': False} low_price_warn = MessageBox( lambda: low_price_switch.update({'switch': True}), 'Esta seguro de que desea vender {} {} por ${:,.2f} ??' '\nel precio minimo para esta cantidad es ${:,.2f}.' '\nSi realiza la venta a este precio ocasiona perdidas !!'. format(self.ui.cantidadVendidaComboBox.currentText(), self.ui.nombreDelProductoComboBox.currentText(), self.ui.precioDeVentaDoubleSpinBox.value(), minimum_sell_price), 'w', 'Advertencia: Venta por debajo del precio de costo', '\n\n Esta accion es intencional y desea continuar??') low_price_warn.show() if not low_price_switch.get('switch'): return # protect against sale more than on_stock on_stock__ = int( crud_driver( parent, 'stock', 'read', { 'field': 'item_code', 'operator': '=', 'value': (self.ui.codigoDelProductoComboBox.currentText(), ) })[0][get_index_in_template('stock', 'on_stock')]) if on_stock__ < 1: selfCloseInterface( 'El producto {} no existe en el inventario en este momento,' 'revise el nombre del producto antes de hacer la operacion'. format(self.ui.nombreDelProductoComboBox.currentText()), 8, 3, 'Venta Denegada: PRODUCTO NO EXISTE', 'Es muy probable que el producto se haya agotado en la ultima entrada. Verifique el nombre otra vez' ) self.init_ui(parent) # init ui for clean zero items... return data[date__] = parent.date_session data[is_new__] = False data[is_sale__] = True data[ is_consignation__] = self.ui.codigoDelProductoComboBox.currentText( )[0] == 'c' data[quantity__] = self.ui.cantidadVendidaComboBox.currentIndex() data[item_name__] = self.ui.nombreDelProductoComboBox.currentText() data[price__] = minimum_sell_price data[sell_price__] = self.ui.precioDeVentaDoubleSpinBox.value() data[comments__] = self.ui.comentariosLineEdit.text() data[item_code__] = self.ui.codigoDelProductoComboBox.currentText() data[salary__] = build_salary(parent, data[sell_price__], minimum_sell_price) # capital cells # touches invested data[parts__[0]] = last_row_data[parts__[0]] data[parts__[1]] = last_row_data[parts__[1]] data[total__] = float(last_row_data[total__]) data[invested__] = float(last_row_data[invested__]) if \ data[is_consignation__] else (float(last_row_data[invested__]) - data[price__]) data[cash__] = data[total__] - data[invested__] # this is the secure entry block msg_str = 'vender {} {} por ${:,.2f}'.format(data[quantity__], data[item_name__], data[sell_price__]) if parent.use_secure_entry: confirm = MessageBox(lambda: parent.append_data_to_diary(data), 'Desea confirmar la Entrada?', 'q', 'Confirmar Entrada', msg_str) confirm.show() else: parent.append_data_to_diary(data) selfCloseInterface(msg_str, 4, 1, 'Operacion Realizada', 'Cambios Insertados en la Base de Datos') self.init_ui(parent) return
def ui_init_routine(self): self.status = status_loader_routine(self) status_saver_routine(self, True) if self.status.get('last_date') == current_date: self.counter = self.status.get('counter') self.status.update({'last_date': current_date}) # self.data_to_display_on_tab1 = crud_driver( # on init shows diary on current_date entries # self, 'diary', 'raw_exec', { # 'raw_exec': 'SELECT * FROM diary WHERE entry_counter REGEXP ?', # 'value': ('{}'.format(current_date).replace('-',''),) # }) self.data_to_display_on_tab1 = crud_driver( self, 'diary', 'read', { 'pick_all': False, 'multi': False, 'pick_cols': ['*'], 'field': 'entry_counter', 'operator': 'REGEXP', 'order_by': ['entry_counter'], 'order_': ['ASC', 'ASC'], 'sort': True, 'value': ('{}'.format(current_date).replace('-', ''), ) }) set_menus(self) app_clock(self, self.ui.label_app_clock) set_calculator(self) set_bill_calculator(self) # ui initialization self.ui.tabWidget.setCurrentIndex(self.status.get('active_tab')) self.ui.label_data_session.setText(self.date_session) self.ui.label_table_on_display.setText(self.table_on_target) self.ui.label_current_database.setText(self.status.get('connected_to')) # signal connections self.date_changed_signal.connect(self.change_date_session) self.connected_signal.connect( lambda db__: self.ui.label_current_database.setText(db__)) self.resized_signal.connect(self.save_window_size) self.counter_updated_signal.connect(lambda: update_counter(self)) self.display_table_signal.connect( lambda: display_active_table_on_data_display(self)) if self.ui.tabWidget.currentIndex() == 0: self.display_table_signal.emit() self.recalculate_tables_signal.connect( lambda: calculate_auxiliar_tabs(self)) self.recalculate_tables_signal.connect( lambda: display_statistics_on_tab(self)) if self.ui.tabWidget.currentIndex() == 2: self.recalculate_tables_signal.emit() self.ui.tabWidget.currentChanged.connect( lambda i: tab_index_reaction(self, i)) # tab1 buttons self.ui.pushButton_export_table.clicked.connect( lambda: export_data_displayed_on_tab1(self)) self.ui.toolButton_filter.clicked.connect( lambda: filter_active_table(self)) # statistics tab buttons self.ui.pushButton_update_stats_tab.clicked.connect( lambda: display_statistics_on_tab(self)) self.ui.pushButton_update_stats_tab.clicked.connect( lambda: selfCloseInterface( 'Estadisticas Actualizadas', alert_level=1, title='Completado!'))
def accept_routine(self, parent, is_bulk=False, bulk_data=None): # props alias... data_len__ = get_template_fields('diary') date__ = get_index_in_template('diary', 'date') is_new__ = get_index_in_template('diary', 'is_new') is_sale__ = get_index_in_template('diary', 'is_sale') is_consignation__ = get_index_in_template('diary', 'is_consignation') quantity__ = get_index_in_template('diary', 'quantity') item_name__ = get_index_in_template('diary', 'item_name') price__ = get_index_in_template('diary', 'price') sell_price__ = get_index_in_template('diary', 'sell_price') comments__ = get_index_in_template('diary', 'comments') item_code__ = get_index_in_template('diary', 'item_code') # -- invested__ = get_index_in_template('diary', 'invested_') cash__ = get_index_in_template('diary', 'cash_') total__ = get_index_in_template('diary', 'total_') parts__ = [get_index_in_template('diary', 'robert_'), get_index_in_template('diary', 'ariadna_')] last_row_data__ = crud_driver(parent, 'diary', 'read', {}) last_row_data = build_data_template() if len(last_row_data__) == 0 else last_row_data__[-1] last_row_data = build_data_template() if len(data_len__) > len(last_row_data) else last_row_data data = build_data_template() # this block is for preventing purchases with no cash if last_row_data[cash__] <= 0: selfCloseInterface( 'No esta permitido comprar cuando el saldo de caja es cero, agregue saldo a su caja antes de hacer esta operacion', 8, 3, 'Compras Denegadas: SIN EFECTIVO', 'Vaya a:\nMenu Herramientas > Modificar la Inversion\nO presione: CTRL+ALT+M \ny agregue efectivo antes de comprar') self.reject() parent.ui.actionModificar_la_inversion.trigger() return data[date__] = parent.date_session data[is_new__] = self.ui.nuevoItemPurchaseCheckBox.isChecked() if not is_bulk else True data[is_sale__] = False data[is_consignation__] = self.ui.itemAConsignacionCheckBox.isChecked() if\ not is_bulk else not int(bulk_data[0]) data[quantity__] = self.ui.totalDeItemsCompradosSpinBox.value() if not is_bulk else int(bulk_data[3]) if not is_bulk: data[item_name__] = self.ui.nombreDelItemIncrementadoComboBox.currentText() \ if not data[is_new__] else self.ui.nombreDelItemCompradoLineEdit.text() data[price__] = (self.ui.precioTotalPagadoPorLaCompraDoubleSpinBox.value() / data[quantity__]) \ if data[is_new__] else self.ui.precioTotalPagadoPorLaCompraDoubleSpinBox.value() if is_bulk: data[item_name__] = bulk_data[1] data[price__] = float(bulk_data[2]) / data[quantity__] if any([len(data[item_name__]) < 3, data[price__] == 0]): selfCloseInterface( 'Los datos son incorrectos. Revise la informacion antes de realizar una entrada', 8, 2, 'Entrada Fallida: DATOS INCORRECTOS', 'REVISE:\n1- Que el precio no sea cero\n2- Que el articulo tenga un nombre apropiado (mas de 3 letras)' ) return data[sell_price__] = 0 data[comments__] = self.ui.comentariosDeEntradaLineEdit.text() data[item_code__] = self.ui.codigoDelItemIncrementadoComboBox.currentText() \ if not data[is_new__] else build_item_code(data[price__], self.ui.itemAConsignacionCheckBox.isChecked()) # capital cells # touches invested data[parts__[0]] = last_row_data[parts__[0]] data[parts__[1]] = last_row_data[parts__[1]] data[total__] = float(last_row_data[total__]) data[invested__] = float(last_row_data[invested__]) if data[is_consignation__] else \ float(last_row_data[invested__]) + data[quantity__] * data[price__] data[cash__] = data[total__] - data[invested__] # this block prevents for goes negative funds after purchasing something if data[cash__] < 0: selfCloseInterface( 'No esta permitido comprar cuando el monto es mayor que el saldo de caja, agregue saldo a su caja antes de hacer esta operacion', 8, 3, 'Compras Denegadas: CAPACIDAD EXCEDIDA', 'Vaya a:\nMenu Herramientas > Modificar la Inversion\nO presione: CTRL+ALT+M \ny agregue efectivo antes de comprar\n\nO reduzca la cantidad de articulos comprados') self.reject() return # this is the secure entry block msg_str = 'comprar {} {} por ${:,.2f} cada uno'.format(data[quantity__], data[item_name__], data[price__]) if parent.use_secure_entry and not is_bulk: confirm = MessageBox( lambda: parent.append_data_to_diary(data), 'Desea confirmar la Entrada?', 'q', 'Confirmar Entrada', msg_str ) confirm.show() else: parent.append_data_to_diary(data) if not is_bulk: selfCloseInterface(msg_str, 4, 1, 'Operacion Realizada', 'Cambios Insertados en la Base de Datos') self.init_ui(parent) return
def apply_form(self, parent): # props alias... data_len__ = get_template_fields('diary') date__ = get_index_in_template('diary', 'date') comments__ = get_index_in_template('diary', 'comments') amount__ = get_index_in_template('diary', 'amount') owner__ = get_index_in_template('diary', 'owner') invested__ = get_index_in_template('diary', 'invested_') cash__ = get_index_in_template('diary', 'cash_') total__ = get_index_in_template('diary', 'total_') parts__ = [ get_index_in_template('diary', 'robert_'), get_index_in_template('diary', 'ariadna_') ] sign__ = -1 if self.ui.extraccionDelMontoCheckBox.isChecked() else 1 last_row_data__ = crud_driver(parent, 'diary', 'read', {}) last_row_data = build_data_template() if len( last_row_data__) == 0 else last_row_data__[-1] last_row_data = build_data_template( ) if len(data_len__) > len(last_row_data) else last_row_data data = build_data_template() data[comments__] = self.ui.comentariosDeCapitalLineEdit.text() data[date__] = parent.date_session data[amount__] = self.ui.cantidadDeDineroDoubleSpinBox.value() * sign__ data[ owner__] = self.ui.nombreDelQueInsertaElDineroComboBox.currentText( ) data[parts__[0]] = last_row_data[parts__[0]] data[parts__[1]] = last_row_data[parts__[1]] data[parts__[self.ui.nombreDelQueInsertaElDineroComboBox.currentIndex()]] = \ last_row_data[parts__[self.ui.nombreDelQueInsertaElDineroComboBox.currentIndex()]] + data[amount__] # this block is for defunding protection: amount___ = float(data[parts__[ self.ui.nombreDelQueInsertaElDineroComboBox.currentIndex()]]) if amount___ < 0: print('capital extraction denied. No enough funds ') selfCloseInterface( 'No puede extraer $ {:,.2f} del saldo de {}.\nFondos Insuficientes' .format( self.ui.cantidadDeDineroDoubleSpinBox.value(), self.ui.nombreDelQueInsertaElDineroComboBox.currentText()), 5, 3, 'Extraccion Denegada', 'No esta permitido extraer mas dinero que el total de la parte de un socio ' ) return self.clean_form() data[invested__] = last_row_data[invested__] data[total__] = data[parts__[0]] + data[parts__[1]] data[cash__] = data[total__] - data[invested__] if parent.use_secure_entry: confirm = MessageBox(lambda: parent.append_data_to_diary(data), 'Desea confirmar la Entrada?', 'q', 'Confirmar Entrada', self.ui.notasDeCapital.text()) confirm.show() return else: parent.append_data_to_diary(data) selfCloseInterface(self.ui.notasDeCapital.text(), 4, 1, 'Operacion Realizada', 'Cambios Insertados en la Base de Datos') return