Impprovements reporting and order

This commit is contained in:
Oscar Alvarez 2020-12-21 11:03:44 -05:00
parent 611d4dbfe9
commit c3d94223da
4 changed files with 152 additions and 119 deletions

View file

@ -100,17 +100,24 @@ class SearchSale(QWidget):
headers['party.name'] = {'desc': self.tr('PARTY'), 'type': 'char'}
headers['sale_date'] = {'desc': self.tr('DATE'), 'type': 'char'}
headers['salesman.rec_name'] = {'desc': self.tr('SALESMAN'), 'type': 'char'}
headers['position'] = {'desc': self.tr('POSITION'), 'type': 'char'}
headers['total_amount_cache'] = {'desc': self.tr('TOTAL AMOUNT'), 'type': 'number'}
widths = [20, 120, 100, 180, 110, 260]
if self._parent._sale_pos_restaurant:
headers['consumer.rec_name'] = {'desc': self.tr('CONSUMER'), 'type': 'char'}
widths.append(310)
headers['position'] = {'desc': self.tr('POSITION'), 'type': 'char'}
widths.append(100)
headers['total_amount_cache'] = {'desc': self.tr('TOTAL AMOUNT'), 'type': 'number'}
widths.append(80)
widths = [20, 100, 150, 100, 90, 150, 100, 100]
title = self.tr('SEARCH SALES...')
methods = {
'on_selected_method': 'on_selected_sale',
'on_return_method': 'on_selected_sale'
}
return SearchWindow(self._parent, headers, None, methods,
filter_column=[1, 2, 3, 4], cols_width=widths,
filter_column=[2, 3, 4, 6, 7], cols_width=widths,
title=title, fill=True)
@ -295,15 +302,15 @@ class DialogConsumer(QWidget):
lambda: self._parent.update_consumer_data('birthday'))
grid.addWidget(self._parent.row_field_birthday, 5, 2)
label_preference = QLabel(self.tr('NOTES:'))
label_preference.setObjectName('label_preference')
grid.addWidget(label_preference, 6, 1)
self._parent.row_field_consumer_preference = QPlainTextEdit()
self._parent.row_field_consumer_preference.setObjectName('row_field_id_number')
self._parent.row_field_consumer_preference.textChanged.connect(
lambda: self._parent.update_consumer_data('preferences')
label_notes = QLabel(self.tr('NOTES:'))
label_notes.setObjectName('label_notes')
grid.addWidget(label_notes, 6, 1)
self._parent.row_field_consumer_notes = QPlainTextEdit()
self._parent.row_field_consumer_notes.setObjectName('row_field_id_number')
self._parent.row_field_consumer_notes.textChanged.connect(
lambda: self._parent.update_consumer_data('notes')
)
grid.addWidget(self._parent.row_field_consumer_preference, 6, 2)
grid.addWidget(self._parent.row_field_consumer_notes, 6, 2)
grid.setVerticalSpacing(15)
grid.addWidget(self.get_button(), 7, 1, 1, 2)

View file

@ -334,6 +334,7 @@ class MainWindow(FrontWindow):
self.Comission = FastModel('commission', self.ctx)
if self._sale_pos_restaurant:
self.RestTables = FastModel('sale.shop.table', self.ctx)
self.Consumer = FastModel('party.consumer', self.ctx)
self.device, = self.Device.find([
('id', '=', self._user['sale_device']['id']),
@ -1063,13 +1064,17 @@ class MainWindow(FrontWindow):
self.message_bar.set('system_ready')
return True
def print_invoice(self, sale_id=None, copies=1):
def print_invoice(self, sale_id=None, type_doc='invoice', copies=1):
if not sale_id:
sale_id = self._sale['id']
args = {'sale_id': sale_id}
args = {
'sale_id': sale_id,
'type_doc': type_doc,
}
data = self.Sale.get_data(args)
print('=====', data)
for i in range(copies):
self.receipt_sale.print_sale(data)
self.receipt_sale.print_sale(data, type_doc)
def button_duplicate_sale(self):
if self.sale_customer_selected:
@ -1098,8 +1103,6 @@ class MainWindow(FrontWindow):
for record in sales:
self.model_sale_consumer.add_record(record)
self.dialog_table_sale_consumer.exec_()
else:
pass
def button_accept_pressed(self):
if not self._check_quantity():
@ -1292,7 +1295,10 @@ class MainWindow(FrontWindow):
self.set_amounts()
def action_consumer(self):
self.clear_dialog_consumer()
if not self._consumer.get('id'):
self.clear_dialog_consumer()
else:
self.set_consumer()
self.dialog_search_consumer.show()
self.row_field_phone.setFocus()
@ -1308,23 +1314,26 @@ class MainWindow(FrontWindow):
number = self.field_invoice_number_ask.text()
printer_id = self.field_printer_ask.get_id()
type_doc = self.field_type_ask.get_id()
sale = {}
sale_id = None
if number:
if type_doc in ['order', 'delivery']:
sales = self.Sale.find([('number', '=', number)])
if sales:
sale = sales[0]
if number == self._sale['number']:
sale_id = self._sale['id']
else:
sales = self.Sale.find([('number', '=', number)])
if sales:
sale_id = sales[0]['id']
else:
args = {'number': number}
sale = self.Sale.get_sale_from_invoice(args)
if not sale:
return self.message_bar.set('sale_number_not_found')
sale_id = sale['id']
else:
sale_id = self._sale['id']
if not sale_id:
return self.message_bar.set('sale_number_not_found')
if printer_id == '1':
self.print_invoice(sale_id)
self.print_invoice(sale_id, type_doc=type_doc)
else:
self.print_odt_invoice(sale)
@ -1638,10 +1647,18 @@ class MainWindow(FrontWindow):
self.field_delivery_charge.set_enabled(True)
if sale.get('delivery_charge'):
self.field_delivery_charge.set_from_id(sale['delivery_charge'])
print('table_assigned ', sale.get('table_assigned'))
if sale.get('table_assigned'):
self.field_table_assigned.setText(sale['table_assigned']['name'] or '')
consumer = sale.get('consumer', None)
if consumer:
self.field_consumer.setText(consumer['name'] or '')
self._consumer, = self.Consumer.find([
('id', '=', consumer['id']),
])
print('Cargando consumer?', self._consumer)
if sale.get('channel'):
self.field_channel.setText(sale['channel']['rec_name'].upper())
@ -1947,12 +1964,14 @@ class MainWindow(FrontWindow):
self.field_order_number.setText('')
self.field_state.setText('')
self.current_comment = ''
if hasattr(self, 'field_consumer'):
self.field_consumer.setText('')
if self.field_delivery_charge:
self.field_delivery_charge.set_from_id('')
if self.field_table_assigned:
self.field_table_assigned.setText('')
if hasattr(self, 'field_comment_ask'):
# self.field_comment_ask.document().clear()
#self.field_comment_ask.document().clear()
pass
if hasattr(self, 'field_points'):
self.field_points.setText('')
@ -2791,8 +2810,8 @@ class MainWindow(FrontWindow):
self.state_delivery_party['active'] = self.row_delivery_men_active.isChecked()
def update_consumer_data(self, field=''):
if field == 'preferences':
self.state_consumer['preferences'] = self.row_field_consumer_preference.toPlainText()
if field == 'notes':
self.state_consumer['notes'] = self.row_field_consumer_notes.toPlainText()
if field == 'address':
self.state_consumer['address'] = self.row_field_address.text()
elif field == 'id_number':
@ -2816,18 +2835,19 @@ class MainWindow(FrontWindow):
self.row_field_consumer.setText('')
self.row_field_id_number.setText('')
self.row_field_birthday.setDate(MINIMUM_DATE)
self.row_field_consumer_preference.clear()
self.row_field_consumer_notes.clear()
else:
self.button_history_customer.setVisible(True)
self._consumer = consumers[0]
self.row_field_address.setText(self._consumer['address'])
self.row_field_consumer.setText(self._consumer['name'])
self.row_field_id_number.setText(self._consumer['id_number'])
self.row_field_consumer_preference.insertPlainText(
self._consumer['preferences'])
if self._consumer.get('birthday'):
y, m, d = self._consumer['birthday'].split('-')
self.row_field_birthday.setDate(QDate(int(y), int(m), int(d)))
self.set_consumer()
# self.row_field_address.setText(self._consumer['address'])
# self.row_field_consumer.setText(self._consumer['name'])
# self.row_field_id_number.setText(self._consumer['id_number'])
# self.row_field_consumer_notes.insertPlainText(
# self._consumer['notes'])
# if self._consumer.get('birthday'):
# y, m, d = self._consumer['birthday'].split('-')
# self.row_field_birthday.setDate(QDate(int(y), int(m), int(d)))
def action_table_assigned(self, table, name, trasition_state):
current_table = self._sale.get('table_assigned')
@ -2882,37 +2902,20 @@ class MainWindow(FrontWindow):
self.row_field_consumer.setText('')
self.row_field_id_number.setText('')
self.row_field_birthday.setDate(QDate(2000, 1, 1))
self.row_field_consumer_preference.clear()
self.row_field_consumer_notes.clear()
self.button_history_customer.setVisible(False)
# def print_equivalent_invoice(self, sale_id):
# sale, = self.Sale.find([('id', '=', sale_id)])
# if not sale['invoices']:
# return
#
# invoice_id = sale['invoices'][0]
# commissions = self._Commission.find([
# ('origin', '=', 'account.invoice,' + str(invoice_id))
# ])
#
# # if not commissions:
# # return
# # commission = commissions[0]
# # if not commission['invoice_line.invoice']:
# # return
# #
# # model = u'account.invoice'
# # data = {
# # 'model': model,
# # 'action_id': self._action_report_equivalent['id'],
# # 'id': commission['invoice_line.invoice'],
# # 'ids': [commission['invoice_line.invoice']],
# # }
# # ctx = {'date_format': u'%d/%m/%Y'}
# # ctx.update(self._context)
# # Action.exec_report(self.conn, u'account.invoice',
# # data, direct_print=True, context=ctx)
def set_consumer(self):
# self._consumer = {}
self.row_field_phone.setText(self._consumer['phone'])
self.row_field_consumer.setText(self._consumer['name'])
self.row_field_address.setText(self._consumer['address'])
self.row_field_id_number.setText(self._consumer['id_number'])
self.row_field_consumer_notes.insertPlainText(
self._consumer['notes'])
if self._consumer.get('birthday'):
y, m, d = self._consumer['birthday'].split('-')
self.row_field_birthday.setDate(QDate(int(y), int(m), int(d)))
class DoInvoice(QThread):

View file

@ -80,7 +80,7 @@ MODELS = {
'party.consumer': {
'rec_name': 'rec_name',
'fields': ['party', 'id_number', 'rec_name', 'name', 'address',
'phone', 'birthday', 'preferences']
'phone', 'birthday', 'notes']
},
'account.invoice.payment_term': {
'rec_name': 'name',

View file

@ -147,7 +147,7 @@ class Receipt(object):
self._device = device
self._profile = printer['profile']
def print_sale(self, sale):
def print_sale(self, sale, type_doc=None):
try:
if self._interface == 'usb':
if os.name == 'posix':
@ -168,13 +168,13 @@ class Receipt(object):
self.logger.info("Warning: Can not found Printer!")
return
self.logger.info("Info: Printer is OK!")
self._print_sale(sale)
self._print_sale(sale, type_doc)
except:
self.logger.info("Warning: Printer error or device not found!")
def _print_sale(self, sale):
def _print_sale(self, sale, type_doc=None):
self.print_header()
self.print_body(sale)
self.print_body(sale, type_doc)
if sale.get('cufe'):
self._printer.text('CUFE: ' + sale['cufe'])
if sale.get('qr_code'):
@ -253,25 +253,28 @@ class Receipt(object):
self._printer.text(left)
self._printer.text(right + '\n')
def print_body(self, sale):
def print_body(self, sale, type_doc='invoice'):
self._cashdraw = True
self._printer.set(font=_FONT_B)
if sale.get('delivery_way'):
self._printer.set(custom_size=True, width=2, height=2)
delivery_way = ' - - - %s - - - ' % sale['delivery_way'].upper()
self._printer.text(delivery_way)
kind_string = sale.get('kind_string', None)
if type_doc != 'invoice' and kind_string:
self._printer.set(custom_size=True, width=2, height=2, align='center')
kind = f'- - - {kind_string} - - -'
self._printer.text(kind)
self.print_enter()
self.print_enter()
self._printer.set(custom_size=False)
self._printer.set(align='left')
if sale['number'] and sale['state'] in ['processing', 'done', 'cancel']:
if sale['total_amount'] >= 0:
self._printer.text('FACTURA DE VENTA No. ' + sale['number'])
else:
self._printer.text('NOTA CREDITO No. ' + sale['number'])
else:
if type_doc == 'invoice':
if sale['number'] and sale['state'] in ['processing', 'done', 'cancel']:
if sale['total_amount'] >= 0:
self._printer.text('FACTURA DE VENTA No. ' + sale['number'])
else:
self._printer.text('NOTA CREDITO No. ' + sale['number'])
elif type_doc in ['order', 'delivery']:
self._cashdraw = False
self._printer.text('Pedido: ' + sale['order'])
self._printer.text('PEDIDO: ' + sale['order'])
self.print_enter()
#mod_hours = sale["create_date"] + timedelta(hours=self._delta_locale)
#time_ = mod_hours.strftime('%I:%M %p')
@ -296,17 +299,31 @@ class Receipt(object):
if sale.get('party_phone'):
self.print_enter()
self._printer.text('Telefono: %s' % sale['party_phone'])
self.print_enter()
self.print_horinzontal_line()
if sale.get('delivery_party'):
self._printer.text('Domiciliario: %s' % sale['delivery_party'])
if sale.get('channel'):
self.print_enter()
self._printer.text('Canal de venta: %s' % sale['channel'])
if sale.get('payment_term'):
self.print_enter()
self._printer.text('Forma De Pago: %s' % sale['payment_term'])
self._printer.text('Forma de Pago: %s' % sale['payment_term'])
self.print_enter()
consumer_name = sale.get('consumer_name', None)
if consumer_name:
consumer_address = sale.get('consumer_address', '')
consumer_phone = sale.get('consumer_phone', '')
consumer_notes = sale.get('consumer_notes', '')
self.print_horinzontal_line()
self.print_enter()
self._printer.set(align='center')
self._printer.text('========= INFO CONSUMIDOR =========')
self.print_enter()
self._printer.set(align='left')
self._printer.text('NOMBRE: %s' % consumer_name)
self.print_enter()
self._printer.text('DIRECCION: %s' % consumer_address)
self.print_enter()
self._printer.text('TELEFONO: %s' % consumer_phone)
self.print_enter()
self._printer.text('NOTAS: %s' % consumer_notes)
self.print_enter()
self.print_enter()
self.print_horinzontal_line()
self.print_split(' Articulo ', 'Subtotal ')
@ -402,13 +419,12 @@ class Receipt(object):
self.print_enter()
self.print_horinzontal_line()
no_products = 'No Items: %s' % str(sale['num_products'])
no_products = 'No ITEMS: %s' % str(sale['num_products'])
self._printer.text(no_products)
self.print_enter()
auth_kind = sale.get('auth_kind', None)
if auth_kind and sale['state'] not in ['draft']:
print(auth_kind, self._authorizations)
auth_data = self._authorizations[auth_kind]
self._printer.text(self.get_authorization(auth_data))
self.print_enter()
@ -416,30 +432,35 @@ class Receipt(object):
self._printer.text(self._gta_info)
self.print_enter()
if sale['state'] in ['processing', 'done']:
self._printer.text('Pedido: ' + sale['order'])
if type_doc == 'invoice':
self._printer.text('No PEDIDO: ' + sale['order'])
self.print_enter()
register = 'Caja No. %s' % self._sale_device
register = 'CAJA No. %s' % self._sale_device
self._printer.text(register)
self.print_enter()
self._printer.text('Cajero: %s' % self._user)
self._printer.text('CAJERO: %s' % self._user)
self.print_enter()
if sale.get('salesman'):
self._printer.text('Vendedor: %s' % sale['salesman'])
self._printer.text('VENDEDOR: %s' % sale['salesman'])
self.print_enter()
if sale.get('comment'):
self._printer.text('Notas: %s' % sale['comment'])
self._printer.text('NOTAS: %s' % sale['comment'])
self.print_enter()
if self._show_position:
self._printer.text('Posicion: %s' % str(sale['position']))
self._printer.text('POSICION: %s' % str(sale['position']))
self.print_enter()
self.print_horinzontal_line()
if sale.get('delivery_party'):
self._printer.text('DOMICILIARIO: %s' % sale['delivery_party'])
self.print_enter()
if sale.get('channel'):
self._printer.text('CANAL DE VENTA: %s' % sale['channel'])
self.print_enter()
self._printer.set(align='center')
#self.print_split('Puntos Acumulados:', sale['points'])
#self.print_enter()
self.print_enter()
self.print_enter()
@ -532,18 +553,24 @@ class Receipt(object):
self.print_enter()
kind = order.get('kind', 'delivery')
if kind == 'delivery':
_kind = 'DOMICILIO'
if kind == 'take_away':
_kind = 'PARA LLEVAR'
elif kind == 'to_table':
_kind = 'PARA MESA'
else:
_kind = 'PARA LLEVAR'
_kind = 'DOMICILIO'
self._printer.set(custom_size=True, width=2, height=2, align='center')
title = f'+ + + {_kind} + + +'
self._printer.text(title)
self.print_enter()
self._printer.set(custom_size=True, width=2, height=2, align='center')
self.print_enter()
self._printer.text(order['sale_number'])
self.print_enter()
self._printer.set(custom_size=False)
self._printer.set(align='left')
self.print_enter()
date_ = datetime.now().strftime("%Y-%m-%d %H:%M %p")
@ -565,9 +592,6 @@ class Receipt(object):
self._printer.text('CARGO DEL DOMICILIO: ' + _charge_to)
self.print_enter()
self._printer.text('PEDIDO: %s' % str(order['sale_number']))
self.print_enter()
position = order.get('position')
if position:
self._printer.text('POSICION: %s' % str(position))
@ -592,11 +616,9 @@ class Receipt(object):
if self.order_kind == 'command':
self._printer.set(custom_size=True, width=2, height=2, align='center')
if not reversion:
self._printer.text('PREPARAR Y SERVIR')
else:
self._printer.text('> R E V E R S I O N <')
self.print_enter()
if reversion:
self._printer.text('>>> R E V E R S I O N <<<')
self.print_enter()
col_width_name = self.order_col_2 + self.order_col_3
if self.order_kind == 'command':
@ -610,13 +632,14 @@ class Receipt(object):
self._printer.set(custom_size=True, width=1, height=2)
self.print_col(qty, self.order_col_1)
self.print_col(line['name'], col_width_name)
self._printer.set(custom_size=False)
# self._printer.set(custom_size=False)
# self.print_col(' ' + str(line['unit_price']), self.order_col_3)
if line['note']:
self._printer.set(align='left')
self._printer.set(custom_size=True, width=1, height=2, align='right')
self.print_enter()
self._printer.text(' --->> NOTA: ' + line['note'])
self.print_enter()
self.print_enter()
self.print_enter()
self.print_horinzontal_double_line()