Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

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

  • Se agrega al sistema

...

  • la rutina 'VLDRUCPAR' para

...

  • validación de datos al ingresar el RUC a los campos A2_CGC y A1_CGC.
  • Ajuste realizado en la tabla del diccionario de datos SX3 – X3_VALID para validar la tipificación.
  • Punto de entrada 'APIRUCPY', ver asuntos relacionados.


Totvs custom tabs box
tabsConfiguraciones previas, Flujo de prueba
idspaso1,paso2
Totvs custom tabs box items
defaultyes
referenciapaso1
  • 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
Totvs custom tabs box items
defaultno
referenciapaso2
  • 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). ()

...

Card documentos
InformacaoEs necesario realizar la actualización del diccionario por medio del UPDDISTR con el paquete de diccionario de este requisito.
Titulo¡IMPORTANTE!


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


Punto de entrada 'APIRUCPY'

Propósito: Realizar búsqueda de RUC utilizando la API y rellenar automáticamente los campos:
A2_NOME, A2_NREDUZ
A1_NOME, A1_NREDUZ


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


UserFunctionAPIRUCPY()
   LocalcRUC  :=PARAMIXB[1]
   LocalcVar  :=PARAMIXB[2]
   LocaloMod  :=PARAMIXB[3]
   LocaloRest:=FwRest():New("https://turuc.com.py/api/contribuyente")
   LocaloJson:=JsonObject():New()
   LocalaHead:= {'accept: */*'}
   LocalcRest:=""
   LocalcRed  :=""
   LocalcNom  :=""
   LocallRet  :=.F.
   oRest:SetPath("?ruc="+Trim(cRUC))
   FWMsgRun(Nil,{|| lRet:=oRest:Get(aHead)},Nil,oRest:CHOST)
   IflRet//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
         IfcVar=="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))
         ElseIfcVar=="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 específica SXB – RUCPAR
Propósito: Uso en campos de diccionario SX3 X3_F3


//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
UserFunctionXBRUCPAR() // --> L
   LocalcCod:=""
   LocalcVar:=ReadVar()
   LocallRet:=RUCBrowse(&(cVar),@cCod)
   IflRet
      VAR_IXB:=cCod
   Endif
Return(lRet)


StaticFunctionRUCBrowse(cGet,cCod)
   LocaloDlg,oBrw,oCol,oPan,oGet,oBtn
   LocaloFnt:=TFont():New("Arial",,020,,.F.,,,,,.F.,.F.)
   LocalbEnd:= {|| lRet:=.T.,oDlg:End()}
   LocallRet:=.F.
   LocalnPag:=0
   LocalaRow:= {}
   cGet:=PadR(cGet,50," ")
   DEFINEMSDIALOGoDlgTITLE"Consulta turuc.com.py"FROM0,0To400,820PIXEL
   oPan:=TPanel():New(0,0,,oDlg,,,,,,410,20,.F.,.F.)
   oPan:Align:=CONTROL_ALIGN_TOP
   DEFINEFWBROWSEoBrwDATAARRAYARRAYaRowNOCONFIGNOREPORTLINEHEIGHT21OFoDlg
   @ 003,005MSGEToGetVARcGetSIZE240,012OFoPanPICTURE"@!"FONToFntVALID (iif(oGet:LMODIFIED,aRow:=SetBrwRow(oBrw,cGet,0),Nil),nPag:=0,.T.) PIXEL
   @ 004,250BUTTON"&Consulta"       SIZE035,012OFoPanACTION {|| nPag:=0,aRow:=SetBrwRow(oBrw,cGet,nPag),oBtn:SetFocus()} PIXEL
   @ 004,290BUTTON"&Seguinte"       SIZE035,012OFoPanWHENLen(aRow) >10ACTION {|| ++nPag,aRow:=SetBrwRow(oBrw,cGet, @nPag)} PIXEL
   @ 004,330BUTTON"Sitio &Web"      SIZE035,012OFoPanWHEN.T.            ACTION {|| ShellBrw("https://turuc.com.py/#consulta")} PIXEL
   @ 004,370BUTTONoBtnPROMPT"&OK"SIZE035,012OFoPanWHEN ! Empty(aRow)  ACTIONEval(bEnd) PIXEL
   oBrw:SetDoubleClick(bEnd)
   oBrw:SetFontBrowse(TFont():New("Arial",,-14,,.F.))
   oBrw:NPOSSIBLEROWS:=15
   ADDMARKCOLUMNoColDATA {|| oBrw:oData:aArray[oBrw:At(),4]} OFoBrw
   ADDCOLUMNoColDATA {|| oBrw:oData:aArray[oBrw:At(),1]} TITLE"NOMBRE"   TYPE"C"SIZE50DECIMAL0PICTURE""HEADERCLICK {|| aSort(aRow,,,{|x,y| x[1]<y[1]}),oBrw:Refresh(.T.)} ALIGN1OFoBrw
   ADDCOLUMNoColDATA {|| oBrw:oData:aArray[oBrw:At(),2]} TITLE"RUC"      TYPE"C"SIZE10DECIMAL0PICTURE""HEADERCLICK {|| aSort(aRow,,,{|x,y| x[2]<y[2]}),oBrw:Refresh(.T.)} ALIGN1OFoBrw
   ADDCOLUMNoColDATA {|| oBrw:oData:aArray[oBrw:At(),3]} TITLE"ESTADO"   TYPE"C"SIZE12DECIMAL0PICTURE""HEADERCLICK {|| aSort(aRow,,,{|x,y| x[3]<y[3]}),oBrw:Refresh(.T.)} ALIGN1OFoBrw
   aRow:=SetBrwRow(oBrw,cGet,0)
   oBrw:Activate()
   IfEmpty(cGet)
      oGet:SetFocus()
   Else
      oBrw:SetFocus()
   Endif
   oBrw:Refresh(.T.)
   ACTIVATEMSDIALOGoDlgCENTERED
   IflRet
      cCod:=AllTrim(aRow[oBrw:nAt,2])
   Endif
   FreeObj(oBrw)
Return(lRet)


StaticFunctionSetBrwRow(oBrw,cGet,nPag)
   LocalaRow:= {}
   LocalnPos:=0
   LocalnMax:=0
   LocalcRaz:=""
   LocalcEst:=""
   LocalcRuc:=""
   LocalcMar:=""
   LocaljRow:=Nil
   FWMsgRun(Nil,{|| jRow:=TURUCAPIS(cGet, @nPag, @nMax)},Nil,"Consulta - turuc.com.py")
   If ! Empty(jRow)
      FornPos:=1ToLen(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})
      NextnPos
   Endif
   //Generico RUC
   IfEmpty(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)
   IfValType(oBrw:oBrowse) =="O"
      oBrw:oBrowse:cToolTip:="Pagina: "+cValToChar(nPag+1) +"/"+cValToChar(nMax)
      IfnPag>=nMax
         nPag:=0
      Endif
   Endif
   oBrw:Refresh(.T.)
Return(aRow)


StaticFunctionTURUCAPIS(cKey,nPag,nMax)
   LocaloRest:=FwRest():New("https://turuc.com.py")
   LocaloJson:=JsonObject():New()
   LocalaHead:= {'accept: application/json;charset=UTF-8'}
   LocaljRes  :=Nil
   LocalcRes  :=Nil
   cKey:=AllTrim(cKey)
   IfLen(cKey) >=3
      oRest:SetPath("/api/contribuyente/search?page="+cValToChar(nPag)+"&search="+escape(cKey))
      IfoRest: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)


StaticFunctionShellBrw(cUrl)
   LocalcBrw,cAux
   LocalnRem:=GetRemoteType(@cAux)
   IfnRem==2
      cBrw:=GetPvProfString("CONFIG","HELPBROWSER","firefox",GetRemoteIniName())
      IfEmpty(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)