01. DATOS GENERALES


Producto

Línea de producto: 

Segmento:

Módulo:SIGACON, SIGAFAT, SIGAFIN
Función:
Función Nombre
LOCXPAR.PRWGenérica Paraguay
País:PARAGUAY
Ticket:21039076
Requisito/Story/Issue (informe el requisito vinculado): DMICAS-81


02. SITUACIÓN/REQUISITO

Se está permitiendo incluir más de un proveedor y cliente con el mismo número de RUC.

Es importante considerar que únicamente debería permitirse duplicar el número de RUC cuando el proveedor o el cliente es extranjero, ya que se hace uso de un RUC genérico.
De igual manera para el caso donde se incluye un proveedor o cliente y una tienda distinta, también está correcto que el RUC sea el mismo.

03. SOLUCIÓN

  • Realizar la copia de seguridad del repositorio (RPO).
  • Aplicar el parche correspondiente al problema DMICAS-81.
  • Actualizar el diccionario de datos.

SX3

Campo

Antes

Después

X3_VALIDA1_CGCVazio() .Or. A030RUC(M->A1_CGC)Vazio() .OR. VLDRUCPAR(M->A1_CGC)
X3_VALIDA2_CGC
Vazio() .OR. VLDRUCPAR(M->A2_CGC)
X3_PICTUREA1_CGC@R 9999999999                                @R 9999999999
X3_PICTUREA2_CGC@R XXXXXXXXXXXXX                             @R 9999999999
  • Intente incluir un proveedor con un RUC existente para el nuevo código. (NO)
  • Modificar un proveedor con RUC existente en otro código. (NO)
  • Incluir un proveedor con RUC existente con una tienda diferente. ()
  • Incluir proveedores con RUC genéricos para diferentes códigos. ()
  • Incluir proveedores sin RUC (vacío). ()


04. INFORMACIÓN ADICIONAL



05. ASUNTOS RELACIONADOS

En Paraguay, está disponible una API para la búsqueda de RUC.
https://turuc.com.py/swagger-ui/index.html#/rest-contribuyente/getContribuyenteWithPath

Programa ADVPL para consumo de API, configuración de usuario.

#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWBROWSE.CH"


//Dicionario SX3
//X3_CAMPO (A1_CGC e A2_CGC)
//X3_VLDUSER = APIRUCPY()

User Function APIRUCPY(cRUC)
   Local cVar  := ReadVar()
   Local oMod  := FWModelActive()
   Local oRest := FwRest():New("https://turuc.com.py/api/contribuyente")
   Local oJson := JsonObject():New()
   Local aHead := {'accept: */*'}
   Local cRest := ""
   Local cRed  := ""
   Local cNom  := ""
   Local lRet  := .F.
   Default cRUC := &(cVar)
   oRest:SetPath("?ruc=" + Trim(cRUC))
   FWMsgRun(Nil,{|| lRet := oRest:Get(aHead)}, Nil, oRest:CHOST)
   If lRet //Achou
      cRest := DecodeUtf8(oRest:GetResult())
      If ! Empty(cRest) .And. Empty(oJson:fromJson(cRest))
         //oJson["data"]["ruc"] = CODIGO + DV
         //oJson["data"]["estado"] = A1_ATIVO
         //oJson["data"]["esPersonaJuridica"] = A1_PESSOA      
         cNom := oJson["data"]["razonSocial"]
         If (", ")$(cNom)
            cRed := AllTrim(SubStr(cNom,At(", ",cNom)+1,Len(cNom)))
         Else
            cRed := AllTrim(SubStr(cNom,1,At(" ",cNom)))
         Endif
         If cVar == "M->A2_CGC" //Proveedor
            iif(Empty(oMod), M->A2_NOME   := cNom, FWFldPut("A2_NOME",   cNom))
            iif(Empty(oMod), M->A2_NREDUZ := cRed, FWFldPut("A2_NREDUZ", cRed))
         ElseIf cVar == "M->A1_CGC" //Cliente
            iif(Empty(oMod), M->A1_NOME   := cNom, FWFldPut("A1_NOME",   cNom))
            iif(Empty(oMod), M->A1_NREDUZ := cRed, FWFldPut("A1_NREDUZ", cRed))
         Endif
      Endif
   Endif
   FreeObj(oRest)
Return(lRet)



//Consulta Especifica no SXB
//XB_ALIAS  XB_TIPO  XB_SEQ   XB_COLUNA   XB_CONTEM      XB_DESCRI...
//RUCPAR    1        01       RE          ""             RUC                      
//RUCPAR    2        01       01          U_XBRUCPAR()   ""
//RUCPAR    5        01       01          VAR_IXB        ""

//Dicionario SX3
//X3_CAMPO (A1_CGC e A2_CGC)
//X3_F3 = RUCPAR


//Consulta Padrao - API turuc.com.py - F3
User Function XBRUCPAR() // --> L
   Local cCod := ""
   Local cVar := ReadVar()
   Local lRet := RUCBrowse(&(cVar),@cCod)
   If lRet
      VAR_IXB := cCod
   Endif
Return(lRet)


Static Function RUCBrowse(cGet,cCod)
   Local oDlg, oBrw, oCol, oPan, oGet, oBtn
   Local oFnt := TFont():New("Arial",,020,,.F.,,,,,.F.,.F.)
   Local bEnd := {|| lRet := .T., oDlg:End()}
   Local lRet := .F.
   Local nPag := 0
   Local aRow := {}
   cGet := PadR(cGet,50," ")
   DEFINE MSDIALOG oDlg TITLE "Consulta turuc.com.py" FROM 0, 0 To 400, 820 PIXEL
   oPan := TPanel():New(0,0,,oDlg,,,,,,410,20,.F.,.F.)
   oPan:Align := CONTROL_ALIGN_TOP
   DEFINE FWBROWSE oBrw DATA ARRAY ARRAY aRow NO CONFIG NO REPORT LINE HEIGHT 21 OF oDlg
   @ 003, 005 MSGET oGet VAR cGet SIZE 240, 012 OF oPan PICTURE "@!" FONT oFnt VALID (iif(oGet:LMODIFIED, aRow := SetBrwRow(oBrw, cGet, 0), Nil), nPag := 0, .T.) PIXEL
   @ 004, 250 BUTTON "&Consulta"       SIZE 035, 012 OF oPan ACTION {|| nPag := 0, aRow := SetBrwRow(oBrw, cGet, nPag), oBtn:SetFocus()} PIXEL
   @ 004, 290 BUTTON "&Seguinte"       SIZE 035, 012 OF oPan WHEN Len(aRow) > 10 ACTION {|| ++nPag, aRow := SetBrwRow(oBrw, cGet, @nPag)} PIXEL
   @ 004, 330 BUTTON "Sitio &Web"      SIZE 035, 012 OF oPan WHEN .T.            ACTION {|| ShellBrw("https://turuc.com.py/#consulta")} PIXEL
   @ 004, 370 BUTTON oBtn PROMPT "&OK" SIZE 035, 012 OF oPan WHEN ! Empty(aRow)  ACTION Eval(bEnd) PIXEL
   oBrw:SetDoubleClick(bEnd)
   oBrw:SetFontBrowse(TFont():New("Arial",,-14,,.F.))
   oBrw:NPOSSIBLEROWS := 15
   ADD MARKCOLUMN oCol DATA {|| oBrw:oData:aArray[oBrw:At(),4]} OF oBrw
   ADD COLUMN oCol DATA {|| oBrw:oData:aArray[oBrw:At(), 1]} TITLE "NOMBRE"   TYPE "C" SIZE 50 DECIMAL 0 PICTURE "" HEADERCLICK {|| aSort(aRow,,,{|x,y| x[1]<y[1]}), oBrw:Refresh(.T.)} ALIGN 1 OF oBrw
   ADD COLUMN oCol DATA {|| oBrw:oData:aArray[oBrw:At(), 2]} TITLE "RUC"      TYPE "C" SIZE 10 DECIMAL 0 PICTURE "" HEADERCLICK {|| aSort(aRow,,,{|x,y| x[2]<y[2]}), oBrw:Refresh(.T.)} ALIGN 1 OF oBrw
   ADD COLUMN oCol DATA {|| oBrw:oData:aArray[oBrw:At(), 3]} TITLE "ESTADO"   TYPE "C" SIZE 12 DECIMAL 0 PICTURE "" HEADERCLICK {|| aSort(aRow,,,{|x,y| x[3]<y[3]}), oBrw:Refresh(.T.)} ALIGN 1 OF oBrw
   aRow := SetBrwRow(oBrw, cGet, 0)
   oBrw:Activate()
   If Empty(cGet)
      oGet:SetFocus()
   Else
      oBrw:SetFocus()
   Endif
   oBrw:Refresh(.T.)
   ACTIVATE MSDIALOG oDlg CENTERED
   If lRet
      cCod := AllTrim(aRow[oBrw:nAt,2])
   Endif
   FreeObj(oBrw)
Return(lRet)


Static Function SetBrwRow(oBrw,cGet,nPag)
   Local aRow := {}
   Local nPos := 0
   Local nMax := 0
   Local cRaz := ""
   Local cEst := ""
   Local cRuc := ""
   Local cMar := ""
   Local jRow := Nil
   FWMsgRun(Nil,{|| jRow := TURUCAPIS(cGet, @nPag, @nMax)}, Nil, "Consulta - turuc.com.py")
   If ! Empty(jRow)
      For nPos := 1 To Len(jRow)
         cRaz := jRow[nPos]["razonSocial"]
         cRuc := jRow[nPos]["ruc"]
         cEst := jRow[nPos]["estado"]
         cMar := iif(cEst == "ACTIVO", "ENABLE", "DISABLE")
         aAdd(aRow, {cRaz, cRuc, cEst, cMar})
      Next nPos
   Endif
   //Generico RUC
   If Empty(aRow)
      aAdd(aRow, {"Consumidor Final IC",  "44444401-7", "Generico", "ENABLE"})
      aAdd(aRow, {"Clientes Exportación", "66666601-6", "Generico", "ENABLE"})
      aAdd(aRow, {"Agentes Diplomáticos", "77777701-0", "Generico", "ENABLE"})
      aAdd(aRow, {"Clientes Exterior",    "88888801-5", "Generico", "ENABLE"})
      aAdd(aRow, {"Proveedores Exterior", "99999901-0", "Generico", "ENABLE"})
      nMax := 1
   Endif
   //Ajusta Browse
   oBrw:SetArray(aRow)
   If ValType(oBrw:oBrowse) == "O"
      oBrw:oBrowse:cToolTip := "Pagina: " + cValToChar(nPag+1) + "/" + cValToChar(nMax)
      If nPag >= nMax
         nPag := 0
      Endif
   Endif
   oBrw:Refresh(.T.)
Return(aRow)


Static Function TURUCAPIS(cKey,nPag,nMax)
   Local oRest := FwRest():New("https://turuc.com.py")
   Local oJson := JsonObject():New()
   Local aHead := {'accept: application/json;charset=UTF-8'}
   Local jRes  := Nil
   Local cRes  := Nil
   cKey := AllTrim(cKey)
   If Len(cKey) >= 3
      oRest:SetPath("/api/contribuyente/search?page="+cValToChar(nPag)+"&search=" + escape(cKey))
      If oRest:Get(aHead)
         cRes := DecodeUtf8(oRest:GetResult())
      Else
         MsgInfo(oRest:GetLastError(),"Atencion")
      EndIf
   Endif
   If ! Empty(cRes) .And. Empty(oJson:fromJson(cRes))
      nMax := oJson["data"]["paginas"]
      jRes := oJson["data"]["contribuyentes"]
   Else
      nPag := 0
      nMax := 0
      jRes := ""
   Endif
Return(jRes)


Static Function ShellBrw(cUrl)
   Local cBrw, cAux
   Local nRem := GetRemoteType(@cAux)
   If nRem == 2
      cBrw := GetPvProfString("CONFIG", "HELPBROWSER", "firefox", GetRemoteIniName())
      If Empty(cBrw)
         cBrw := GetSrvProfString("HELPBROWSER", "firefox")
      EndIf
      If ! Empty(cBrw)
         WaitRun(cBrw + " " + cUrl)
      ElseIf "MAC" $(Upper(cAux))
         MsgInfo("Web browser not found for: " + cAux)
      Else
         ShellExecute("Browser", "/usr/bin/firefox", cUrl, "/", 1)
      Endif
   Else //Windows
      ShellExecute("open", cUrl, "", "", 1)
   Endif
Return(Nil)