Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
S
smsManager
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Cristian Mauricio Diaz Canales
smsManager
Commits
2774d202
Commit
2774d202
authored
Jun 10, 2019
by
Cristian Mauricio Diaz Canales
💬
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix multi device-version 2
parent
3a166c62
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
321 additions
and
0 deletions
+321
-0
src/BackendBundle/Command/McafeeMigrarUsuariosV2Command.php
src/BackendBundle/Command/McafeeMigrarUsuariosV2Command.php
+321
-0
No files found.
src/BackendBundle/Command/McafeeMigrarUsuariosV2Command.php
0 → 100644
View file @
2774d202
<?php
namespace
BackendBundle\Command
;
use
Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand
;
use
Symfony\Component\Console\Input\InputArgument
;
use
Symfony\Component\Console\Input\InputInterface
;
use
Symfony\Component\Console\Input\InputOption
;
use
Symfony\Component\Console\Output\OutputInterface
;
use
AppBundle\Model\UsuariosMcafeeMovistarMigrar
;
use
AppBundle\Model\UsuariosMcafeeMovistarMigrarQuery
;
use
AppBundle\Model\UsuarioMcafee
;
use
AppBundle\Model\UsuarioMcafeeQuery
;
use
AppBundle\Model\McafeeTransaccion
;
use
AppBundle\Model\McafeeTransaccionQuery
;
use
AppBundle\Model\McafeeTransaccionPendiente
;
use
AppBundle\Model\McafeeTransaccionPendienteQuery
;
use
AppBundle\Model\McafeeUltimoProcesoMigracion
;
use
AppBundle\Model\McafeeUltimoProcesoMigracionQuery
;
use
AppBundle\Lib\Utiles
;
class
McafeeMigrarUsuariosCommand
extends
ContainerAwareCommand
{
const
LENGUAJE
=
"es"
;
const
TIMEOUT
=
20
;
const
SKU_DESTINY
=
"419-92860-1usermds"
;
protected
function
configure
()
{
$this
->
setName
(
'mcafee:migrar-usuarios-v2'
)
->
setDescription
(
'comando que sirve para migrar los usuarios del sistema a la tabla usuario_mcafee-version 2'
)
;
}
protected
function
execute
(
InputInterface
$input
,
OutputInterface
$output
)
{
$output
->
writeln
(
"COMANDO INICIADO."
);
$log
=
Utiles
::
setLog
(
'command::migrarUsuariosSuscripcion'
,
'ws/wsMigrarUsuariosMcAfee'
);
$esTxPendiente
=
false
;
$failedAlready
=
false
;
$ultimoUsuarioProcesado
=
null
;
$cantidadProcesados
=
0
;
$cantidadPendientes
=
0
;
$usuariosMax
=
Utiles
::
getParametroConfiguracion
(
"numero_usuarios"
);
$limiteAuxUsuarios
=
Utiles
::
getParametroConfiguracion
(
"limite_inicio"
);
$log
->
debug
(
"obteniendo ultimo indice procesado..."
);
$ultimoIndiceUsuarioProcesado
=
McafeeUltimoProcesoMigracionQuery
::
create
()
//arreglar es ultimo indice procesado
->
orderByMupId
(
"DESC"
)
->
findOne
();
if
(
$ultimoIndiceUsuarioProcesado
==
null
)
$condicion
=
"usuarios_mcafee_movistar_migrar.id > 0 and usuarios_mcafee_movistar_migrar.Device_Type != 'MultiDevice'"
;
//else $condicion = "usuarios_mcafee_movistar_migrar.id > ".$ultimoIndiceUsuarioProcesado->getUltimoUmcId();
else
$condicion
=
"usuarios_mcafee_movistar_migrar.id >=
$limiteAuxUsuarios
and usuarios_mcafee_movistar_migrar.id > "
.
$ultimoIndiceUsuarioProcesado
->
getUltimoUmcId
()
.
" and usuarios_mcafee_movistar_migrar.Device_Type != 'MultiDevice'"
;
$log
->
debug
(
"condicion a analizar(todos menos multi-device) "
.
$condicion
);
$log
->
debug
(
"obteniendo usuarios candidatos a migrar..."
);
$usuariosAMigrar
=
UsuariosMcafeeMovistarMigrarQuery
::
create
()
->
where
(
$condicion
)
->
limit
(
$usuariosMax
)
->
find
();
$log
->
debug
(
"cantidad de usuarios a migrar..."
.
count
(
$usuariosAMigrar
));
$log
->
debug
(
"obteniendo partner ID..."
);
$mcAfeePartnerId
=
Utiles
::
getParametroConfiguracion
(
'mcafee_partner_id'
);
$log
->
debug
(
"comenzando proceso de migracion..."
);
foreach
(
$usuariosAMigrar
as
$index
=>
$usuarioMigrar
)
:
$log
->
debug
(
"generando item a procesar..."
);
$customerContextId
=
'GLN_'
.
$usuarioMigrar
->
getId
()
.
'_'
.
$usuarioMigrar
->
getAreaTel
();
$nuevoUsuario
=
new
UsuarioMcafee
();
$nuevoUsuario
->
setUmcMcafeeTipoProducto
(
UsuarioMcafee
::
TIPO_MULTIDEVICE
);
$nuevoUsuario
->
setUmcMcafeeAffid
(
419
);
$nuevoUsuario
->
setUmcMcafeeKeycard
(
null
);
$nuevoUsuario
->
setUmcMcafeeSku
(
$usuarioMigrar
->
getSku
());
$nuevoUsuario
->
setUmcMcafeeCcid
(
$usuarioMigrar
->
getCcid
());
$nuevoUsuario
->
setUmcMcafeeEmail
(
$usuarioMigrar
->
getEmailAddress
());
$nuevoUsuario
->
setUmcMovistarEmail
(
$usuarioMigrar
->
getCorreo
());
$nuevoUsuario
->
setUmcMovistarRut
(
$usuarioMigrar
->
getRut
());
if
(
$usuarioMigrar
->
getFonoContactoMovil1
()
!=
0
){
$telMovil
=
$usuarioMigrar
->
getFonoContactoMovil1
();
}
else
{
$telMovil
=
$usuarioMigrar
->
getFonoContactoMovil2
();
}
$nuevoUsuario
->
setUmcMovil
(
$telMovil
);
$nuevoUsuario
->
setUmcFijo
(
$usuarioMigrar
->
getAreaTel
());
$nuevoUsuario
->
setUmcMovistarAny
(
explode
(
"@"
,
$usuarioMigrar
->
getEmailAddress
())[
0
]);
$nuevoUsuario
->
setUmcMovistarActivo
(
UsuarioMcafee
::
ACTIVO_MOVISTAR_TRUE
);
$nuevoUsuario
->
setUmcParametroEncriptado
(
$nuevoUsuario
->
generarUsuarioEncriptadoParaMovistar
());
$nuevoUsuario
->
setUmcCustomerId
(
null
);
$nuevoUsuario
->
setUmcPermiteEmail
(
1
);
$nuevoUsuario
->
setUmcFechaDesuscripcionEmail
(
null
);
$nuevoUsuario
->
setUmcEliminado
(
UsuarioMcafee
::
ELIMINADO_FALSE
);
$nuevoUsuario
->
setCreatedAt
(
new
\DateTime
());
$nuevoUsuario
->
setUpdatedAt
(
new
\DateTime
());
$nuevoUsuario
->
save
();
$log
->
debug
(
"comenzando a generar registro de la transaccion.."
);
$mcAfeeTx
=
new
McafeeTransaccion
();
$mcAfeeTx
->
setMtrTipo
(
McafeeTransaccion
::
TIPO_ALTA
);
$mcAfeeTx
->
generarNroReferencia
();
$mcAfeeTx
->
setMtrEstado
(
McafeeTransaccion
::
ESTADO_NO_ENVIADA
);
$mcAfeeTx
->
setUsuarioMcafee
(
$nuevoUsuario
);
$xmlPartnerContext
=
'<PARTNERCONTEXT>
<HEADER>
<PARTNER PARTNER_ID="'
.
$mcAfeePartnerId
.
'"/>
</HEADER>
<DATA>
<CUSTOMERCONTEXT ID="'
.
$nuevoUsuario
->
getUmcMcafeeCcid
()
.
'" REQUESTTYPE="UPDATE">
<ACCOUNT/>
<ORDER PARTNERREF="'
.
$mcAfeeTx
->
getMtrReferencia
()
.
'" REF="">
<ITEMS>
<ITEM SKU="'
.
self
::
SKU_DESTINY
.
'" QTY="1" ACTION="TU">
<SOURCESKU>'
.
$usuarioMigrar
->
getSku
()
.
'</SOURCESKU></ITEM>
</ITEMS>
</ORDER>
</CUSTOMERCONTEXT>
</DATA>
</PARTNERCONTEXT> '
;
$log
->
debug
(
"xml generado para el item :"
.
$xmlPartnerContext
);
$mcAfeeTx
->
setMtrXmlEnvio
(
$xmlPartnerContext
);
$mcAfeeTx
->
save
();
$peticion
=
array
(
'requestXML'
=>
$xmlPartnerContext
);
$log
->
debug
(
'Peticion a McAfee->'
.
print_r
(
$peticion
,
true
));
///INICIO PETICION MCAFEE
try
{
//Llamada McAfee
$wsMcafeePostRequestUrl
=
Utiles
::
getParametroConfiguracion
(
'ws_mcafee_post_request_url'
);
$SOAP
=
new
\SoapClient
(
$wsMcafeePostRequestUrl
,
array
(
"connection_timeout"
=>
self
::
TIMEOUT
,
'cache_wsdl'
=>
WSDL_CACHE_NONE
));
$log
->
debug
(
'Llamando metodo "ProcessRequestWS" url WS->'
.
$wsMcafeePostRequestUrl
);
$respuesta
=
$SOAP
->
ProcessRequestWS
(
$peticion
);
$log
->
debug
(
'Respuesta McAfee->'
.
print_r
(
$respuesta
,
true
));
if
(
$respuesta
!=
null
)
{
$mcAfeeTx
->
setMtrXmlRespuesta
(
print_r
(
$respuesta
->
ProcessRequestWSResult
,
TRUE
));
$arrayRespuesta
=
$this
->
procesarXmlRespuesta
(
$respuesta
);
$log
->
debug
(
"Xml procesado en forma de array: "
.
print_r
(
$arrayRespuesta
,
true
));
if
(
$arrayRespuesta
==
NULL
)
{
$mcAfeeTx
->
setMtrEstado
(
McafeeTransaccion
::
ESTADO_FRACASADA
);
$mcAfeeTx
->
save
();
McafeeTransaccionPendiente
::
generarTransaccionPendiente
(
$nuevoUsuario
,
McafeeTransaccionPendiente
::
TIPO_ALTA
);
$log
->
err
(
'$arrayRespuesta == NULL para mcAfeeTx id->'
.
$mcAfeeTx
->
getMtrId
()
.
'PETICION:'
.
print_r
(
$peticion
,
TRUE
));
$logError
=
Utiles
::
setLog
(
'command::migrarUsuariosSuscripcion'
,
'error/wsMigrarUsuariosMcAfee'
);
$logError
->
err
(
'$arrayRespuesta == NULL para mcAfeeTx id->'
.
$mcAfeeTx
->
getMtrId
()
.
'PETICION:'
.
print_r
(
$peticion
,
TRUE
));
$cantidadPendientes
++
;
$failedAlready
=
true
;
}
else
{
$log
->
debug
(
'$arrayRespuesta McAfee->'
.
print_r
(
$arrayRespuesta
,
true
));
$mcAfeeTx
->
setMtrCodigoRetorno
(
$arrayRespuesta
[
'mcAfeeReturnCode'
]);
$log
->
debug
(
'Descripcion de la transaccion ->'
.
$arrayRespuesta
[
'mcAfeeReturnDesc'
]);
if
(
$arrayRespuesta
[
'mcAfeeReturnCode'
]
==
'1000'
||
$arrayRespuesta
[
'mcAfeeReturnCode'
]
==
'5001'
||
$arrayRespuesta
[
'mcAfeeReturnCode'
]
==
'5002'
)
{
//validacion datos Tx
if
(
$arrayRespuesta
[
'mcAfeeCostumerId'
]
==
$nuevoUsuario
->
getUmcMcafeeCcid
()
&&
$arrayRespuesta
[
'mcAfeeOrderPartnerRef'
]
==
$mcAfeeTx
->
getMtrReferencia
())
{
/**
* @todo agregar urlProduct.
*/
$mcAfeeTx
->
setMtrReferenciaMcafee
(
$arrayRespuesta
[
'mcAfeeOrderRef'
]);
$mcAfeeTx
->
setMtrEstado
(
McafeeTransaccion
::
ESTADO_SUCCESS
);
$mcAfeeTx
->
setMtrProductdownloadurl
(
$arrayRespuesta
[
'mcAfeeProductDownloadUrl'
]);
$nuevoUsuario
->
setUmcMcafeeSku
(
self
::
SKU_DESTINY
);
$nuevoUsuario
->
setUmcMcafeeKeycard
(
$arrayRespuesta
[
'mcAfeeProductDownloadUrl'
]);
$nuevoUsuario
->
setUmcMcafeeStatus
(
$arrayRespuesta
[
'mcAfeeReturnCode'
]);
$nuevoUsuario
->
save
();
$mcAfeeTx
->
save
();
$log
->
debug
(
'Transaccion finalizada con exito!. id Transaccion->'
.
$mcAfeeTx
->
getMtrId
());
$cantidadProcesados
++
;
}
else
{
$mcAfeeTx
->
setMtrEstado
(
McafeeTransaccion
::
ESTADO_FRACASADA
);
$mcAfeeTx
->
save
();
McafeeTransaccionPendiente
::
generarTransaccionPendiente
(
$nuevoUsuario
,
McafeeTransaccionPendiente
::
TIPO_ALTA
);
$log
->
err
(
'Respuesta Costumer Id->'
.
$arrayRespuesta
[
'mcAfeeCostumerId'
]
.
'y Costumer id->'
.
$nuevoUsuario
->
getUmcMcafeeCcid
());
$log
->
err
(
'nro de referencia Respuesta->'
.
$arrayRespuesta
[
'mcAfeeOrderPartnerRef'
]
.
'y nro referencia->'
.
$mcAfeeTx
->
getMtrReferencia
());
$log
->
err
(
'la transaccion fracaso debido a inconsistencia en los datos.'
.
print_r
(
$arrayRespuesta
,
true
));
$logError
=
Utiles
::
setLog
(
'command::migrarUsuariosSuscripcion'
,
'error/wsMigrarUsuariosMcAfee'
);
$logError
->
err
(
'Respuesta Costumer Id->'
.
$arrayRespuesta
[
'mcAfeeCostumerId'
]
.
'y Costumer id->'
.
$nuevoUsuario
->
getUmcMcafeeCcid
());
$logError
->
err
(
'nro de referencia Respuesta->'
.
$arrayRespuesta
[
'mcAfeeOrderPartnerRef'
]
.
'y nro referencia->'
.
$mcAfeeTx
->
getMtrReferencia
());
$logError
->
err
(
'la transaccion fracaso debido a inconsistencia en los datos.'
.
print_r
(
$arrayRespuesta
,
true
));
$cantidadPendientes
++
;
$failedAlready
=
true
;
}
}
else
{
//codigo de retorno distinto de 1000 y 5001
$mcAfeeTx
->
setMtrEstado
(
McafeeTransaccion
::
ESTADO_FRACASADA
);
$mcAfeeTx
->
save
();
McafeeTransaccionPendiente
::
generarTransaccionPendiente
(
$nuevoUsuario
,
McafeeTransaccionPendiente
::
TIPO_ALTA
);
$log
->
err
(
'returnCode distinto de 1000 y 5001 que son los exitosos.'
.
print_r
(
$arrayRespuesta
,
true
));
$logError
=
Utiles
::
setLog
(
'command::migrarUsuariosSuscripcion'
,
'error/wsMigrarUsuariosMcAfee'
);
$logError
->
err
(
'returnCode distinto de 1000 y 5001 que son los exitosos.'
.
print_r
(
$arrayRespuesta
,
true
));
$cantidadPendientes
++
;
$failedAlready
=
true
;
}
}
}
else
{
//$respuesta ==NULL
$mcAfeeTx
->
setMtrEstado
(
McafeeTransaccion
::
ESTADO_FRACASADA
);
$mcAfeeTx
->
save
();
McafeeTransaccionPendiente
::
generarTransaccionPendiente
(
$nuevoUsuario
,
McafeeTransaccionPendiente
::
TIPO_ALTA
);
$log
->
err
(
'respuesta NULL para peticion:'
.
print_r
(
$peticion
,
true
));
$logError
=
Utiles
::
setLog
(
'command::migrarUsuariosSuscripcion'
,
'error/wsMigrarUsuariosMcAfee'
);
$logError
->
err
(
'respuesta NULL para peticion:'
.
print_r
(
$peticion
,
true
));
$cantidadPendientes
++
;
$failedAlready
=
true
;
}
}
catch
(
\Exception
$exc
)
{
$mcAfeeTx
->
setMtrEstado
(
McafeeTransaccion
::
ESTADO_FRACASADA
);
$mcAfeeTx
->
save
();
if
(
!
$esTxPendiente
)
{
McafeeTransaccionPendiente
::
generarTransaccionPendiente
(
$nuevoUsuario
,
McafeeTransaccionPendiente
::
TIPO_ALTA
);
}
$log
->
err
(
'Error al llamar WS. Exception:'
.
$exc
->
getMessage
()
.
' | peticion:'
.
print_r
(
$peticion
,
true
));
$logError
=
Utiles
::
setLog
(
'command::migrarUsuariosSuscripcion'
,
'error/wsMigrarUsuariosMcAfee'
);
$logError
->
err
(
'Error al llamar WS. Exception:'
.
$exc
->
getMessage
()
.
' | peticion:'
.
print_r
(
$peticion
,
true
));
//return FALSE;
$cantidadPendientes
++
;
$failedAlready
=
true
;
}
$ultimoUsuarioProcesado
=
$usuarioMigrar
;
endforeach
;
//GENERANDO REGISTRO DE PROCESO
$registroProceso
=
new
McafeeUltimoProcesoMigracion
();
$registroProceso
->
setUsuariosMcafeeMovistarMigrar
(
$ultimoUsuarioProcesado
);
$registroProceso
->
setMupCantidadProcesados
(
$cantidadProcesados
);
$registroProceso
->
setMupCantidadPendientes
(
$cantidadPendientes
);
$registroProceso
->
setCreatedAt
(
new
\DateTime
());
$registroProceso
->
setUpdatedAt
(
new
\DateTime
());
$registroProceso
->
save
();
$output
->
writeln
(
'COMANDO FINALIZADO.'
);
}
/**
* Procesa respuesta mcafee, extrae valores y atributos y devuelve un array con estos valores.
*
* @param string $xmlRespuesta
* @return array
*/
private
static
function
procesarXmlRespuesta
(
$xmlRespuesta
)
{
$log
=
Utiles
::
setLog
(
'WsBundle\Lib\controladorMcAfee::procesarXmlRespuesta'
,
'ws/wsMcAfee'
);
$arrayRespuesta
=
Array
();
try
{
$xObjRespuesta
=
simplexml_load_string
(
$xmlRespuesta
->
ProcessRequestWSResult
,
'SimpleXMLElement'
,
LIBXML_NOCDATA
);
//LIBXML_NOCDATA atributos dentro de tags
// $log->debug('$xObjRespuesta->'.print_r($xObjRespuesta,true));
if
(
!
is_object
(
$xObjRespuesta
))
{
$log
->
err
(
'Error al instanciar objeto xml->'
.
$xmlRespuesta
->
ProcessRequestWSResult
);
$logError
=
Utiles
::
setLog
(
'WsBundle\Lib\controladorMcAfee::procesarXmlRespuesta'
,
'error/wsMcAfee'
);
$logError
->
err
(
'Error al instanciar objeto xml->'
.
$xmlRespuesta
->
ProcessRequestWSResult
);
}
else
{
//<PARTNERRESPONSECONTEXT>
// <HEADER>
// <PARTNER PARTNER_ID="817" />
// </HEADER>
// <DATA>
// <RESPONSECONTEXT ID="GL_19_56962451306">
// <RETURNCODE>5001</RETURNCODE>
// <RETURNDESC>Transaction success: Warning, Email Address Exists.</RETURNDESC>
// <ORDER PARTNERREF="GL_ES_SUS_166_05032015124229" REF="NCS507747897" />
// <ACCOUNT>
// <EMAILADDRESS>luis.arcos@gearlabs.cl</EMAILADDRESS>
// <PASSWORD><![CDATA[asd123123]]></PASSWORD>
// </ACCOUNT>
// <PRODUCTDOWNLOADURL><![CDATA[http://home.mcafee.com/downloads/keycard.aspx?affid=817&culture=ES-MX&tk=iUMYjxCvNsr_CFQUtZRUYEr2xAeMOTPNFmlw3xXs53KnUoRZDtyoIzRyf5Ad_hr_0&tp=48]]></PRODUCTDOWNLOADURL>
// </RESPONSECONTEXT>
// </DATA>
//</PARTNERRESPONSECONTEXT>
$log
->
debug
(
"objeto xml "
.
print_r
(
$xObjRespuesta
,
true
));
$arrayRespuesta
[
'mcAfeePartnerId'
]
=
(
string
)
$xObjRespuesta
->
HEADER
->
PARTNER
->
attributes
()
->
PARTNER_ID
;
$arrayRespuesta
[
'mcAfeeCostumerId'
]
=
(
string
)
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
attributes
()
->
ID
;
$arrayRespuesta
[
'mcAfeeReturnCode'
]
=
(
string
)
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
RETURNCODE
;
$arrayRespuesta
[
'mcAfeeReturnDesc'
]
=
(
string
)
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
RETURNDESC
;
$arrayRespuesta
[
'mcAfeeProductDownloadUrl'
]
=
(
string
)
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
PRODUCTDOWNLOADURL
;
if
(
isset
(
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
ORDER
))
{
$arrayRespuesta
[
'mcAfeeOrderPartnerRef'
]
=
(
string
)
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
ORDER
->
attributes
()
->
PARTNERREF
;
$arrayRespuesta
[
'mcAfeeOrderRef'
]
=
(
string
)
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
ORDER
->
attributes
()
->
REF
;
}
if
(
isset
(
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
ACCOUNT
))
{
$arrayRespuesta
[
'mcAfeeEmailUsuario'
]
=
(
string
)
$xObjRespuesta
->
DATA
->
RESPONSECONTEXT
->
ACCOUNT
->
EMAILADDRESS
;
}
}
}
catch
(
\Exception
$ex
)
{
$log
->
crit
(
"Error al leer detalles XML."
.
$xmlRespuesta
->
ProcessRequestWSResult
);
$log
->
crit
(
"Detalle error "
.
print_r
(
$ex
,
TRUE
));
$logError
=
Utiles
::
setLog
(
'WsBundle\Lib\controladorMcAfee::procesarXmlRespuesta'
,
'error/wsMcAfee'
);
$logError
->
crit
(
"Error al leer detalles XML."
.
$xmlRespuesta
->
ProcessRequestWSResult
);
$logError
->
crit
(
"Detalle error "
.
print_r
(
$ex
,
TRUE
));
$arrayRespuesta
=
array
();
}
return
$arrayRespuesta
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment