Árvore de páginas

Versões comparadas

Chave

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

...

Producto

Solucoes_espanhol
SolucaoTOTVS Backoffice

Línea de producto: 

Linhas_totvs_espanhol
LinhaLínea Protheus

Segmento:

Segmentos_totvs_espanhol
SegmentoBackoffice

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

...

Se está permitiendo incluir más de un proveedor y cliente con proveedor 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 proveedor 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 creo 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 Se realizó un ajuste en el diccionario de datosSX3 – , agregando la validación a los campos ya mencionados (SX3 –  X3_VALID), para validar la tipificación (ver el apartado 04. INFORMACIÓN ADICIONAL). 


Totvs custom tabs box
tabsConfiguraciones previas, Flujo de prueba
idspaso1,paso2
Vazio()
  • .
OR. VLDRUCPAR(M->A2_CGC)A2_CGC
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
X3_PICTUREA1_CGC@R 9999999999                                @R 9999999999
X3_PICTURE@R XXXXXXXXXXXXX                             @R 9999999999
Totvs custom tabs box items
defaultno
referenciapaso2

Validaciones sugeridas: 


Prueba¿Debe permitir?
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
. ()
SI
Incluir proveedores con RUC genéricos para diferentes códigos
. ()
SI
Incluir proveedores sin RUC (vacío)SI


04. INFORMACIÓN ADICIONAL


Diccionario de datos (SX3)

Código Pacote: 015072.

Pacote:MI - DMICAS-81 - VALIDAR RUC DUPLICADOS

X3_VALIDA2_CGCVazio() .

...

OR. VLDRUCPAR(M->A2_CGC)
X3_PICTUREA2_CGC@R 9999999999

Nota: El pacote es de uso interno.

IMPORTANTE:  El paquete de actualización de diccionarios está sujeta al proceso de expedición continua. 

Consideraciones

...

  • RUC genérico con permiso para duplicar:
    • 44444401-7 = Importes consolidados
    • 66666601-6 = Clientes exportación
    • 77777701-0 = Agentes diplomáticos
    • 88888801-5 = Clientes exterior
    • 99999901-0 = Proveedores exterior
  • Permite duplicar el mismo código con diferentes tiendas.
  • El RUC se puede escribir con o sin guion, pero siempre regresará con el guion después de la validación.
  • Esta actualización ya no permitirá otros documentos en el campo RUC . (Solo RUC con DV correcto)

...

  • .

...

05. ASUNTOS RELACIONADOS

No se Aplica

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()
UserFunctionAPIRUCPY(cRUC)
   LocalcVar  :=ReadVar()
   LocaloMod  :=FWModelActive()
   LocaloRest:=FwRest():New("https://turuc.com.py/api/contribuyente")
   LocaloJson:=JsonObject():New()
   LocalaHead:= {'accept: */*'}
   LocalcRest:=""
   LocalcRed  :=""
   LocalcNom  :=""
   LocallRet  :=.F.
   DefaultcRUC:= &(cVar)
   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 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)