369 lines
12 KiB
Python
369 lines
12 KiB
Python
#This file is part of seur. The COPYRIGHT file at the top level of
|
|
#this repository contains the full copyright notices and license terms.
|
|
|
|
from seur.api import API
|
|
|
|
from xml.dom.minidom import parseString
|
|
import os
|
|
import datetime
|
|
import genshi
|
|
import genshi.template
|
|
|
|
loader = genshi.template.TemplateLoader(
|
|
os.path.join(os.path.dirname(__file__), 'template'),
|
|
auto_reload=True)
|
|
|
|
|
|
class Picking(API):
|
|
"""
|
|
Picking API
|
|
"""
|
|
__slots__ = ()
|
|
|
|
def create(self, data):
|
|
"""
|
|
Create a picking using the given data
|
|
|
|
:param data: Dictionary of values
|
|
:return: reference (str), label (pdf), error (str)
|
|
"""
|
|
reference = None
|
|
label = None
|
|
error = None
|
|
|
|
if self.context.get('pdf'):
|
|
tmpl = loader.load('picking_send_pdf.xml')
|
|
else:
|
|
tmpl = loader.load('picking_send.xml')
|
|
|
|
vals = {
|
|
'username': self.username,
|
|
'password': self.password,
|
|
'vat': self.vat,
|
|
'franchise': self.franchise,
|
|
'seurid': self.seurid,
|
|
'ci': self.ci,
|
|
'ccc': self.ccc,
|
|
'servicio': data.get('servicio', '1'),
|
|
'product': data.get('product', '2'),
|
|
'total_bultos': data.get('total_bultos', 1),
|
|
'total_kilos': data.get('total_kilos', '1'),
|
|
'peso_bulto': data.get('peso_bulto', '1'),
|
|
'observaciones': data.get('observaciones', ''),
|
|
'referencia_expedicion': data.get('referencia_expedicion', ''),
|
|
'ref_bulto': data.get('ref_bulto', ''),
|
|
'clave_portes': data.get('clave_portes', 'F'), # F: Facturacion
|
|
'clave_reembolso': data.get('clave_reembolso', 'F'), # F: Facturacion
|
|
'valor_reembolso': data.get('valor_reembolso', ''),
|
|
'cliente_nombre': data.get('cliente_nombre', ''),
|
|
'cliente_direccion': data.get('cliente_direccion', ''),
|
|
'cliente_tipovia': data.get('cliente_tipovia', 'CL'),
|
|
'cliente_tnumvia': data.get('cliente_tnumvia', 'N'),
|
|
'cliente_numvia': data.get('cliente_numvia', '.'),
|
|
'cliente_escalera': data.get('cliente_escalera', '.'),
|
|
'cliente_piso': data.get('cliente_piso', '.'),
|
|
'cliente_puerta': data.get('cliente_puerta', ''),
|
|
'cliente_poblacion': data.get('cliente_poblacion', ''),
|
|
'cliente_cpostal': data.get('cliente_cpostal', ''),
|
|
'cliente_pais': data.get('cliente_pais', ''),
|
|
'cliente_email': data.get('cliente_email', ''),
|
|
'cliente_telefono': data.get('cliente_telefono', ''),
|
|
'cliente_atencion': data.get('cliente_atencion', ''),
|
|
'aviso_preaviso': data.get('aviso_preaviso', 'N'),
|
|
'aviso_reparto': data.get('aviso_reparto', 'N'),
|
|
'aviso_email': data.get('aviso_email', 'N'),
|
|
'aviso_sms': data.get('aviso_sms', 'N'),
|
|
'id_mercancia': data.get('id_mercancia', ''),
|
|
}
|
|
|
|
if not self.context.get('pdf'):
|
|
vals['printer'] = self.context.get('printer', 'ZEBRA')
|
|
vals['printer_model'] = self.context.get('printer_model', 'LP2844-Z')
|
|
vals['ecb_code'] = self.context.get('ecb_code', '2C')
|
|
|
|
url = 'http://cit.seur.com/CIT-war/services/ImprimirECBWebService'
|
|
xml = tmpl.generate(**vals).render()
|
|
result = self.connect(url, xml)
|
|
if not result:
|
|
return reference, label, 'timed out'
|
|
|
|
dom = parseString(result)
|
|
|
|
#Get message error from XML
|
|
mensaje = dom.getElementsByTagName('mensaje')
|
|
if mensaje:
|
|
if mensaje[0].firstChild.data != 'OK':
|
|
error = '%s - %s' % (vals['ref_bulto'], mensaje[0].firstChild.data)
|
|
return reference, label, error
|
|
|
|
#Get reference from XML
|
|
ecb = dom.getElementsByTagName('ECB')
|
|
if ecb:
|
|
reference = ecb[0].childNodes[0].firstChild.data
|
|
|
|
if self.context.get('pdf'):
|
|
#Get PDF file from XML
|
|
pdf = dom.getElementsByTagName('PDF')
|
|
if pdf:
|
|
label = pdf[0].firstChild.data
|
|
else:
|
|
#Get TXT file from XML
|
|
traza = dom.getElementsByTagName('traza')
|
|
if traza:
|
|
label = traza[0].firstChild.data
|
|
|
|
return reference, label, error
|
|
|
|
def info(self, data):
|
|
"""
|
|
Picking info using the given data
|
|
|
|
:param data: Dictionary of values
|
|
:return: info dict
|
|
"""
|
|
tmpl = loader.load('picking_info.xml')
|
|
|
|
vals = {
|
|
'username': self.username,
|
|
'password': self.password,
|
|
'expedicion': data.get('expedicion', 'S'),
|
|
'reference': data.get('reference'),
|
|
'service': data.get('service', '0'),
|
|
'public': data.get('public', 'N'),
|
|
}
|
|
|
|
url = 'https://ws.seur.com/webseur/services/WSConsultaExpediciones'
|
|
xml = tmpl.generate(**vals).render()
|
|
result = self.connect(url, xml)
|
|
if not result:
|
|
return
|
|
|
|
dom = parseString(result)
|
|
|
|
#Get info
|
|
info = dom.getElementsByTagName('out')
|
|
return info[0].firstChild.data
|
|
|
|
def list(self, data):
|
|
"""
|
|
Picking list using the given data
|
|
|
|
:param data: Dictionary of values
|
|
:return: list dict
|
|
"""
|
|
tmpl = loader.load('picking_list.xml')
|
|
|
|
t = datetime.datetime.now()
|
|
today = '%s-%s-%s' % (t.day, t.month, t.year)
|
|
|
|
vals = {
|
|
'username': self.username,
|
|
'password': self.password,
|
|
'ccc': self.ccc,
|
|
'expedicion': data.get('expedicion', 'S'),
|
|
'date_from': data.get('from', today),
|
|
'date_to': data.get('to', today),
|
|
'service': data.get('service', '0'),
|
|
'public': data.get('public', 'N'),
|
|
}
|
|
|
|
url = 'https://ws.seur.com/webseur/services/WSConsultaExpediciones'
|
|
xml = tmpl.generate(**vals).render()
|
|
result = self.connect(url, xml)
|
|
if not result:
|
|
return
|
|
|
|
dom = parseString(result)
|
|
|
|
#Get list
|
|
info = dom.getElementsByTagName('out')
|
|
return info[0].firstChild.data
|
|
|
|
def label(self, data):
|
|
"""
|
|
Get label picking using reference
|
|
|
|
:param data: Dictionary of values
|
|
:return: string
|
|
"""
|
|
if self.context.get('pdf'):
|
|
tmpl = loader.load('picking_label_pdf.xml')
|
|
else:
|
|
tmpl = loader.load('picking_label.xml')
|
|
|
|
vals = {
|
|
'username': self.username,
|
|
'password': self.password,
|
|
'vat': self.vat,
|
|
'franchise': self.franchise,
|
|
'seurid': self.seurid,
|
|
'ci': self.ci,
|
|
'ccc': self.ccc,
|
|
'servicio': data.get('servicio', '1'),
|
|
'product': data.get('product', '2'),
|
|
'total_bultos': data.get('total_bultos', 1),
|
|
'total_kilos': data.get('total_kilos', '1'),
|
|
'peso_bulto': data.get('peso_bulto', '1'),
|
|
'observaciones': data.get('observaciones', ''),
|
|
'referencia_expedicion': data.get('referencia_expedicion', ''),
|
|
'ref_bulto': data.get('ref_bulto', ''),
|
|
'clave_portes': data.get('clave_portes', 'F'), # F: Facturacion
|
|
'clave_reembolso': data.get('clave_reembolso', 'F'), # F: Facturacion
|
|
'valor_reembolso': data.get('valor_reembolso', ''),
|
|
'cliente_nombre': data.get('cliente_nombre', ''),
|
|
'cliente_direccion': data.get('cliente_direccion', ''),
|
|
'cliente_tipovia': data.get('cliente_tipovia', 'CL'),
|
|
'cliente_tnumvia': data.get('cliente_tnumvia', 'N'),
|
|
'cliente_numvia': data.get('cliente_numvia', '.'),
|
|
'cliente_escalera': data.get('cliente_escalera', '.'),
|
|
'cliente_piso': data.get('cliente_piso', '.'),
|
|
'cliente_puerta': data.get('cliente_puerta', ''),
|
|
'cliente_poblacion': data.get('cliente_poblacion', ''),
|
|
'cliente_cpostal': data.get('cliente_cpostal', ''),
|
|
'cliente_pais': data.get('cliente_pais', ''),
|
|
'cliente_email': data.get('cliente_email', ''),
|
|
'cliente_telefono': data.get('cliente_telefono', ''),
|
|
'cliente_atencion': data.get('cliente_atencion', ''),
|
|
}
|
|
|
|
if not self.context.get('pdf'):
|
|
vals['printer'] = self.context.get('printer', 'ZEBRA')
|
|
vals['printer_model'] = self.context.get('printer_model', 'LP2844-Z')
|
|
vals['ecb_code'] = self.context.get('ecb_code', '2C')
|
|
|
|
url = 'http://cit.seur.com/CIT-war/services/ImprimirECBWebService'
|
|
xml = tmpl.generate(**vals).render()
|
|
|
|
result = self.connect(url, xml)
|
|
if not result:
|
|
return
|
|
|
|
dom = parseString(result)
|
|
|
|
if self.context.get('pdf'):
|
|
pdf = dom.getElementsByTagName('PDF')
|
|
if pdf:
|
|
return pdf[0].firstChild.data
|
|
else:
|
|
traza = dom.getElementsByTagName('traza')
|
|
if traza:
|
|
return traza[0].firstChild.data
|
|
return
|
|
|
|
def manifiesto(self, data):
|
|
"""
|
|
Get Manifiesto
|
|
|
|
:param data: Dictionary of values
|
|
:return: string
|
|
"""
|
|
tmpl = loader.load('manifiesto.xml')
|
|
|
|
vals = {
|
|
'username': self.username,
|
|
'password': self.password,
|
|
'vat': self.vat,
|
|
'franchise': self.franchise,
|
|
'seurid': self.seurid,
|
|
'ci': self.ci,
|
|
'ccc': self.ccc,
|
|
}
|
|
if data.get('date'):
|
|
vals['date'] = data.get('date')
|
|
else:
|
|
d = datetime.datetime.now()
|
|
vals['date'] = '%s-%s-%s' % (d.year, d.strftime('%m'), d.strftime('%d'))
|
|
|
|
url = 'http://cit.seur.com/CIT-war/services/DetalleBultoPDFWebService'
|
|
xml = tmpl.generate(**vals).render()
|
|
|
|
result = self.connect(url, xml)
|
|
if not result:
|
|
return
|
|
|
|
dom = parseString(result)
|
|
|
|
pdf = dom.getElementsByTagName('ns1:out')
|
|
return pdf[0].firstChild.data if pdf else None
|
|
|
|
def city(self, city):
|
|
"""
|
|
Get Seur values from city
|
|
|
|
:param city: string
|
|
:return: dict
|
|
"""
|
|
tmpl = loader.load('city.xml')
|
|
|
|
vals = {
|
|
'username': self.username,
|
|
'password': self.password,
|
|
'city': city.upper(),
|
|
}
|
|
|
|
url = 'https://ws.seur.com/WSEcatalogoPublicos/servlet/XFireServlet/WSServiciosWebPublicos'
|
|
xml = tmpl.generate(**vals).render()
|
|
result = self.connect(url, xml)
|
|
if not result:
|
|
return []
|
|
|
|
dom = parseString(result)
|
|
info = dom.getElementsByTagName('out')
|
|
data = info[0].firstChild.data
|
|
dom2 = parseString(data.encode('utf-8'))
|
|
registros = dom2.getElementsByTagName('REGISTROS')
|
|
|
|
total = registros[0].childNodes.length
|
|
|
|
values = []
|
|
for i in range(1, total+1):
|
|
reg_name = 'REG%s' % i
|
|
reg = registros[0].getElementsByTagName(reg_name)[0]
|
|
vals = {}
|
|
for r in reg.childNodes:
|
|
vals[r.nodeName] = r.firstChild.data
|
|
values.append(vals)
|
|
|
|
return values
|
|
|
|
def zip(self, zip):
|
|
"""
|
|
Get Seur values from zip
|
|
|
|
:param zip: string
|
|
:return: list dict
|
|
"""
|
|
tmpl = loader.load('zip.xml')
|
|
|
|
vals = {
|
|
'username': self.username,
|
|
'password': self.password,
|
|
'zip': zip,
|
|
}
|
|
|
|
url = 'https://ws.seur.com/WSEcatalogoPublicos/servlet/XFireServlet/WSServiciosWebPublicos'
|
|
xml = tmpl.generate(**vals).render()
|
|
result = self.connect(url, xml)
|
|
if not result:
|
|
return []
|
|
|
|
dom = parseString(result)
|
|
info = dom.getElementsByTagName('ns1:out')
|
|
data = info[0].firstChild.data
|
|
|
|
dom2 = parseString(data.encode('utf-8'))
|
|
registros = dom2.getElementsByTagName('REGISTROS')
|
|
|
|
total = registros[0].childNodes.length
|
|
|
|
values = []
|
|
for i in range(1, total+1):
|
|
reg_name = 'REG%s' % i
|
|
reg = registros[0].getElementsByTagName(reg_name)[0]
|
|
vals = {}
|
|
for r in reg.childNodes:
|
|
vals[r.nodeName] = r.firstChild.data
|
|
values.append(vals)
|
|
|
|
return values
|