Jump to content
Fivewin Brasil

Habour boleto Sicoob


Marca

Recommended Posts

Macs. Obrigado pelo Retorno

Quem usa o HarbourBoleto são vários os cálculos


Data base para o cálculo do fator de vencimento ->      #DEFINE dDataBase CTOD("03/07/2000")


METHOD Execute( ) CLASS oBoleto

      CASE ::cCodBco == "756"  // SICOOB - Eroni

         ::cNumAgencia       := STRZERO(VAL(::cNumAgencia), 4)
         ::cNumCC            := STRZERO(VAL(::cNumCC)     , 7)
         ::cCDPF             := Strzero( Val( ::cCDPF ),6 )
         cAgcc               := ::cNumAgencia + "/" + ::cCDPF + ::cDVCDPF
         cCarteiraImpressao  := Left(::cCarteira,1)     // "1"
         IF EMPTY(::cTipoCob)
            ::cTipoCob := "1" // Cobranca 1-Simples 5-Escritural
         ENDIF

             // Sicoob, nosso numero com 7 digitos
            ::cNossoNumero := StrZero( Val( ::cNossoNumero ), 7 )
            ::cDGNN        :=  DC_ModEsp( ::cCodBco, ::cNumAgencia + Strzero( Val( ::cCDPF ),9 ) + ::cDVCDPF + ::cNossoNumero )
            ::cNsNm        := ::cNossoNumero + ::cDGNN
            cCpoLivre      := cCarteiraImpressao + ::cNumAgencia + StrZero( Val( ::cTipoCob ),2 ) + ::cCDPF + ::cDVCDPF + ::cNsNm + "001" // teste eroni

endcase

   cFatorVenc := STRZERO( ::DtVenc - dDataBase , 4 )
   IF ::cCodBco == "001" .OR. ;    // Alterado dia 04-06-2021*
      ::cCodBco == "756"
      cFatorVenc := STRZERO( ( ::DtVenc - dDataBase ) + 1000 , 4 )
   ENDIF
 

   // Monta Código de Barras (p/ Banco)
   cDGCB     := DC_Mod11( ::cCodBco, 9, .T., ::cCodBco + ::cTipoMoeda + cFatorVenc + STRZERO( ::nValor * 100, 10) + cCpoLivre )
   ::cCodBar := ::cCodBco + ::cTipoMoeda + cDGCB + cFatorVenc + STRZERO( ::nValor * 100, 10 ) + cCpoLivre
   //               3           1            1       4                       10                   25

   nY := 0
   FOR nX := 1 TO LEN( ::cCodBar ) STEP 2
       ::Merge( STRZERO( nY++, 2 ), SUBSTR( ::cCodBar, nX, 2 ) )
   NEXT

   // Monta Representacao Numerica do Codigo de Barras
   * Campo1 **
   cC1RN := ::cCodBco + ::cTipoMoeda + LEFT( cCpoLivre, 5 )
   cC1RN := cC1RN + DC_Mod10( ::cCodBco, cC1RN )

   cC2RN := SUBSTR(cCpoLivre, 6, 10)
   cC2RN += DC_Mod10(::cCodBco, cC2RN)

   cC3RN := SUBSTR(cCpoLivre, 16, 20)
   cC3RN += DC_Mod10(::cCodBco, cC3RN)

   cC4RN :=cDGCB

   cC5RN := cFatorVenc + STRZERO(::nValor * 100, 10)

   // Linha digitavel
   ::cRNCB := LEFT(cC1RN, 5) + "." + SUBSTR(cC1RN, 6) + " " +   LEFT(cC2RN, 5) + "." +;
            SUBSTR(cC2RN, 6) + " " +   LEFT(cC3RN, 5) + "." + SUBSTR(cC3RN, 6) + "  " + cC4RN + "  " + cC5RN
   ::Merge("LINDIG", ::cRNCB)

   IF ::lBoleto
      FWRITE(Self:nHandle, Self:Bolhtm)
   ENDIF
 

/* -------------------------------------------------------------------------- */
// Retorna Dígito de Controle Módulo 10                                       //

FUNCTION DC_Mod10( cCodBco, mNMOG )

   LOCAL mVLDG, mSMMD, mCTDG, mRSDV, mDCMD
   mSMMD:=0
   FOR mCTDG := 1 TO LEN(mNMOG)
      mVLDG := VAL(SUBSTR(mNMOG, LEN(mNMOG) - mCTDG + 1, 1)) * IF(MOD(mCTDG,2) == 0, 1, 2)
      mSMMD += mVLDG - IF(mVLDG > 9, 9, 0)
   NEXT
   mRSDV := MOD(mSMMD, 10)
   mDCMD := IF(mRSDV == 0, "0", STR(10 - mRSDV, 1))

RETURN mDCMD


FUNCTION DC_Mod11( mCDBC, mBSDG, mFGCB, mNMOG, lMult10 )
LOCAL mSMMD, mCTDG, mSQMP, mRSDV, mDCMD
DEFAULT mFGCB TO .F., lMult10 TO .F.

   mSMMD := 0
   IF mCDBC == "756" 
       mSQMP := 4
   ELSE
       mSQMP := 2
   ENDIF

   FOR mCTDG := 1 TO LEN(mNMOG)

      IF mCDBC == "756" // SICOOB
          mSMMD += ( VAL( SUBSTR( mNMOG, mCTDG, 1 ) ) * mSQMP )
          mSQMP --
          IF mSQMP < 2
              mSQMP := mBSDG
          ENDIF
      ELSE
          mSMMD += VAL(SUBSTR(mNMOG, LEN(mNMOG) - mCTDG + 1, 1)) * (mSQMP)
          mSQMP := IF(mSQMP == mBSDG, 2, mSQMP+1)
       ENDIF

   NEXT
   IF lMult10
      mSMMD *= 10
   ENDIF
   mRSDV := MOD(mSMMD, 11)
   IF mFGCB
      mDCMD := IF(mRSDV > 9 .OR. mRSDV < 2, "1", STR(11 - mRSDV, 1))
   ELSE
      IF mCDBC == "001"        // Brasil
         mDCMD := IF(mRSDV == 0, "0", IF(mRSDV == 1, "X", STR(11 - mRSDV, 1)))
      ELSEIF mCDBC like "(008|033|353)"  //Santander Banespa
         mDCMD := IF(mRSDV < 2, "0", IF(mRSDV == 10, "1", STR(11 - mRSDV, 1)))
       //mDCMD := IF(mRSDV == 0, "0", IF(mRSDV == 1, "X", STR(11 - mRSDV, 1)))
      ELSEIF mCDBC=="104"      // Caixa
         mRSDV := 11 - mRSDV
         mDCMD := IF(mRSDV > 9, "0", STR(mRSDV, 1))
      ELSEIF mCDBC == "237"    // Bradesco
         mDCMD := IF(mRSDV == 0, "0", IF(mRSDV == 1, "P", STR(11 - mRSDV, 1)))
      ELSEIF mCDBC == "341"    // Itau
         mDCMD := IF(mRSDV == 11, "1", STR(11 - mRSDV, 1))
      ELSEIF mCDBC == "409"    // Unibanco
         mDCMD := IF(mRSDV == 0 .OR. mRSDV == 10, "0", STR(mRSDV, 1))
      ELSEIF mCDBC == "422"    // Safra
         mDCMD := IF(mRSDV==0, "1", IF(mRSDV == 1, "0", STR(11 - mRSDV, 1)))
      ELSEIF mCDBC == "756"  // Sicoob
*          IF mRSDV == 0 .OR. mRSDV == 1
*              mDCMD := "0"
          IF mRSDV == 0 
              mDCMD := "1"
          ELSE
              mDCMD := STR(11 - mRSDV, 1)
          ENDIF
      ENDIF
   ENDIF

RETURN mDCMD

// Retorna Dígito de Controle Módulo Especial                                
FUNCTION DC_ModEsp( cCodBco, mNMOG )
LOCAL mVLDG, mSMMD, mCTDG, mSQMP, mRSDV, mDCMD:=0
DO CASE

   CASE cCodBco == "033"  //   santander

      mSMMD:=0
      mSQMP:=3
      FOR mCTDG := 1 TO LEN(mNMOG)
          mVLDG := VAL(SUBSTR(mNMOG, LEN(mNMOG) - mCTDG + 1, 1)) * (mSQMP)
          mSMMD += mVLDG - (INT(mVLDG / 10) * 10)
          mSQMP := IF(mSQMP == 3, 7, IF(mSQMP == 7, 9, IF(mSQMP == 9, 1, 3)))
      NEXT
      mRSDV := mSMMD - (INT(mSMMD / 10) * 10)
      mDCMD := IF(mRSDV == 0, 0, 10 - mRSDV)

   CASE cCodBco == "756" // Sicoob

      mSMMD := 0
      mSQMP := 3

      FOR mCTDG := 1 TO LEN(mNMOG)

          mVLDG := VAL( SUBSTR( mNMOG , mCTDG, 1 ) ) * mSQMP
          mSMMD += mVLDG
          DO CASE
              CASE mSQMP == 3 ; mSQMP := 1
              CASE mSQMP == 1 ; mSQMP := 9
              CASE mSQMP == 9 ; mSQMP := 7
              CASE mSQMP == 7 ; mSQMP := 3
          ENDCASE
      NEXT

      mRSDV := Int( Mod( mSMMD, 11) )

      IF mRSDV == 0 .OR.  mRSDV == 1
          mDCMD := 0
      ELSE
          mDCMD := 11 - mRSDV
      ENDIF

  CASE cCodBco == "136" // Unicred

      mSMMD := 0
      mSQMP := 2

      FOR mCTDG := LEN(mNMOG) TO 1 STEP -1

          mVLDG := VAL( SUBSTR( mNMOG , mCTDG, 1 ) ) * mSQMP
          mSMMD += mVLDG
          mSQMP ++
          IF mSQMP > 9
              mSQMP := 2
          ENDIF
      NEXT

      mRSDV := Int( Mod( mSMMD, 11) )

      IF mRSDV == 0 .OR.  mRSDV == 1
          mDCMD := 0
      ELSE
          mDCMD := 11 - mRSDV
      ENDIF

   ENDCASE

RETURN Str(mDCMD,1)

 

Link to comment
Share on other sites

Bom dia,

Uma outra opção, na página abaixo você se cadastra e pode usar a "API" do SICOOB e emitir o(s) boleto(s) de forma on-line.

https://developers.sicoob.com.br/#!/cadastro

Objetivo.

No Guia do Sicoob Open Banking, você encontra as informações necessárias para se integrar com nossas APIs. O desenvolvedor pode criar rapidamente produtos e aplicativos seguros e personalizados e testar de forma bem simples a integração com nossas APIs.

Sem arquivos "remessa" ou "retorno". 

Abraço.
 

 

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...