giansalex / lycet

API REST de Facturación Electrónica Sunat utilizando Greenter.
MIT License
81 stars 43 forks source link

Configuración multiempresa #64

Closed EliuTimana closed 5 years ago

EliuTimana commented 5 years ago

Existe la posibilidad de almacenar múltiples certificados, logos y credenciales sunat? para poder tener multiples emisores y no solo uno. por ahora esos datos se extraen desde variables de entorno, ¿que tanto habria que modificar para conseguirlo?

giansalex commented 5 years ago

Hola @EliuTimana , algo simple podria ser llevar las credenciales a un archivo (json, yaml), y en la carpeta data almacenar el certificado y el logo teniendo como nombre el ruc del emisor.

giansalex commented 5 years ago

@EliuTimana si fuera posible que contribuyeras con eso, también podría ayudarte. 😃

EliuTimana commented 5 years ago

Claro, he estado revisando el código y ya he identificado mas o menos los cambios, tengo pensado implementarlo. :+1:

crey93 commented 5 years ago

Muy pronto trataré de hacer un cambio similar en este proyecto. Para manejo multiempresas. Slds.

giansalex commented 5 years ago

Hola @CarlosTTRR, seria de gran aporte.

OD-n commented 5 years ago

@giansalex que tan difícil sería para la configuración multiempresa alojar el logo y certificado dentro de data ( en una carpeta con su RUC) Antes: |--data/ | |--logo.png | |--cert.pem

Lo que quisiera hacer: |--data/ | |--100000000001/ | |--logo.png | |--cert.pem | |--200000000002/ | |--logo.png | |--cert.pem | |--200000000003/ | |--logo.png | |--cert.pem

y los cambios que se tendría que hacer estaría en: ` public function get($key) { if (!isset($this->keys[$key])) { return ''; } $path = $this->directory.DIRECTORY_SEPARATOR.(RUC).DIRECTORY_SEPARATOR.$this->keys[$key];

    if (file_exists($path)) {
        return file_get_contents($path);
    }

    return '';
}

`

Espero puedas ayudarme con ello, y si es factible hacerlo de esa manera o que otros cambios tendría que hacer

JhonnySA commented 5 years ago

Hola @EliuTimana , algo simple podria ser llevar las credenciales a un archivo (json, yaml), y en la carpeta data almacenar el certificado y el logo teniendo como nombre el ruc del emisor.

Estimado @giansalex antes de nada agradecer por esta herramienta muy importante. Estoy implementado la sugerencia que propusiste lineas arriba, sin embargo no tengo una idea clara de que archivos modificar o si tengo que agregar algun archivo de configuracion.

Agradezco tu respuesta ya que sera de gran ayuda

giansalex commented 5 years ago

Hola @OD-n , @JhonnySA se puede crear un archivo config.json

{
  "empresas": [
    {
      "ruc": "20000000001",
      "usuario": "20000000001MODDATOS",
      "clave": "moddatos",
      "certificado": "cert1.pem",
      "logo": "logo1.png"
    },
    {
      "ruc": "20000000002",
      "usuario": "20000000002TEST",
      "clave": "test",
      "certificado": "cert2.pem",
      "logo": "logo2.png"
    }
  ]
}

los certificados y logos serian los nombres dentro de la carpeta data, la obtencion de la informacion puede realizarse en el metodo getSee()

JhonnySA commented 5 years ago

Hola @OD-n , @JhonnySA se puede crear un archivo config.json

{
  "empresas": [
    {
      "ruc": "20000000001",
      "usuario": "20000000001MODDATOS",
      "clave": "moddatos",
      "certificado": "cert1.pem",
      "logo": "logo1.png"
    },
    {
      "ruc": "20000000002",
      "usuario": "20000000002TEST",
      "clave": "test",
      "certificado": "cert2.pem",
      "logo": "logo2.png"
    }
  ]
}

los certificados y logos serian los nombres dentro de la carpeta data, la obtencion de la informacion puede realizarse en el metodo getSee()

Gracias @giansalex por tu respuesta, estoy tratando de encontrar el lugar donde recoger el parametro, en este caso seria el RUC, el cual se tendria que enviar por URL para buscar en mi json de Empresas, me podrias brindar alguna sugerencia de donde poder hacerlo, estoy empezando con Symfony. Espero puedas ayudarme

giansalex commented 5 years ago

Para el caso de los comprobantes el ruc ya esta en el campo $company->getRuc(), solo seria necesario el ruc en el endpoint /status

JhonnySA commented 5 years ago

Para el caso de los comprobantes el ruc ya esta en el campo $company->getRuc(), solo seria necesario el ruc en el endpoint /status

Gracias @giansalex por tu respuesta, tratare de entender y hacer lo que recomiendas

JhonnySA commented 5 years ago

Para el caso de los comprobantes el ruc ya esta en el campo $company->getRuc(), solo seria necesario el ruc en el endpoint /status

Hola @OD-n , @JhonnySA se puede crear un archivo config.json

{
  "empresas": [
    {
      "ruc": "20000000001",
      "usuario": "20000000001MODDATOS",
      "clave": "moddatos",
      "certificado": "cert1.pem",
      "logo": "logo1.png"
    },
    {
      "ruc": "20000000002",
      "usuario": "20000000002TEST",
      "clave": "test",
      "certificado": "cert2.pem",
      "logo": "logo2.png"
    }
  ]
}

los certificados y logos serian los nombres dentro de la carpeta data, la obtencion de la informacion puede realizarse en el metodo getSee()

Gracias @giansalex por tu respuesta, estoy tratando de encontrar el lugar donde recoger el parametro, en este caso seria el RUC, el cual se tendria que enviar por URL para buscar en mi json de Empresas, me podrias brindar alguna sugerencia de donde poder hacerlo, estoy empezando con Symfony. Espero puedas ayudarme

Estimado @giansalex esto es lo que estoy modificado en el metodo getSee(), talvez no sea la mejor forma de obtener el RUC de la empresa que esta haciendo la peticion, sin embargo como sugeriste $company->getRuc() no encuentro forma de llamarlo para obtenerlo de una forma mas limpia. image Para obtener el logo lo tengo de forma similar image Asi seria la estructura de mis archivos en data image

Espero puedas darme tu punto de vista sobre cuan eficiente seria, Gracias de antemano

giansalex commented 5 years ago

podrias pasar RUC como parámetro a getSee($ruc), luego en esta linea puedes enviar el ruc como $see = $this->getSee($document->getCompany()->getRuc());, Acerca del logo solo necesitas el file_get_contents()

JhonnySA commented 5 years ago

podrias pasar RUC como parámetro a getSee($ruc), luego en esta linea puedes enviar el ruc como $see = $this->getSee($document->getCompany()->getRuc());, Acerca del logo solo necesitas el file_get_contents()

Excelente @giansalex , funciona, voy a intentar implementarlo ahora con una tabla

JhonnySA commented 5 years ago

@giansalex tengo una consulta, sobre una instalacion limpia de Lycet, configure mi archivo .env a urls de produccion y la respuesta que obtengo son las de prueba, lo se porque estoy intentando enviar 2 veces el mismo comprobante que ya ha sido informado anteriormente a Sunat, y la respuesta es que ha sido sido aceptado correctamente; ¿Los cambios que tengo que realizar solo serian en el archivo .env o existe algun otro archivo que se este usando?

giansalex commented 5 years ago

Para estar seguro de eso, puedes revisar el xml del CDR, alli debería estar la firma de Sunat o indicar que es Beta. En esta linea deberia setear prod, tambien eliminar cualquier otro archivo .env.xx

JhonnySA commented 5 years ago

Lo tengo configurado asi: image

Y esta saliendo como Beta image

giansalex commented 5 years ago

Verifica que en esta linea este retornando la url correcta, tambien puedes intentar borrar la carpeta /var

JhonnySA commented 5 years ago

Hay varios lugares donde he intentado imprimir valores para guiarme de donde puedo hacer cambios, sin embargo en varios de ellos la respuesta es algo vacio image

image

JhonnySA commented 5 years ago

Probe de esta forma image

y obtuve esto image

giansalex commented 5 years ago

Intentaré hacer una prueba, aparentemente el problema es al obtener los valores de .env

giansalex commented 5 years ago

Hola @JhonnySA, acerca del problema que tenias al obtener las variables con getenv, el problema ocurrio desde que se actualizo a symfony v4.3. Ha sido corregido en 4edb26afa2fd442ba572ec7934326e5ff5a23cb4

JhonnySA commented 5 years ago

Gracias @giansalex por tu tiempo y tu respuesta, logre hacerlo tomando una copia anterior de Lycet, con el cual no tuve inconvenientes, vi que lograron agregarlo con una configuracion de un archivo JSON, me preguntaba como podria hacer para incluir mis cambios al proyecto, lo termine con una conexion a una base de datos y agrege codigo para subir los archivos de cada empresa en el path de configuration

giansalex commented 5 years ago

Hola @JhonnySA, si quieres incluir tus cambios tendrías que hacer un fork al repositorio, luego pasar los cambios subirlos a ese repositorio, y de allí tendrías la opción de enviar un pull request