   #Include "Inkey.Ch"
/*---------------------------------------------------------------------------
   Sistema.....: Pagamento de Leite 1.0
   Modulo......: m01p1260
   Funcao......: Geraao de Notas Fiscais de Entradas de Leite - para NFE
   Analista....: Erones Jos Santana
   Programador.: Erones Jos Santana
   Criado em...: 17/Jun/2010
   Revisado em.: 05/Fev/2013
---------------------------------------------------------------------------*/
   Procedure M01P1260()

   vMES := xMesAno
   xMe1 := Left(xLoja,2)+Left(xMesAno,2)+Right(xMesAno,2)
   FCli := Space(5)
   Puta := Space(6)
   Buy  := xBSICMS := xVSICMS := xBICMS := xVICMS := xAQLIS := vBSICMS := vVSICMS := vBICMS := vVICMS := xPerc := 0
 
   If AbreVarios( { 2 , 4 , 19 , 25 , 27 , 40 } )                   .and.;
      AbreVarios( { 41 } , xMe1 ) .and. AbreVarios( { 42 } , xMe1 ) .and.;
      LoadScreen("Latic")

      vDT1 := vDT2 := NullDt
      vDat         := Date()
      vTP_MOV      := "2"
      xMesAno      := xMesAno
      Capeta       := vDat - 31
      DuMes        := Right(Dtoc(Capeta),7)
       xRef        := TMes( Val( Left( DuMes , 2 ))) +[/] + Right( DuMes , 4)
       nRef        := TMes( Val( Left( vMes  , 2 ))) +[/] + Right( vMes  , 4)
      vDT1         := CTod( "01/" + DuMes )
      vDT2         := CTod( Str( LastDayOm( vDT1 ), 2 ) + "/" + DuMes )

    Do While .t.

       ShowScreen( 49 , m_cor , .t. )

       @ 09 , 15 Get vDat  Valid ! Vazio() .and. CGP()

       @ 09 , 34 Get     vDT1                                        ;
                 Valid ! Vazio() .and. CGP()                    .and.;
                ( Month( vDT1 ) == Val( Left( DuMes, 2 ) )      .and.;
       Right( Str( Year( vDT1 ), 4 ), 2 ) == Right( DuMes , 2 )  .or.;
          Erro("Data Inicial No Confere com Ms/Ano Selecionado." ) )

       @ 09 , 52 Get     vDT2                                        ;
                 Valid ! Vazio()                                .and.;
                ( Month( vDT2 ) == Val( Left( DuMes, 2 ) )      .and.;
       Right( Str( Year( vDT2 ), 4 ), 2 ) == Right( DuMes , 2 )  .or.;
            Erro("Data Final No Confere com Ms/Ano Selecionado." ) )

       @ 13 , 33 Say nRef

       @ 14 , 33 Say xRef

      If ! CrsRead()
             CloseScreen(49)
           Exit
      End

      If nRef == xRef
         Erro("Mes de Calculo de NFe de Entrada, Nao Pode Ser;;" +;
              "Igual ao Mes de Lancamento do Movimento.." , 15    )
      End
     
      If CrsRead() .and. nRef # xRef .and. YesNo("Confirma Gerao das NFE de Entradas" , 2 , 14 )

            CalNFEE()

        End

       FechaVarios( { 2 , 4 , 19 , 25 , 27 , 40 , 41 , 42 } )

      CloseScreen(49)

     End

    End
/*------------------------------------------------------------------------*/
   Function CGP()  // Atualiza Geracao de Movimentos da NFE

    If vDat <= Date() + 30

     Capeta := vDat - 31
      DuMes := Right(Dtoc(Capeta),7)
       xRef := TMes( Val( Left( DuMes , 2 ))) +[/] + Right( DuMes , 4)
       nRef := TMes( Val( Left( vMes  , 2 ))) +[/] + Right( vMes  , 4)
       vDT1 := CTod( "01/" + DuMes )
       vDT2 := CTod( Str( LastDayOm( vDT1 ), 2 ) + "/" + DuMes )

    End

   Return .t.
/*------------------------------------------------------------------------*/
   Function CalNFEE()  // Calcula e Gera Notas Fiscais de Entradas de Leite

    MFor     := {}
    MMov     := {}
    New      := 1
    Qtde     := 0
    xLiq     := 0
    cnt      := 0
    Lts      := 0
    Inss     := 0
    xBaset   := 0
    xForn    := Space(5)
    xRef     := TMes( Val( Left( DuMes , 2 ))) +[/] + Right( DuMes , 4)

    RuleBox("Gerando Informaoes da Movimentacao" ,, .t. )

      Do While Fornec->( ! Eof() )

        If Fornec->ESTADO == .t.

            Fornec->( AAdd( MFor , { CODIGO     ,;
                                     COD_CLI    ,;
                                     COD_COP    ,;
                                     COD_PORT   ,;
                                     xRef    } ) )

            Fornec->( DbSkip() )

            Else

            Fornec->( AAdd( MFor , { CODIGO     ,;
                                     COD_CLI    ,;
                                     COD_COP    ,;
                                     COD_PORT   ,;
                                     xRef    } ) )

            Fornec->( DbSkip() )
      End

     End

    AbreVarios( { 19 , 25 , 28 , 27 } )

    LeiteAb->( DbReset( , 2 ) )

  For ch := 1 to Len( MFor )

      cnt := Lts := xBaset := xLiq := 0

       xFORN := Left( MFor[ch,1],5)

        Do While LeiteAb->( ! Eof() )

         If Range( vDT1 , vDT2 , LeiteAb->DIA ) .and.;
            Left( MFor[ch,1],5) == LeiteAb->COD_FORN

             cnt    += If(Leiteab->COD_EVE $ "001/002/003" , 1 , 0 )
             Lts    += If(Leiteab->COD_EVE $ "001/002/003" , Leiteab->QUANT , 0 )
             xBaset += If(Leiteab->COD_EVE $ "001/002/003" , LeiteAb->(QUANT*VALOR) , 0 )
             xLiq   += If(Leiteab->COD_EVE $ "001/002/003" , LeiteAb->(QUANT*VALOR) , 0 )

             LeiteAb->( DbSkip() )

           Else

           LeiteAb->( DbSkip() )

         End

        End

         // Alterado em 08/05/2012 por Causa de Processo na Justica Federal
         If( Right(xMesAno,4)+Left(xMesAno,2) <= "201203" , Inss := Round(( xLiq * 2.30 ) / 100 , 2 ) , Inss := Round(( xLiq * 0.30 ) / 100 , 2 ))

         If Ascan( MMov, { |x| x[1] == Left( MFor[ch,1] , 5 ) } ) == 0

                If Leiteab->COD_EVE $ "001/002/003" .and. Leiteab->VALOR > 0

                   LeiteAb->( AAdd( MMov , { MFor[ch,1] ,;
                                             Lts        ,;
                                             xBaset     ,;
                                             xLiq       ,;
                                             cnt        ,;
                                             Inss    } ) )

                Else

                   LeiteAb->( AAdd( MMov , { MFor[ch,1] ,;
                                             Lts        ,;
                                             xBaset     ,;
                                             xLiq       ,;
                                             cnt        ,;
                                             Inss    } ) )
                End

           LeiteAb->( DbReset( , 2 ) )

        End

    RuleBox("Gerando Fornecedor " + Mod11y(xForn) ,, .t. )

  Next

   vp := xIAPAS := xFRETE := xRESF  := xCOMPRA := TLiquido := 0

  TTL := TBruto := TInss  := TFrete := TResf   := TCompra  := Inss := 0
  TColeta := Liq_For := tpm := 0

  For m := 1 to Len( MMov )

     If MMov[m,3] > 0
  
       FCli    := Left(MMov[m,1],5)
      xBaseNet := MMov[m,3]
      vLOJA    := xLOJA
      vSERIE   := "1 "
      vMESANO  := xMesAno
      vNUM_DOC := MyLastCod()
      xMesAno  := xMesAno
      xMesAt   := Right(Dtoc(Capeta),7)
      xMesMov  := Left(xLoja,2)+TMes( Val( Left( DuMes , 2 ))) +[/] + Right( DuMes , 4)
 
       NR->( ApagaRegistro( { || USeek( vSERIE + vNUM_DOC ) } ) )
       NI->( ApagaRegistro( { || USeek( vSERIE + vNUM_DOC ) } ) )

       NFGeral->( CriaRegistro() )

       NFGeral->NUM_DOC := vNUM_DOC
       NFGeral->TP_MOV  := "2"
       NFGeral->SERIE   := "1"
       NFGeral->LOJA    := Left( xLoja , 2 )
       NFGeral->MESANO  := xMesAno
       NFGeral->USUARIO := AllTrim(UserName())
       NFGeral->DATA    := Date()
       NFGeral->HORA    := Time()

       AbreVarios( { 41 , 42 } , xMe1 )
 
        NR->( CriaRegistro() )

          Fornec->( Useek( MMov[m,1] ,, 1 ) )

             ApuraTributos()

        NR->NUM_DOC    := vNUM_DOC
        NR->TP_MOV     := "2"
        NR->SERIE      := vSERIE
        NR->COD_CLI    := Left(MMov[m,1],5)
        NR->COD_NATOP  := "56"
        NR->COD_FISC   := "1102"
        NR->COD_EST    := " "
        NR->COD_PORT   := Fornec->COD_PORT
        NR->COD_PAGTO  := "56"
        NR->VIA_TRANS  := "R"
        NR->COD_VEND   := "01"
        NR->NUM_PED    := vNUM_DOC
        NR->VLR_MERC   := MMov[m,3]
        NR->VLR_CED    := 0
        NR->VLR_DESP   := 0
        NR->VLR_CHQ    := 0
        NR->VLR_TIT    := 0
        NR->DESCONTO   := If(Fornec->INSS=="S",MMov[m,6],0)
        NR->VLR_TOTAL  := Round( MMov[m,3] - MMov[m,6] , 2 )
        NR->RESP_FRET  := "1"
        NR->FRETE      := 0
        NR->ALI_FRETE  := 0
        NR->SEGURO     := 0
        NR->COD_TRANS  := " "
        NR->PLACA_VEIC := " "
        NR->COD_CAM    := " "
        NR->UF_VEIC    := " "
        NR->VOL_QTD    := MMov[m,2]
        NR->VOL_ESP    := "LIQUIDO"
        NR->VOL_PESOL  := MMov[m,2] * 1.32
        NR->VOL_PESOB  := MMov[m,2] * 1.32
        NR->DT_EMISSAO := Date()
        NR->DT_SAIDA   := Date()
        NR->H_SAIDA    := Left(Time(),2)+Subs(Time(),4,2)
        NR->BAS_ICMS   := xBICMS
        NR->VLR_ICMS   := xVICMS
        NR->BAS_ICMS_S := xBSICMS
        NR->VLR_ICMS_S := xVSICMS
        NR->CANC       := .f.
        NR->PRO_SER    := "04"
        NR->FECHADA    := .f.
        NR->ENVIADO    := .f.
        NR->PRINTER    := .f.
        NR->OBSERVACAO := "NFE ENTRADA REF A " + Dtoc( vDT1 ) + [ ATE ] + Dtoc( vDT2 ) +[ - ] + StrZero(MMov[m,5],2) +[ COLETAS - ] + xREF
        NR->USUARIO    := Rtrim(UserName())
        NR->DATA       := Date()
        NR->HORA       := Time()

        NI->( CriaRegistro() )

        NI->NUM_DOC    := vNUM_DOC
        NI->SERIE      := vSERIE
        NI->COD_CLI    := Left(MMov[m,1],5)
        NI->COD_PROD   := "001"
        NI->UNID       := "LTS"
        NI->QUANT      := MMov[m,2]
        NI->QT_VOL     := MMov[m,2]
        NI->PC_UNIT    := Round( MMov[m,3] / MMov[m,2],2)
        NI->SITUACAO   := Proventos->CST
        NI->SITIPI     := " "
        NI->SITCOF     := " "
        NI->ICMS       := Proventos->ICMS_EST
        NI->REDUCAO    := Proventos->REDUCAO
        NI->IVA        := 0
        NI->ICMS_IVA   := 0
        NI->IPI        := 0
        NI->VLR_IPI    := 0
        NI->PERC_DESC  := 0
        NI->CL_FISC    := Proventos->COD_NCM
        NI->P_COMIS    := 0
        NI->LOTE       := "LEITE IN"

      End

      If( MMov[m,3] > 0 , Tpm++ , 0 )

   Next

    LiberaVarios( { 2 , 3 , 10 , 11 , 19 , 25 , 27 , 28 } )

     FechaVarios( { 2 , 3 , 10 , 11 , 19 , 25 , 27 , 28 } )

     CloseScreen(49)

     RuleBoxC()

     Erro("Foram Geradas "+Str(Tpm,4) + " Notas Fiscais de Entradas...;;" +;
          "As NFE's esto disponveis para Remessa e Autenticao;;"      +;
          "na RFB na opo de Lanamentos de Notas Fiscais."                        )

     LiberaVarios( { 2 , 3 , 10 , 11 , 19 , 25 , 27 , 28 } )

     CloseScreen(49)

    Return
/*------------------------------------------------------------------------*/
   Function ApuraTributos()

    Private GetList := {}

     xBSICMS := xVSICMS := xBICMS := xVICMS := xAQLIS := 0
         xGO := Fornec->UF
    xCOD_PRO := "001"

               Fornec->( USeek( Left( FCli , 5 ) ,, 1 ) )
            Proventos->( USeek( Left(xCOD_PRO,3) ,, 1 ) )

  If Proventos->CST == "000"

      xALIQS  := If( xGO == "GO" , Proventos->ICMS_EST , Proventos->ICMS_INT )
      xBSICMS := xVSICMS := 0
      xBICMS  := xBaseNet
      xVICMS  := Round( ( xBICMS * xALIQS ) / 100 , 2 )

  ElseIf Proventos->CST == "010"

      xBSICMS := xVSICMS := xBICMS := xVICMS := 0

  ElseIf Proventos->CST == "020"

      xALIQS  := If( xGO == "GO" , Proventos->ICMS_EST , Proventos->ICMS_INT )
      xBICMS  := xVICMS := 0
      xBSICMS := Round( xBaseNet * Proventos->REDUCAO / 100 , 2 )
      xVSICMS := Round( ( xBSICMS * xALIQS ) / 100 , 2 )

  ElseIf Proventos->CST == "030"

      xALIQS  := If( xGO == "GO" , Proventos->ICMS_EST , Proventos->ICMS_INT )
      xBICMS  := xVICMS := 0
      xBSICMS := Round( xBaseNet * Proventos->REDUCAO / 100  , 2 )
      xVSICMS := Round( ( xBSICMS * vALIQS ) / 100 , 2 )

  ElseIf Proventos->CST $ "040/041/050/051"

      xBSICMS := xVSICMS := xBICMS := xVICMS := 0

  ElseIf Proventos->CST == "060"

      xALIQS  := If( xGO == "GO" , Proventos->ICMS_EST , Proventos->ICMS_INT )
      xBICMS  := xVICMS := 0
      xBSICMS := xBaseNet
      xVSICMS := Round( ( xBSICMS * xALIQS ) / 100 , 2 )

  ElseIf Proventos->CST == "070"

      xALIQS  := If( xGO == "GO" , Proventos->ICMS_EST , Proventos->ICMS_INT )
      xBICMS  := xVICMS := 0
      xBSICMS := Round( xBaseNet * Proventos->REDUCAO / 100 , 2 )
      xVSICMS := Round( ( xBSICMS * xALIQS ) / 100 , 2 )

    ElseIf Proventos->CST == "090"

     xBSICMS := xVSICMS := xBICMS := xVICMS := 0

  End

  Return xBSICMS := xVSICMS := xBICMS := xVICMS

/*------------------------------------------------------------------------*/
