Example #1
0
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))
Example #2
0
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))
Example #3
0
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
Example #4
0
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
Example #6
0
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
Example #7
0
 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
Example #11
0
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)))
Example #12
0
    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
Example #13
0
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