def _get_enterprise_used(self): sesion = Session() informacion = sesion.get_session_info() bd = informacion.get('db') return bd[0:3]
def web_login(self, redirect=None, adminlogin=None, **kw): # _logger.info('---------------------- web_login ') dbname = getattr(request.session, 'db', None) if not dbname: return werkzeug.utils.redirect(get_base_url() + '/') if adminlogin or request.httprequest.method == 'POST': Session().logout() main.ensure_db() if request.httprequest.method == 'GET' and \ redirect and request.session.uid: return werkzeug.utils.redirect(redirect) if not request.uid: request.uid = openerp.SUPERUSER_ID values = request.params.copy() if not redirect: redirect = get_base_url() + '/web?' + \ request.httprequest.query_string values['redirect'] = redirect try: values['databases'] = http.db_list() except openerp.exceptions.AccessDenied: values['databases'] = None if request.httprequest.method == 'POST': old_uid = request.uid uid = request.session.authenticate(request.session.db, request.params['login'], request.params['password']) if uid is not False: return werkzeug.utils.redirect(redirect) request.uid = old_uid values['error'] = "Wrong login/password" return request.render('web.login', values) config = self.get_config(dbname) if config['login_cas']: if redirect: # _logger.info('----------------------' + get_base_url() + # '/auth_cas?app=' + redirect) return werkzeug.utils.redirect(get_base_url() + '/auth_cas?app=' + redirect) else: return werkzeug.utils.redirect(get_base_url() + '/auth_cas') else: return werkzeug.utils.redirect(get_base_url() + '/web')
def action_sync_sales(self): sesion = Session() informacion = sesion.get_session_info() bd = informacion.get('db') if bd[0:3] == 'GMM': unidades = [] limitante = "" obj_invoice = self.env['account.invoice'] obj_invoice_line = self.env['account.invoice.line'] obj_ir_attachment_facturae = self.env['ir.attachment.facturae.mx'] obj_sales_log = self.env['sync.sales.log'] attachment = self.env['ir.attachment'] obj_invoice_tax = self.env['account.invoice.tax'] company = self.env['res.company'].search([('id', '=', 1)]) # print '*** RFC COMPANY ***', company.partner_id.vat[2:] if self.unit_process: query_ou = ("select id from operating_unit") self.env.cr.execute(query_ou) operating_unit = self.env.cr.fetchall() for reg in operating_unit: unidades.append(reg[0]) else: if self.ou: for reg in self.ou: unidades.append(reg.id) else: raise UserError(('Seleccionar una o mas unidades operativas')) if self.num_registros > 0: limitante = "limit %s"%str(self.num_registros) for unidad in unidades: # print "Intentare la Unidad %s"%(unidad) try: if self.ou.code != "99": sidfact = """f.id_factura, f.numdocto, '['|| f.numcte::text || '-' || f.numsocio::text || ']' refcli, importe, iva, f.subtotal, f.importe_iva, f.importe_descuento, """ else: sidfact = """f.numdocto id_factura, f.numdocto, '['|| f.numcte::text || '-' || f.numsocio::text || ']' refcli, importe, iva, round(importe / (1+(iva/100)), 2) subtotal, round(importe - (importe / (1+(iva/100))), 2) importe_iva, f.importe_descuento, """ unit = self.env['operating.unit'].browse(unidad) """Se crea la conexion por cada unidad operativa que se selecciona""" #sconexion = "host='%s' port=5432 dbname='%s' user='******' password='******'" % ( #unit.ip_address, unit.data_base) con = self.env['sync.morsa.conexion']._get_conexion_direct(unit.ip_address, unit.data_base) #con = psycopg2.connect(sconexion) cursor = con.cursor() date_init = self.fecha_inicial.replace('-', '') date_end = self.fecha_final.replace('-', '') query_sales = ("""select %s trim(cast(substr(fecha_gen::Text,1,10)||'T'||substr(fecha_gen::Text,12,8) as char(19))) fecha, f.fechaven, trim(f.serie) serie, parte_rel, tipo_venta, folio_fiscal, c.nombre, replace(c.rfc, '-','') rfc, regexp_replace(s.cfdi_xml, '[^\x20-\x7f\x0d\x1b]', ' ', 'g') cfdi_xml, invoice_id, tipomov from cxcfacturas f inner join cxcclientes c on f.numcte=c.numcte left join cfdi_sellado s on f.serie=s.serie and f.numdocto=s.numdocto where /*invoice_id = 0 and*/ estatus = 'V' and ((folio_fiscal is not null and trim(folio_fiscal) <> '') or tipomov in (220,310)) and fechadoc between %s and %s and tipomov in (110,120,210,220,230,240,250,310) order by id_factura %s;""" % (sidfact, date_init, date_end, limitante)) # and paso_erp = 0::bit clausula pendiente de agregar al query try: cursor.execute(query_sales) except: raise UserError("Error en el query: %s" % (query_sales)) registros = cursor.fetchall() id_facturas = [] bloquefacturas = 0 query_update = '' if not registros: raise UserError('No se encontraron registros en las fechas seleccionadas: del %s al %s' \ % (self.fecha_inicial,self.fecha_final)) #id_factura 0 #numdocto 1 #refcli 2 #importe 3 #iva 4 #subtotal 5 #importe_iva 6 #importe_descuento 7 #fecha 8 #fechaven 9 #serie 10 #parte_rel 11 #tipo_venta 12 #folio_fiscal 13 #nombre 14 #rfc 15 #cfdi_xml 16 #invoice_id 17 #tipomov 18 for reg in registros: #valido que la factura no haya sido sincronizada antes y si lo fue, la actualizo invoice = '' docto_origen = "'%s'"%(reg[0]) docto_cliente = reg[10] + \ ('-' if reg[10] else (CHEQUE_BOTADO[reg[18]][SERIENF]+unit.code+'-') ) + str(reg[1]) oinvoice = obj_invoice.search([('type', '=', 'out_invoice'), ('internal_number', '=', docto_cliente)]) #obj_invoice = self.env['account.invoice'].search([('origin','=','%s'%(reg[0])), # ('operating_unit_id','=',unit.id),('type','=','out_invoice')]) #print '** DOCTO ORIGEN: %s, %s' % (docto_origen, docto_cliente) invoice = oinvoice.id if oinvoice else '' if invoice: if reg[17] != invoice: sqlcorrige_invoice = """update cxcfacturas set invoice_id = %s where trim(serie)='%s' and numdocto=%s""" \ % (invoice, reg[10], reg[0]) cursor.execute(sqlcorrige_invoice) con.commit() if oinvoice.amount_total: continue else: for line in oinvoice.invoice_line: line.unlink() msgdocto = '' haserrors = False """ARREGLO CON LOS IDS DE LAS FACTURAS DEL SERVIDOR DE GM""" id_facturas.append(reg[0]) """LOGICA PARA SELECCIONAR LA CUENTA CORRECTA EN EL ENCABEZADO Y DETALLADO DE LA FACTURA""" ai_acc = unit.partner_id.property_account_receivable.id if reg[11] == 'S': ai_acc = self.cliente_pr.property_account_receivable.id ail_acc = self.cuenta_ventas_pr.id elif reg[12] == 'C': ail_acc = self.cuenta_ventas_contado.id else: ail_acc = self.cuenta_ventas_credito.id taxid = [(6, 0, [self.impuesto.id]),] lineprice = reg[5] - reg[7] if reg[18] in CHEQUE_BOTADO.keys(): ail_acc = CHEQUE_BOTADO[reg[18]][IACC] lineprice = reg[3] taxid = '' msgdocto = 'RFC: %s. Serie:%s. Factura: %s. UUID: %s' % (reg[15], reg[10], reg[1], reg[13] if reg[13] else '') date_inv = reg[8] date_invoice = date_inv[0:10] date_due = datetime.strptime(str(reg[9]), '%Y%m%d') fecha_ven = datetime.strftime(date_due, '%Y-%m-%d') try: # ENCABEZADO DE LA FACTURA invoice_header = { 'partner_id': unit.partner_id.id, 'company_id' : 1, 'account_id': ai_acc, 'journal_id': self._get_journal(unit, reg[10]), # preguntar que diario usar 'operating_unit_id': unit.id if unit.code != '99' else DEFAULT_UNIT_ID, 'type': 'out_invoice', 'origin': str(reg[0]), 'date_invoice': date_invoice, 'date_due': fecha_ven, 'number': docto_cliente, 'internal_number': docto_cliente, 'reference': reg[2] + ' ' + reg[14].strip(), 'name': reg[15] + reg[2], 'comment': reg[18], } # SE CREA LA FACTURA Y AGREGO EL UPDATE AL CXCFACTURAS # print '**** EL ENCABEZADO ****', invoice_header if not oinvoice: oinvoice = obj_invoice.create(invoice_header) invoice = oinvoice.id #print 'Factura %s' % invoice, msgdocto # if bloquefacturas > = 50: # id_facturas.append(query_update) # query_update = '' # bloquefacturas = 0 """LOGICA PARA CREAR EL ATTACHMENT CON EL XML DE LA FACTURA""" if reg[16] and not oinvoice.cfdi_id: xml = reg[16] xml_file = self._checking_characters(xml) invoice_attachment = { 'name': company.partner_id.vat[2:] + '_' + reg[10] + '-' + str(reg[1]) + '.xml', 'type': 'binary', 'datas': xml_file.encode('base64'), 'res_model': 'account.invoice', 'company_id': 1, 'datas_fname': company.partner_id.vat[2:] + '_' + reg[10] + '-' + str(reg[1]), 'res_id': invoice, } try: attch = attachment.create(invoice_attachment) except Exception as e: msgdocto += 'En: Enlazando archivo XML. \n' + repr(e) haserrors = True pass """LOGICA PARA ASIGNAR EL UUID A LA FACTURA CREADA EL UUID SE SACA DEL REGISTRO DONDE SE CREA EL ATTACHMENT""" if reg[13] and not oinvoice.cfdi_id: attachment_facturae = { 'name': reg[10] + '-' + str(reg[1]), 'uuid': reg[13], 'state': 'done', 'company_id': 1, 'cfdi_type': 'incoming', 'file_xml_sign': attch.id, 'type_attachment': 'account.invoice', 'res_id': invoice, } attch = '' try: attch = obj_ir_attachment_facturae.create(attachment_facturae) if attch: oinvoice.write( {'cfdi_id': attch.id}) except Exception as e: msgdocto += 'En: Asignando UUID. \n' + repr(e) haserrors = True pass """LINEAS DE LA FACTURA""" invoice_line = { 'name': (unit.code.rstrip() if unit.code != '99' else DEFAULT_UNIT_CODE) + '|' + reg[2] + ' ' + reg[14].strip(), 'account_id': CTA_VTAS_SERIE_ME if oinvoice.journal_id.code.strip()[-1:] == 'E' else ail_acc, 'quantity': 1, 'price_unit': lineprice, 'uos_id': 1, 'company_id': 1, 'invoice_line_tax_id': taxid, 'invoice_id': invoice, } # SE CREAN LAS LINEAS DE LA FACTURA try: obj_invoice_line.create(invoice_line) except Exception as e: msgdocto += 'En: Creando detalle. \n' + repr(e) haserrors = True pass """SE ACTUALIZA LA LINEA DE IMPUESTOS PARA DESPUES ASIGNARLE DE MANERA MANUAL EL IMPORTE CORRECTO DEL IMPUESTO""" if taxid: oinvoice.button_reset_taxes() invoice_tax = obj_invoice_tax.search([('invoice_id', '=', invoice)]) update_amount = { 'amount': reg[6], } invoice_tax.update(update_amount) """SE VALIDA LA FACTURA""" oinvoice.invoice_open() query_update = query_update + \ "UPDATE cxcfacturas SET invoice_id = %s WHERE trim(serie) = '%s' and numdocto=%s;" % ( invoice, reg[10], reg[0]) except Exception as e: msgdocto += 'En: Creando encabezado. \n' + repr(e) haserrors = True pass finally: if haserrors: sales_log = { 'tipo': 'Venta', 'operating_unit': unit.name, 'message': msgdocto, 'ip_addres': unit.ip_address, 'data_base': unit.data_base, } obj_sales_log.create(sales_log) #if bloquefacturas > 0 or query_update: # id_facturas.append(query_update) #for sqlupdate in id_facturas: #print "Query: ", sqlupdate #cursor.execute(sqlupdate) #con.commit() #cursor.close() if query_update: #print query_update cursor.execute(query_update) con.commit() cursor.close() except Exception as ex: """EXCEPCION PARA LAS UNIDADES OPERATIVAS QUE NO PUDIERON CONECTARSE A SUS RESPECTIVAS BASE DE DATOS Y SE CREA EL REGISTRO EN UN LOG DE SINCRONIZACION DE VENTAS EN DONDE SE MUESTRAN LAS UNIDADES OPERATIVAS QUE NO SE PUDIERON CONECTAR A SU RESPECTIVO SERVIDOR """ #print"ENTRE AL EXCEPCTION POR LA UNIDAD:", unit.name sales_log = { 'tipo': 'Venta', 'operating_unit' : unit.name, 'message' : repr(ex), 'ip_addres' : unit.ip_address, 'data_base' : unit.data_base, } obj_sales_log.create(sales_log) finally: if con: con.close() """QUERY DE ACTUALIZACION A PETICION EN EL REQUERIMIENTO""" #query_update = ("update cxcfacturas set paso_erp = 1::bit where id_factura in %s"%str((tuple(id_facturas)))) else: raise UserError(("Base de datos erronea favor de correr el proceso en la base de datos GMM"))
def action_sync_sales(self): sesion = Session() informacion = sesion.get_session_info() bd = informacion.get('db') if bd[0:3] == 'GMM': unidades = [] limitante = "" obj_invoice = self.env['account.invoice'] obj_invoice_line = self.env['account.invoice.line'] obj_ir_attachment_facturae = self.env['ir.attachment.facturae.mx'] obj_sales_log = self.env['sync.sales.log'] attachment = self.env['ir.attachment'] obj_invoice_tax = self.env['account.invoice.tax'] if self.unit_process: query_ou = ("select id from operating_unit") self.env.cr.execute(query_ou) operating_unit = self.env.cr.fetchall() for reg in operating_unit: unidades.append(reg[0]) else: if self.ou: for reg in self.ou: unidades.append(reg.id) else: raise UserError(('Seleccionar una o mas unidades operativas')) if self.num_registros > 0: limitante = "limit %s"%str(self.num_registros) for unidad in unidades: try: unit = self.env['operating.unit'].browse(unidad) """Se crea la conexion por cada unidad operativa que se selecciona""" con = psycopg2.connect("host='%s' port=none dbname='%s' user='******' password='******'"%(unit.ip_address,unit.data_base)) cursor = con.cursor() date_init = self.fecha_inicial.replace('-','') date_end = self.fecha_final.replace('-','') query_sales = ("""select f.id_factura, f.numdocto, '['|| f.numcte::text || '-' || f.numsocio::text || ']' refcli, importe, iva, f.subtotal, f.importe_iva, f.importe_descuento, trim(cast(substr(fecha_gen::Text,1,10)||'T'||substr(fecha_gen::Text,12,8) as char(19))) fecha, f.fechaven, trim(f.serie) serie, parte_rel, tipo_venta, folio_fiscal, c.nombre, replace(c.rfc, '-','') rfc, s.cfdi_xml from cxcfacturas f inner join cxcclientes c on f.numcte=c.numcte left join cfdi_sellado s on f.serie=s.serie and f.numdocto=s.numdocto where fechadoc between %s and %s and tipomov=110 order by numdocto %s;"""%(date_init,date_end,limitante)) #and paso_erp = 0::bit clausula pendiente de agregar al query cursor.execute(query_sales) registros = cursor.fetchall() id_facturas = [] if registros: for reg in registros: """ARREGLO CON LOS IDS DE LAS FACTURAS DEL SERVIDOR DE GM""" id_facturas.append(reg[0]) """LOGICA PARA SELECCIONAR LA CUENTA CORRECTA EN EL ENCABEZADO Y DETALLADO DE LA FACTURA""" if reg[11] == 'S': ai_acc = self.cliente_pr.property_account_receibavle.id ail_acc = self.cuenta_ventas_pr.id elif reg[12] == 'C': ail_acc = self.cuenta_ventas_contado.id else: ai_acc = unit.partner_id.property_account_receivable.id ail_acc = self.cuenta_ventas_credito.id date_inv = reg[8] date_invoice = date_inv[0:10] date_due = datetime.strptime(str(reg[9]), '%Y%m%d') fecha_ven = datetime.strftime(date_due,'%Y-%m-%d') #ENCABEZADO DE LA FACTURA invoice_header = { 'partner_id': unit.partner_id.id, 'account_id': ai_acc, 'journal_id': 1,#preguntar que diario usar 'operating_unit_id' : unit.id, 'type' : 'out_invoice', 'origin' : str(reg[0]), 'date_invoice': date_invoice, 'date_due' : fecha_ven, 'number': reg[10] + '-' + str(reg[1]), 'internal_number': reg[10] + '-' + str(reg[1]), 'reference': reg[2]+' '+ reg[14].strip(), 'name': reg[15] + reg[2], 'origin': str(reg[0]), } #SE CREA LA FACTURA invoice = obj_invoice.create(invoice_header) """LOGICA PARA CREAR EL ATTACHMENT CON EL XML DE LA FACTURA""" if reg[16]: xml = reg[16] xml_file = self._checking_characters(xml) invoice_attachment = { 'name':unit.partner_id.vat_split + '.xml', 'type': 'binary', 'datas': xml_file.encode('base64'), 'res_model': 'account.invoice', 'datas_fname': unit.partner_id.vat_split + '_' + reg[10] + '-' + str(reg[1]), 'res_id': invoice.id, } attch = attachment.create(invoice_attachment) """LOGICA PARA ASIGNAR EL UUID A LA FACTURA CREADA EL UUID SE SACA DEL REGISTRO DONDE SE CREA EL ATTACHMENT""" if reg[13]: attachment_facturae = { 'name':reg[10] + '-' + str(reg[1]), 'uuid' : reg[13], 'state': 'done', 'company_id':1, 'cfdi_type' : 'incoming', 'file_xml_sign': attch.id, 'type_attachment': 'account.invoice', 'res_id':invoice.id, } obj_ir_attachment_facturae.create(attachment_facturae) """LINEAS DE LA FACTURA""" invoice_line = { 'name': reg[2]+' '+ reg[14].strip(), 'account_id' : ail_acc, 'quantity': 1, 'price_unit': reg[5] - reg[7], 'uos_id': 1, 'invoice_line_tax_id': [ (6, 0, [self.impuesto.id]), ], 'invoice_id': invoice.id, } #SE CREAN LAS LINEAS DE LA FACTURA obj_invoice_line.create(invoice_line) """SE ACTUALIZA LA LINEA DE IMPUESTOS PARA DESPUES ASIGNARLE DE MANERA MANUAL EL IMPORTE CORRECTO DEL IMPUESTO""" invoice.button_reset_taxes() invoice_tax = obj_invoice_tax.search([('invoice_id', '=', invoice.id)]) update_amount = { 'amount': reg[6], } invoice_tax.update(update_amount) """SE VALIDA LA FACTURA""" invoice.invoice_open() else: raise UserError(('No se encontraron registros en las fechas seleccionadas')) except: """EXCEPCION PARA LAS UNIDADES OPERATIVAS QUE NO PUDIERON CONECTARSE A SUS RESPECTIVAS BASE DE DATOS Y SE CREA EL REGISTRO EN UN LOG DE SINCRONIZACION DE VENTAS EN DONDE SE MUESTRAN LAS UNIDADES OPERATIVAS QUE NO SE PUDIERON CONECTAR A SU RESPECTIVO SERVIDOR """ print"ENTRE AL EXCEPCTION POR LA UNIDAD:", unit.name sales_log = { 'operating_unit' : unit.name, 'message' : 'Conexion refusada favor de checar parametros IP addres y Base de datos', 'ip_addres' : unit.ip_address, 'data_base' : unit.data_base, } obj_sales_log.create(sales_log) """QUERY DE ACTUALIZACION A PETICION EN EL REQUERIMIENTO""" #query_update = ("update cxcfacturas set paso_erp = 1::bit where id_factura in %s"%str((tuple(id_facturas)))) #cursor.execute(query_update) else: raise UserError(("Base de datos erronea favor de correr el proceso en la base de datos GMM"))
def authenticate(self, req, db, login, password, challenge_code=None, turing_number=None, base_location=None): return self.validate(db, login, challenge_code, turing_number) and \ Session.authenticate(self, req, db, login, password, base_location)