|
@@ -0,0 +1,390 @@
|
|
|
|
+# -*- coding: utf-8 -*-
|
|
|
|
+from openerp import models, fields, tools, api
|
|
|
|
+from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT
|
|
|
|
+from pytz import timezone
|
|
|
|
+from datetime import datetime,timedelta
|
|
|
|
+import logging
|
|
|
|
+_logger = logging.getLogger(__name__)
|
|
|
|
+
|
|
|
|
+class EiruPosSessionConfirm(models.Model):
|
|
|
|
+ _inherit = 'pos.session'
|
|
|
|
+
|
|
|
|
+ ''' Timezone '''
|
|
|
|
+ def get_timezone(self):
|
|
|
|
+ return timezone(self._context.get('tz') or self.env.user.tz)
|
|
|
|
+
|
|
|
|
+ ''' Datetime '''
|
|
|
|
+ def get_datetime(self):
|
|
|
|
+ return datetime.now(self.get_timezone()).strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
|
|
|
+
|
|
|
|
+ ''' Date '''
|
|
|
|
+ def get_date(self):
|
|
|
|
+ return datetime.now(self.get_timezone()).strftime(DEFAULT_SERVER_DATE_FORMAT)
|
|
|
|
+
|
|
|
|
+ ''' GET POS SESSION + Statemen '''
|
|
|
|
+ @api.model
|
|
|
|
+ def eiru_get_pos_session_statement(self, id):
|
|
|
|
+ _logger.info('Obtener los detalles de las caja de las seccion')
|
|
|
|
+ statementId = []
|
|
|
|
+ sessionPos = []
|
|
|
|
+
|
|
|
|
+ posSession = self.env['pos.session'].search([('id', '=', id ), ('state', '=','opened')])
|
|
|
|
+ if (not posSession):
|
|
|
|
+ return {
|
|
|
|
+ 'state': False,
|
|
|
|
+ 'message': "Error en obtener la sesión del pos.",
|
|
|
|
+ }
|
|
|
|
+ statementIds = map(lambda x: x.id, posSession.statement_ids)
|
|
|
|
+ bankStatement = self.env['account.bank.statement'].search([('id', 'in', statementIds),('state', '=', 'open')])
|
|
|
|
+ if (not bankStatement):
|
|
|
|
+ return {
|
|
|
|
+ 'state':False,
|
|
|
|
+ 'message': "No existe ninguna caja asociada con la sesión",
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ for statement in bankStatement:
|
|
|
|
+ statementGeneral = []
|
|
|
|
+ amount = 0.00
|
|
|
|
+
|
|
|
|
+ AccountJournal = self.env['account.journal'].browse(statement.journal_id.id)
|
|
|
|
+ statementType = self.env['account.bank.statement.type'].search([('code', '=', 'GENERAL')])
|
|
|
|
+ statementG = self.env['account.bank.statement'].search([('journal_id.id', '=', AccountJournal.id), ('type_statement.id', '=', statementType.id),('state', '=', 'open')])
|
|
|
|
+
|
|
|
|
+ for generalStatement in statementG:
|
|
|
|
+ statementGeneral.append({
|
|
|
|
+ 'id': generalStatement.id,
|
|
|
|
+ 'name': generalStatement.name
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ for line in statement.line_ids:
|
|
|
|
+ amount += line.amount
|
|
|
|
+
|
|
|
|
+ if (statement.balance_start > 0):
|
|
|
|
+ amount += statement.balance_start
|
|
|
|
+
|
|
|
|
+ statementId.append({
|
|
|
|
+ 'id': statement.id,
|
|
|
|
+ 'name': statement.name,
|
|
|
|
+ 'amount': amount,
|
|
|
|
+ 'joutnalType': AccountJournal.type,
|
|
|
|
+ 'journalId': AccountJournal.id,
|
|
|
|
+ 'statementGeneral': statementGeneral,
|
|
|
|
+ 'currency':[{
|
|
|
|
+ 'id': resCurrency.id,
|
|
|
|
+ 'name': resCurrency.name,
|
|
|
|
+ 'symbol': resCurrency.symbol,
|
|
|
|
+ 'localName': resCurrency.local_name,
|
|
|
|
+ 'rate': resCurrency.rate,
|
|
|
|
+ 'thousandsSeparator': resCurrency.thousands_separator,
|
|
|
|
+ 'decimalSeparator': resCurrency.decimal_separator,
|
|
|
|
+ 'decimalPlaces': resCurrency.decimal_places,
|
|
|
|
+ 'position': resCurrency.position,
|
|
|
|
+ }for resCurrency in self.env['res.currency'].browse(statement.currency.id)]
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ sessionPos = {
|
|
|
|
+ 'id': posSession.id,
|
|
|
|
+ 'name': posSession.name,
|
|
|
|
+ 'state': posSession.state,
|
|
|
|
+ 'statement': statementId,
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return sessionPos
|
|
|
|
+
|
|
|
|
+ ''' ***********************************************************************
|
|
|
|
+ ____ _ ____ _
|
|
|
|
+ / ___| | ___ ___ ___ / ___| ___ ___ ___(_) ___ _ __
|
|
|
|
+ | | | |/ _ \/ __|/ _ \ \___ \ / _ \/ __/ __| |/ _ \| '_ \
|
|
|
|
+ | |___| | (_) \__ \ __/ ___) | __/\__ \__ \ | (_) | | | |
|
|
|
|
+ \____|_|\___/|___/\___| |____/ \___||___/___/_|\___/|_| |_|
|
|
|
|
+ *************************************************************************'''
|
|
|
|
+ @api.model
|
|
|
|
+ def eiru_pos_session_close(self, id):
|
|
|
|
+ _logger.info('Validar y contabilizar asiento(s) de cierre')
|
|
|
|
+ posSession = self.env['pos.session'].browse(id)
|
|
|
|
+ return posSession.signal_workflow('close')
|
|
|
|
+
|
|
|
|
+ ''' ***********************************************************************
|
|
|
|
+ ____ _ _ _ ____
|
|
|
|
+ / ___|| |_ __ _| |_ ___ _ __ ___ ___ _ __ | |_ | _ \ ___ ___
|
|
|
|
+ \___ \| __/ _` | __/ _ \ '_ ` _ \ / _ \ '_ \| __| | |_) / _ \/ __|
|
|
|
|
+ ___) | || (_| | || __/ | | | | | __/ | | | |_ | __/ (_) \__ \
|
|
|
|
+ |____/ \__\__,_|\__\___|_| |_| |_|\___|_| |_|\__| |_| \___/|___/
|
|
|
|
+ *************************************************************************'''
|
|
|
|
+ @api.model
|
|
|
|
+ def eiru_statement_confirm_pos(self, sessionId, statements):
|
|
|
|
+ _logger.info('Confirm Statement Pos')
|
|
|
|
+ user = self.env.user
|
|
|
|
+ dateServer = self.get_date()
|
|
|
|
+
|
|
|
|
+ for statement in statements:
|
|
|
|
+ bankStatement = self.confirm_pos_get_statement(statement['id'])
|
|
|
|
+
|
|
|
|
+ if (not bankStatement):
|
|
|
|
+ return {
|
|
|
|
+ 'state': False,
|
|
|
|
+ 'message': "Error en Obtener la lineas"
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ amountStatement = 0.0
|
|
|
|
+ for line in bankStatement.line_ids:
|
|
|
|
+ amountStatement += line.amount
|
|
|
|
+ if (bankStatement.balance_start > 0):
|
|
|
|
+ amountStatement += bankStatement.balance_start
|
|
|
|
+
|
|
|
|
+ balanceLine = []
|
|
|
|
+ if(amountStatement != statement['amountConfirm']):
|
|
|
|
+ amountConfirm = statement['amountConfirm'] - amountStatement
|
|
|
|
+ name = "Ajuste de cierre de caja (POS)"
|
|
|
|
+ referencia = "Ganancia" if(amountConfirm > 0) else "Perdida"
|
|
|
|
+
|
|
|
|
+ balanceLine = self.confirm_pos_create_statement_line( bankStatement, name, amountConfirm, referencia)
|
|
|
|
+
|
|
|
|
+ cashboxConfirm = {
|
|
|
|
+ 'name': "CIERRE DE CAJA (%s)" %(bankStatement.name),
|
|
|
|
+ 'date': dateServer,
|
|
|
|
+ 'ref': "Cierre de caja (TPV)",
|
|
|
|
+ 'statement_id': bankStatement.id,
|
|
|
|
+ 'user_statement': bankStatement.user_id.id,
|
|
|
|
+ 'user_confirm': user.id,
|
|
|
|
+ 'journal_id' : bankStatement.journal_id.id,
|
|
|
|
+ 'amount_statement': amountStatement,
|
|
|
|
+ 'amount_real': statement['amountConfirm'],
|
|
|
|
+ 'line_difference': balanceLine.id if (balanceLine) else '',
|
|
|
|
+ 'amount_difference': balanceLine.amount if (balanceLine) else 0.0,
|
|
|
|
+ 'amount_next_open': 0.0,
|
|
|
|
+ 'state_avaliable': False,
|
|
|
|
+ }
|
|
|
|
+ statementConfirm = self.confirm_pos_create_cashbox_statement_confirm(cashboxConfirm, bankStatement)
|
|
|
|
+
|
|
|
|
+ '''
|
|
|
|
+ Salida de Dinero.
|
|
|
|
+ '''
|
|
|
|
+ if (statement['OutputPos']):
|
|
|
|
+ #Crear Line en caja
|
|
|
|
+ name = "Retiro de dinero"
|
|
|
|
+ lineOutput = self.confirm_pos_create_statement_line( bankStatement, name, (- statement['amountOutput']), "TPV")
|
|
|
|
+ # Crear Salida
|
|
|
|
+ cashboxOutput = self.confirm_pos_create_cashbox_output(lineOutput, statement['amountOutput'], statementConfirm)
|
|
|
|
+
|
|
|
|
+ '''
|
|
|
|
+ Transferencia.
|
|
|
|
+ '''
|
|
|
|
+ if (statement['transferPos']):
|
|
|
|
+ statementTransfer = self.confirm_pos_get_statement(statement['statementTransfer'])
|
|
|
|
+ if (not statementTransfer):
|
|
|
|
+ return {
|
|
|
|
+ 'state': False,
|
|
|
|
+ 'message': "Erro, no se pudo encontrar la caja destino de la transferencia."
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ## Salida
|
|
|
|
+ name = "TRANSFERENCIA/%s (Salida)" % (statementTransfer.name)
|
|
|
|
+ transferOutput = self.confirm_pos_create_statement_line( bankStatement, name, (- statement['amountTransfer']), "TPV")
|
|
|
|
+ ## Entrada
|
|
|
|
+ name = "TRANSFERENCIA/%s (Entrada)" % (bankStatement.name)
|
|
|
|
+ transferinput = self.confirm_pos_create_statement_line( statementTransfer, name, statement['amountTransfer'], "TPV")
|
|
|
|
+ ## Transferencia
|
|
|
|
+ transferencia = self.confirm_pos_create_cashbox_transfer("TPV", statement['amountTransfer'], transferOutput, transferinput, statementConfirm)
|
|
|
|
+
|
|
|
|
+ '''
|
|
|
|
+ Saldo para próxima apertura de caja.
|
|
|
|
+ '''
|
|
|
|
+ amountStatement = 0.0
|
|
|
|
+ for line in bankStatement.line_ids:
|
|
|
|
+ amountStatement += line.amount
|
|
|
|
+ if (bankStatement.balance_start > 0):
|
|
|
|
+ amountStatement += bankStatement.balance_start
|
|
|
|
+
|
|
|
|
+ if (amountStatement > 0.0):
|
|
|
|
+ name="Saldo para próxima apertura de caja"
|
|
|
|
+ lineNextOpen = self.confirm_pos_create_statement_line(bankStatement, name, (- amountStatement), "TPV")
|
|
|
|
+ if (not lineNextOpen):
|
|
|
|
+ return {
|
|
|
|
+ 'state' : False,
|
|
|
|
+ 'message': "Error, En el registro de saldo."
|
|
|
|
+ }
|
|
|
|
+ statementConfirm.write({
|
|
|
|
+ 'line_next_open': lineNextOpen.id,
|
|
|
|
+ 'amount_next_open': abs(amountStatement),
|
|
|
|
+ 'state_avaliable': True,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ return {
|
|
|
|
+ 'state': True,
|
|
|
|
+ 'message': "Operación exitosa"
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ ''' Get Statement '''
|
|
|
|
+ def confirm_pos_get_statement(self,id):
|
|
|
|
+ return self.env['account.bank.statement'].browse(id)
|
|
|
|
+
|
|
|
|
+ ''' Create Line Statemen '''
|
|
|
|
+ def confirm_pos_create_statement_line(self, statement, name, amount, ref):
|
|
|
|
+ statementLine = {
|
|
|
|
+ 'statement_id': statement.id,
|
|
|
|
+ 'name': name,
|
|
|
|
+ 'amount': amount,
|
|
|
|
+ 'ref': ref,
|
|
|
|
+ 'account_id': statement.journal_id.internal_account_id.id,
|
|
|
|
+ 'journal_id': statement.journal_id.id,
|
|
|
|
+ 'is_deleted': True
|
|
|
|
+ }
|
|
|
|
+ return self.env['account.bank.statement.line'].create(statementLine)
|
|
|
|
+
|
|
|
|
+ ''' Create cashbox Confirm '''
|
|
|
|
+ def confirm_pos_create_cashbox_statement_confirm(self,values, statement):
|
|
|
|
+ casbox = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])
|
|
|
|
+ if (not casbox):
|
|
|
|
+ confirm = self.env['cashbox.statement.confirm'].create(values)
|
|
|
|
+ else:
|
|
|
|
+ confirm = casbox.write(values)
|
|
|
|
+ if (confirm):
|
|
|
|
+ confirm = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])
|
|
|
|
+
|
|
|
|
+ return confirm
|
|
|
|
+
|
|
|
|
+ ''' Create cashBox output '''
|
|
|
|
+ def confirm_pos_create_cashbox_output(self, line, amount, confirm):
|
|
|
|
+ cash = {
|
|
|
|
+ 'name': "Retiro de dinero (%s)" % (line.statement_id.name),
|
|
|
|
+ 'amount': amount,
|
|
|
|
+ 'ref': 'TPV',
|
|
|
|
+ 'date': line.date,
|
|
|
|
+ 'line_id': line.id,
|
|
|
|
+ 'statement_id': line.statement_id.id,
|
|
|
|
+ 'cashbox_confirm_id': confirm.id
|
|
|
|
+ }
|
|
|
|
+ return self.env['cash.box.out'].create(cash)
|
|
|
|
+
|
|
|
|
+ ''' Create cash box transfer '''
|
|
|
|
+ def confirm_pos_create_cashbox_transfer(self, ref, amount, lineOutput, lineInput, confirm):
|
|
|
|
+ cash = {
|
|
|
|
+ 'name': "TRANSFERENCIA %s a %s" %((lineOutput.statement_id.name),(lineInput.statement_id.name)),
|
|
|
|
+ 'amount': amount,
|
|
|
|
+ 'ref': ref,
|
|
|
|
+ 'input_line': lineInput.id,
|
|
|
|
+ 'output_line': lineOutput.id,
|
|
|
|
+ 'input_statement': lineInput.statement_id.id,
|
|
|
|
+ 'output_statement': lineOutput.statement_id.id,
|
|
|
|
+ 'date': lineOutput.date,
|
|
|
|
+ 'cashbox_confirm_id': confirm.id,
|
|
|
|
+ }
|
|
|
|
+ return self.env['cash.box.transfer'].create(cash)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ '''
|
|
|
|
+ ____ ____ ___ _ _ _____ ____ _____ _ _____ _____ __ __ _____ _ _ _____
|
|
|
|
+ | _ \| _ \|_ _| \ | |_ _| / ___|_ _|/ \|_ _| ____| \/ | ____| \ | |_ _|
|
|
|
|
+ | |_) | |_) || || \| | | | \___ \ | | / _ \ | | | _| | |\/| | _| | \| | | |
|
|
|
|
+ | __/| _ < | || |\ | | | ___) || |/ ___ \| | | |___| | | | |___| |\ | | |
|
|
|
|
+ |_| |_| \_\___|_| \_| |_| |____/ |_/_/ \_\_| |_____|_| |_|_____|_| \_| |_|
|
|
|
|
+ '''
|
|
|
|
+ ''' Get Pos Session Statemen Confirm Print'''
|
|
|
|
+ @api.model
|
|
|
|
+ def confirm_pos_get_statement_print(self, id):
|
|
|
|
+ _logger.info('Generar resume de cierre de las caja')
|
|
|
|
+ posStatement = []
|
|
|
|
+
|
|
|
|
+ posSession = self.env['pos.session'].search([('id', '=', id),('state', '=', 'closed')])
|
|
|
|
+ if (not posSession):
|
|
|
|
+ return False
|
|
|
|
+
|
|
|
|
+ statementIds = map(lambda x: x.id, posSession.statement_ids)
|
|
|
|
+
|
|
|
|
+ statements = self.env['account.bank.statement'].search([('id', 'in', statementIds),('state', '=', 'confirm')])
|
|
|
|
+
|
|
|
|
+ if (not statements):
|
|
|
|
+ return False
|
|
|
|
+ statemntPos = []
|
|
|
|
+ for statement in statements:
|
|
|
|
+ statementConfirm = []
|
|
|
|
+ accountJournal = self.env['account.journal'].browse(statement.journal_id.id)
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ ''' Verificar si existe cierre '''
|
|
|
|
+ confirm = self.env['cashbox.statement.confirm'].search([('statement_id.id', '=', statement.id)])
|
|
|
|
+
|
|
|
|
+ if (not confirm):
|
|
|
|
+ amountStatement = 0.0
|
|
|
|
+ for line in statement.line_ids:
|
|
|
|
+ amountStatement += line.amount
|
|
|
|
+ if (statement.balance_start > 0):
|
|
|
|
+ amountStatement += statement.balance_start
|
|
|
|
+
|
|
|
|
+ statementConfirm.append({
|
|
|
|
+ 'amountStatement': amountStatement,
|
|
|
|
+ 'amountConfirm': 0,
|
|
|
|
+ 'amountDifference': 0,
|
|
|
|
+ 'amountOutput': 0,
|
|
|
|
+ 'amountTransfer': 0,
|
|
|
|
+ 'amountNextOpen': 0,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ if (confirm):
|
|
|
|
+
|
|
|
|
+ amountDifference = self.confirm_pos_get_statement_line(confirm.line_difference.id)
|
|
|
|
+ amountNextOpen = abs(self.confirm_pos_get_statement_line(confirm.line_next_open.id))
|
|
|
|
+
|
|
|
|
+ transferID = map(lambda x: x.id, confirm.cashbox_transfer_ids)
|
|
|
|
+ amountTransfer = self.confirm_pos_get_casbox_transfer(transferID)
|
|
|
|
+
|
|
|
|
+ outputIds = map(lambda x: x.id, confirm.cashbox_output_ids)
|
|
|
|
+ amountOutput =self.confirm_pos_get_casbox_output(outputIds)
|
|
|
|
+
|
|
|
|
+ statementConfirm.append({
|
|
|
|
+ 'amountStatement': confirm.amount_statement,
|
|
|
|
+ 'amountConfirm': confirm.amount_real,
|
|
|
|
+ 'amountDifference': amountDifference,
|
|
|
|
+ 'amountNextOpen': amountNextOpen,
|
|
|
|
+ 'amountTransfer': amountTransfer,
|
|
|
|
+ 'amountOutput': amountOutput,
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ statemntPos.append({
|
|
|
|
+ 'id': statement.id,
|
|
|
|
+ 'name':statement.name,
|
|
|
|
+ 'journalType': accountJournal.type,
|
|
|
|
+ 'journalName': accountJournal.name,
|
|
|
|
+ 'journalId': accountJournal.id,
|
|
|
|
+ 'confirm': statementConfirm,
|
|
|
|
+ 'currency':[{
|
|
|
|
+ 'id': resCurrency.id,
|
|
|
|
+ 'name': resCurrency.name,
|
|
|
|
+ 'symbol': resCurrency.symbol,
|
|
|
|
+ 'localName': resCurrency.local_name,
|
|
|
|
+ 'rate': resCurrency.rate,
|
|
|
|
+ 'thousandsSeparator': resCurrency.thousands_separator,
|
|
|
|
+ 'decimalSeparator': resCurrency.decimal_separator,
|
|
|
|
+ 'decimalPlaces': resCurrency.decimal_places,
|
|
|
|
+ 'position': resCurrency.position,
|
|
|
|
+ }for resCurrency in self.env['res.currency'].browse(statement.currency.id)]
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ posStatement.append({
|
|
|
|
+ 'name': posSession.name,
|
|
|
|
+ 'startAt': posSession.start_at,
|
|
|
|
+ 'stopAt': posSession.stop_at,
|
|
|
|
+ 'userName': posSession.user_id.name,
|
|
|
|
+ 'statemnt': statemntPos
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ return posStatement
|
|
|
|
+
|
|
|
|
+ ''' get amount statemnt Line '''
|
|
|
|
+ def confirm_pos_get_statement_line(self, id):
|
|
|
|
+ _logger.info('Obtener la linea de la caja.')
|
|
|
|
+ line = self.env['account.bank.statement.line'].search([('id', '=', id)])
|
|
|
|
+ return line.amount if(line) else 0.0
|
|
|
|
+
|
|
|
|
+ ''' Get cashBox.transfer '''
|
|
|
|
+ def confirm_pos_get_casbox_transfer(self,ids):
|
|
|
|
+ _logger.info('Obtener la transferencia.')
|
|
|
|
+ transfer = self.env['cash.box.transfer'].search([('id', 'in', ids)])
|
|
|
|
+ return transfer.amount if(transfer) else 0.0
|
|
|
|
+
|
|
|
|
+ ''' Get cashBox.output '''
|
|
|
|
+ def confirm_pos_get_casbox_output(self,ids):
|
|
|
|
+ _logger.info('Obtener los retiro de dinero .')
|
|
|
|
+ output = self.env['cash.box.out'].search([('id', 'in', ids)])
|
|
|
|
+ return output.amount if(output) else 0.0
|