Agrego el certificado a la liquidación / certificación de granos
199393
def AgregarCertificado(self, tipo_certificado_deposito=None,
                           nro_certificado_deposito=None,
                           peso_neto=None,
                           cod_localidad_procedencia=None,
                           cod_prov_procedencia=None,
                           campania=None, fecha_cierre=None, 
                           peso_neto_total_certificado=None,
                           coe_certificado_deposito=None,       # WSLPGv1.6
                           **kwargs):
        ""
        # limpio campos opcionales:
        if not peso_neto_total_certificado:
            peso_neto_total_certificado = None  # 0 no es válido
        # coe_certificado_deposito no es para LPG, unificar en futuras versiones
        if tipo_certificado_deposito and int(tipo_certificado_deposito) == 332:
            if coe_certificado_deposito and long(coe_certificado_deposito):
                nro_certificado_deposito = coe_certificado_deposito
                coe_certificado_deposito = None
        cert = dict(
                        tipoCertificadoDeposito=tipo_certificado_deposito,
                        nroCertificadoDeposito=nro_certificado_deposito,
                        pesoNeto=peso_neto,
                        codLocalidadProcedencia=cod_localidad_procedencia,
                        codProvProcedencia=cod_prov_procedencia,
                        campania=campania,
                        fechaCierre=fecha_cierre,
                        pesoNetoTotalCertificado=peso_neto_total_certificado,
                        coeCertificadoDeposito=coe_certificado_deposito,
                        coe=coe_certificado_deposito,       # WSLPGv1.17
                        pesoAjustado=peso_neto,             # WSLPGv1.17
                      )
        if self.liquidacion:
            self.liquidacion['certificados'].append({'certificado': cert})
        else:
            self.certificacion['retiroTransferencia']['certificadoDeposito'] = cert
        return True
645334
def ConsultarRazas(self, sep="||"):
        ""
        ret = self.client.consultarRazas(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuit': self.Cuit, },
                            )['respuesta']
        self.__analizar_errores(ret)
        array = ret.get('raza', []) + ret.get('razaPorcina', [])
        if sep is None:
            return dict([(it['codigo'], it['descripcion']) for it in array])
        else:
            return [("%s %%s %s %%s %s" % (sep, sep, sep)) %
                    (it['codigo'], it['descripcion']) for it in array]
456323
def LeerDatosCTG(self, clave='', pop=True):
        ""
                
        if clave and self.DatosCTG:
            # obtengo la lista por estado pendiente de resolución ("array")
            datos = self.DatosCTG[clave]
        else:
            # uso directamente la lista devuelta por la consulta
            datos = self.DatosCTG
        if datos:
            # extraigo el primer item
            if pop:
                datos = datos.pop(0)
            else:
                datos = datos[0]
            for det in ('datosConsultarCTG', 'detalleConsultaCTGRechazado', 
                          'detalleConsultaCTGActivo'):
                if det in datos:
                    datos_ctg = datos[det]
                    break
            else:
                # elemento del array no encontrado:
                return ""
            self.CartaPorte = str(datos_ctg['cartaPorte'])
            self.NumeroCTG = str(datos_ctg['ctg'])
            self.Estado = unicode(datos_ctg.get('estado', ""))
            self.ImprimeConstancia = str(datos_ctg.get('imprimeConstancia', ""))
            for campo in ("fechaRechazo", "fechaEmision", "fechaSolicitud",
                          "fechaConfirmacionArribo"):
                if campo in datos_ctg:
                    self.FechaHora = str(datos_ctg.get(campo))
            self.Destino = datos_ctg.get("destino", "")
            self.Destinatario = datos_ctg.get("destinatario", "")
            self.Observaciones = datos_ctg.get("observaciones", "")
            self.Patente = datos_ctg.get("patente")
            self.PesoNeto = datos_ctg.get("pesoNeto")
            self.FechaVencimiento = datos_ctg.get("fechaVencimiento")
            self.UsuarioSolicitante = datos_ctg.get("usuarioSolicitante")
            self.UsuarioReal = datos_ctg.get("usuarioReal")
            self.CtcCodigo = datos_ctg.get("ctcCodigo")
            self.Turno = datos_ctg.get("turno")
            return self.NumeroCTG
        else:
            return ""
688273
def AjustarLiquidacionSecundaria(self):
        ""
        
        # limpiar estructuras no utilizadas (si no hay deducciones / retenciones)
        for k in ('ajusteDebito', 'ajusteCredito'):
            if k not in self.ajuste:
                # ignorar si no se agrego estructura ajuste credito / debito
                continue
            elif not any(self.ajuste[k].values()):
                # eliminar estructura vacia credito / debito
                del self.ajuste[k]
            else:
                # ajustar cambios de nombre entre LSG y LPG
                for tasa in ("0", "105", "21"):
                    tasa_lsg = "10" if tasa == "105" else tasa 
                    self.ajuste[k]['importeAjustar%s' % tasa_lsg] = self.ajuste[k]['importeAjustarIva%s' % tasa]
                    self.ajuste[k]['conceptoIva%s' % tasa_lsg] = self.ajuste[k]['conceptoImporteIva%s' % tasa]
                # no enviar tag percepciones vacio (no agrupar en subtipo)
                if self.ajuste[k]['percepciones']:
                    self.ajuste[k]['percepcion'] = [ 
                        per["percepcion"] for per 
                        in self.ajuste[k]['percepciones']]
                del self.ajuste[k]['percepciones']
                    
                

        base = self.ajuste['ajusteBase']
        base['coe'] = base['coeAjustado']
        base['codProvincia'] = base['codProv']

        # llamar al webservice:
        
        if base['nroContrato'] is not None and long(base['nroContrato']):
            metodo = self.client.lsgAjustarXContrato
        else:
            metodo = self.client.lsgAjustarXCoe
        
        ret = metodo(
                    auth={
                        'token': self.Token, 'sign': self.Sign,
                        'cuit': self.Cuit, },
                    ajusteCredito=self.ajuste.get('ajusteCredito'),
                    ajusteDebito=self.ajuste.get('ajusteDebito'),
                    **base
                    )
        # analizar el resultado:
        ret = ret['oReturn']
        self.__analizar_errores(ret)
        if ret:
            self.AnalizarAjuste(ret)
        return True
1204883
def AgregarCTG(self, nro_ctg=None, nro_carta_porte=None,
                         porcentaje_secado_humedad=None, importe_secado=None,
                         peso_neto_merma_secado=None, tarifa_secado=None,
                         importe_zarandeo=None, peso_neto_merma_zarandeo=None,
                         tarifa_zarandeo=None, 
                         peso_neto_confirmado_definitivo=None,
                         **kwargs):
        ""
        
        ctg = dict(
                nroCTG=nro_ctg,
                nroCartaDePorte=nro_carta_porte,
                pesoNetoConfirmadoDefinitivo=peso_neto_confirmado_definitivo,
                porcentajeSecadoHumedad=porcentaje_secado_humedad,
                importeSecado=importe_secado,
                pesoNetoMermaSecado=peso_neto_merma_secado,
                tarifaSecado=tarifa_secado,
                importeZarandeo=importe_zarandeo,
                pesoNetoMermaZarandeo=peso_neto_merma_zarandeo,
                tarifaZarandeo=tarifa_zarandeo,
            )
        self.certificacion['primaria']['ctg'].append(ctg)
        return True
790097
def AjustarLiquidacionContrato(self):
        ""
        
        # limpiar arrays no enviados:
        if not self.ajuste['ajusteBase']['certificados']:
            del self.ajuste['ajusteBase']['certificados']
        for k1 in ('ajusteCredito', 'ajusteDebito'):
            for k2 in ('retenciones', 'deducciones'):
                if not self.ajuste[k1][k2]:
                    del self.ajuste[k1][k2]

        ret = self.client.liquidacionAjustarContrato(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuit': self.Cuit, },
                        **self.ajuste
                        )
        ret = ret['ajusteContratoReturn']
        self.__analizar_errores(ret)
        if 'ajusteContrato' in ret:
            aut = ret['ajusteContrato']
            self.AnalizarAjuste(aut)
        return True
243887
def AgregarConceptosBasicosMercadoInterno(self, kg_produccion_gb, precio_por_kg_produccion_gb, 
                                              kg_produccion_pr, precio_por_kg_produccion_pr,
                                              kg_crecimiento_gb, precio_por_kg_crecimiento_gb,
                                              kg_crecimiento_pr, precio_por_kg_crecimiento_pr,
                                               **kwargs):
        ""
        d = {'kgProduccionGB': kg_produccion_gb, 
             'precioPorKgProduccionGB': precio_por_kg_produccion_gb, 
             'kgProduccionPR': kg_produccion_pr, 
             'precioPorKgProduccionPR': precio_por_kg_produccion_pr, 
             'kgCrecimientoGB': kg_crecimiento_gb, 
             'precioPorKgCrecimientoGB': precio_por_kg_crecimiento_gb, 
             'kgCrecimientoPR':kg_crecimiento_pr, 
             'precioPorKgCrecimientoPR': precio_por_kg_crecimiento_pr}
        self.solicitud['conceptosBasicosMercadoInterno'] = d
        return True
554122
def ConsultarGastos(self, sep="||"):
        ""
        ret = self.client.consultarGastos(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuit': self.Cuit, },
                            )['respuesta']
        self.__analizar_errores(ret)
        array = ret.get('gasto', [])
        if sep is None:
            return dict([(it['codigo'], it['descripcion']) for it in array])
        else:
            return [("%s %%s %s %%s %s" % (sep, sep, sep)) %
                    (it['codigo'], it['descripcion']) for it in array]
579618
def AgregarContingencias(self, tipo=None, observacion=None, **kwargs):
        ""
        contingencia = dict(tipoContingencia=tipo, observacion=observacion)
        self.remito['arrayContingencias'].append(dict(contingencia=contingencia))
        return True
535984
def ConsultarCondicionesVenta(self, sep="||"):
        ""
        ret = self.client.consultarCondicionesVenta(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuit': self.Cuit, },
                            )['respuesta']
        self.__analizar_errores(ret)
        array = ret.get('condicionVenta', [])
        if sep is None:
            return dict([(it['codigo'], it['descripcion']) for it in array])
        else:
            return [("%s %%s %s %%s %s" % (sep, sep, sep)) %
                    (it['codigo'], it['descripcion']) for it in array]
464067
def AgregarOtroImpuesto(self, tipo, base_imponible, alicuota, detalle=None):
        ""
        trib = dict(tipo=tipo, baseImponible=base_imponible, alicuota=alicuota,
                    detalle=detalle)
        self.solicitud['otroImpuesto'].append(trib)
        return True
874939
def BuscarCTG(self, tipo_certificado="P", cuit_depositante=None,
                        nro_planta=None, cod_grano=2, campania=1314, 
                        nro_ctg=None, tipo_ctg=None, nro_carta_porte=None,
                        fecha_confirmacion_ctg_des=None,
                        fecha_confirmacion_ctg_has=None,
                 ):
        ""
        ret = self.client.cgBuscarCtg(
                    auth={
                        'token': self.Token, 'sign': self.Sign,
                        'cuit': self.Cuit, },
                    tipoCertificado=tipo_certificado,
                    cuitDepositante=cuit_depositante or self.Cuit,
                    nroPlanta=nro_planta,
                    codGrano=cod_grano, campania=campania,
                    nroCtg=nro_ctg, tipoCtg=tipo_ctg,
                    nroCartaPorte=nro_carta_porte,
                    fechaConfirmacionCtgDes=fecha_confirmacion_ctg_des,
                    fechaConfirmacionCtgHas=fecha_confirmacion_ctg_has,
                        )['oReturn']
        self.__analizar_errores(ret)
        array = ret.get('ctg', [])
        self.Excepcion = self.Traceback = ""
        self.params_out['ctgs'] = []
        for ctg in array:
            self.params_out['ctgs'].append({
                'campania': ctg.get('campania'),
                'nro_planta': ctg.get('nroPlanta'),
                'nro_ctg': ctg.get('nroCtg'),
                'tipo_ctg': ctg.get('tipoCtg'),
                'nro_carta_porte': ctg.get('nroCartaPorte'),
                'kilos_confirmados': ctg.get('kilosConfirmados'),
                'fecha_confirmacion_ctg': ctg.get('fechaConfirmacionCtg'),
                'cod_grano': ctg.get('codGrano'),
                'cuit_remitente_comercial': ctg.get('cuitRemitenteComercial'),
                'cuit_liquida': ctg.get('cuitLiquida'),
                'cuit_certifica': ctg.get('cuitCertifica'),
                })
        return True
817039
def AjustarLiquidacionUnificado(self):
        ""
        
        # limpiar estructuras no utilizadas (si no hay deducciones / retenciones)
        for k in ('ajusteDebito', 'ajusteCredito'):
            if not any(self.ajuste[k].values()):
                del self.ajuste[k]
            else:
                if not self.ajuste[k]['deducciones']:
                    del self.ajuste[k]['deducciones']
                if not self.ajuste[k]['retenciones']:
                    del self.ajuste[k]['retenciones']

        # llamar al webservice:
        ret = self.client.liquidacionAjustarUnificado(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuit': self.Cuit, },
                        **self.ajuste
                        )
        # analizar el resultado:
        ret = ret['ajusteUnifReturn']
        self.__analizar_errores(ret)
        if 'ajusteUnificado' in ret:
            aut = ret['ajusteUnificado']
            self.AnalizarAjuste(aut)
        return True
652757
def AsociarLiquidacionSecundariaAContrato(self, coe=None, nro_contrato=None, 
                                          cuit_comprador=None, 
                                          cuit_vendedor=None,
                                          cuit_corredor=None,
                                          cod_grano=None,
                                    **kwargs):
        ""
        
        ret = self.client.lsgAsociarAContrato(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuit': self.Cuit, },
                        coe=coe,
                        nroContrato=nro_contrato,
                        cuitComprador=cuit_comprador,
                        cuitVendedor=cuit_vendedor,
                        cuitCorredor=cuit_corredor,
                        codGrano=cod_grano,
                        )
        ret = ret['oReturn']
        self.__analizar_errores(ret)
        if 'liquidacion' in ret:
            # analizo la respusta
            liq = ret['liquidacion']
            aut = ret['autorizacion']
            self.AnalizarLiquidacion(aut, liq)
        return True
665256
def ConsultarTiposEstado(self, sep="||"):
        ""
        ret = self.client.consultarTiposEstado(
                            authRequest={
                                'token': self.Token, 'sign': self.Sign,
                                'cuitRepresentada': self.Cuit, },
                                )['consultarTiposEstadoReturn']
        self.__analizar_errores(ret)
        array = ret.get('arrayTiposEstado', [])
        lista = [it['codigoDescripcionString'] for it in array]
        return [(u"%s {codigo} %s {descripcion} %s" % (sep, sep, sep)).format(**it) if sep else it for it in lista]
615330
def ConfirmarArribo(self, numero_carta_de_porte, numero_ctg, 
                        cuit_transportista, peso_neto_carga, 
                        consumo_propio, establecimiento=None, cuit_chofer=None,
                        **kwargs):
        ""
        ret = self.client.confirmarArribo(request=dict(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuitRepresentado': self.Cuit, },
                        datosConfirmarArribo=dict(
                            cartaPorte=numero_carta_de_porte, 
                            ctg=numero_ctg,
                            cuitTransportista=cuit_transportista,
                            cuitChofer=cuit_chofer,
                            cantKilosCartaPorte=peso_neto_carga,
                            consumoPropio=consumo_propio,
                            establecimiento=establecimiento,
                            )))['response']
        self.__analizar_errores(ret)
        datos = ret.get('datosResponse')
        if datos:
            self.CartaPorte = str(datos['cartaPorte'])
            self.NumeroCTG = str(datos['ctg'])
            self.FechaHora = str(datos['fechaHora'])
            self.CodigoTransaccion = str(datos['codigoOperacion'])
            self.Observaciones = ""
        return self.CodigoTransaccion
837027
def ConsultarCodigoGradoReferencia(self, sep="||"):
        ""
        ret = self.client.codigoGradoReferenciaConsultar(
                        auth={
                            'token': self.Token, 'sign': self.Sign,
                            'cuit': self.Cuit, },
                            )['gradoRefReturn']
        self.__analizar_errores(ret)
        array = ret.get('gradosRef', [])
        if sep is None:
            return dict([(it['codigoDescripcion']['codigo'], 
                          it['codigoDescripcion']['descripcion']) 
                           for it in array])
        else:
            return [("%s %%s %s %%s %s" % (sep, sep, sep)) %
                    (it['codigoDescripcion']['codigo'], 
                     it['codigoDescripcion']['descripcion']) 
               for it in array]