Jump to content
Fivewin Brasil

Converter DateTime em horas


miragerr

Recommended Posts

Boa tarde Miragerr

Se seu objetivo é cancelamento de NF-e, eu fiz assim, talvez te ajude:

nDias:= Date()-Ctod(Subs(CabNf->DTRET,9,2)+"/"+Subs(CabNf->DTRET,6,2)+"/"+Subs(CabNf->DTRET,1,4))
cHora:= Subs(CabNf->DTRET,12,8)
If nDias>1 .or. (nDias=1 .and. Secs(Elaptime(cHora,"23:59:59"))+Secs(Elaptime("00:00:00",Time()))>86400)
   If !MsgYesNo("Nota fiscal fora do prazo legal para cancelamento."+CRLF+;
      "Se deseja realmente cancelar esta NF, é necessário primeiro solicitar o cancelamento EXTEMPORÂNEO pelo"+CRLF+;
      "site da Secretaria da Fazenda (SEFAZ) do seu estado."+CRLF+;
      "Caso já tenha solicitado o cancelamento extemporâneo, deseja continuar o cancelamento?",;
      "Prazo Para Cancelamento Terminado")
      Return .t.
   Endif
Endif

Herberson Gontijo

Link to comment
Share on other sites


/***************************************************************************
* Programa ....: DateTime.PRG
* Autor .......: Samir
* Date ........: 2/3/2010 às 10:30:13
* Revisado em .: 2/3/2010 às 10:30:13
*
* Classe para tratar uma Date e Time em conjunto
*
***************************************************************************/

#include 'FiveWin.ch'

CLASS TDateTime

   //-- Propriedades -----------------------------------------------------//

   //-- Atributos a serem acessados
   DATA Date                AS Date       INIT Date()       READONLY
   DATA Time                AS Character  INIT Time()       READONLY
   DATA Secs                AS Numeric    Init 0            READONLY

   //-- Uso interno da classe
   DATA nSecsMinute         AS Numeric    Init 0            HIDDEN
   DATA nSecsHour           AS Numeric    Init 0            HIDDEN
   DATA nSecsDay            AS Numeric    Init 0            HIDDEN
   DATA nSecsMonth          AS Numeric    Init 0            HIDDEN
   DATA nSecsYear           AS Numeric    Init 0            HIDDEN

   //-- Métodos ----------------------------------------------------------//

   //-- Construção
   METHOD New(cDateIni,cTimeIni)                            CONSTRUCTOR
   METHOD End()


   METHOD Absolute(dDateReference)

   //-- Uso Interno
   METHOD Verify()                                          HIDDEN
   METHOD UpdateVar()                                       HIDDEN

   //-- Modificar atributos da classe
   METHOD SetDate(dDate) INLINE ( ::Date := dDate )
   METHOD SetTime(cTime) INLINE ( ::Time := cTime, ::Secs := Secs(cTime) )

   //-- Add Time
   METHOD AddHour(nTime)                                    //PUBLIC
   METHOD AddMinute(nMinute)                                //PUBLIC
   METHOD AddSecond(nSecond)                                //PUBLIC

   //-- Add Date
   METHOD AddDay(nDay)                                      //PUBLIC
   METHOD AddMonth(nMonth)                                  //PUBLIC
   METHOD AddYear(nYear)                                    //PUBLIC

   //-- Remove Tempo
   METHOD RemHour(nTime)                                    //PUBLIC
   METHOD RemMinute(nMinute)                                //PUBLIC
   METHOD RemSecond(nSecond)                                //PUBLIC

   //-- Remove Date
   METHOD RemDay(nDay)                                      //PUBLIC
   METHOD RemMonth(nMonth)                                  //PUBLIC
   METHOD RemYear(nYear)                                    //PUBLIC

   //-- Compatibilidade ( Aceitar comandos no plural ) -------------------//

   //-- Add Tempo
   METHOD AddHours(nHour)        INLINE   ::AddHour(nHour)
   METHOD AddMinutes(nMinute)    INLINE   ::AddMinute(nMinute)
   METHOD AddSeconds(nSecond)    INLINE   ::AddSecond(nSecond)

   //-- Add Date
   METHOD AddDays(nDay)          INLINE   ::AddDays(nDay)
   METHOD AddMonths(nMonth)      INLINE   ::AddMonth(nMonth)
   METHOD AddYears(nYear)        INLINE   ::AddYear(nYear)

   //-- Remove Tempo
   METHOD RemHour(nHour)         INLINE   ::RemHour(nHour)
   METHOD RemMinutes(nMinute)    INLINE   ::RemMinute(nMinute)
   METHOD RemSeconds(nSecond)    INLINE   ::RemSecond(nSecond)

   //-- Remove Date
   METHOD RemDays(nDay)          INLINE   ::RemDay(nDay)
   METHOD RemMonths(nMonth)      INLINE   ::RemMonth(nMonth)
   METHOD RemYears(nYear)        INLINE   ::RemYear(nYear)

ENDCLASS

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

****************************************************************************
METHOD New(xDateIni,cTimeIni) CLASS TDateTime
****************************************************************************
*
* Initiate the object
* Parametros: Nenhum
* Retorno: Self (Object)
*
* Autor .......: Samir
* Date ........: 2/3/2010 às 10:30:20
*
****************************************************************************

   Default xDateIni := Date(), cTimeIni := Time()
   
   If ValType(xDateIni) = "C"
      ::Date := cTod(xDateIni)
   elseif ValType(xDateIni) = "D"
      ::Date := xDateIni
   else
      ::Date := Date()
   end
   
   ::Time := cTimeIni
   
   ::Secs := Secs(cTimeIni)

   ::nSecsMinute := 60                  //-- FIXO
   ::nSecsHour   := ::nSecsMinute * 60  //-- FIXO
   ::nSecsDay    := ::nSecsHour   * 24  //-- FIXO

   //-- Atualizar Seconds do Month/Year
   ::UpdateVar()

return Self

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

****************************************************************************
METHOD End() CLASS TDateTime
****************************************************************************
*
* Release the object from memory
* Parametros: Nenhum
* Retorno: Nil
*
* Autor .......: Samir
* Date ........: 2/3/2010 às 10:30:20
*
****************************************************************************

   Self := Nil

return nil

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

****************************************************************************
METHOD UpdateVar() CLASS TDateTime
****************************************************************************
*
* Update the second counting vars
* Parametros:
* Retorno: Nil
*
* Autor: Samir
* 2/3/2010 - 13:52:18
*
****************************************************************************

   ::nSecsMonth   := ::nSecsDay    * LastDay(::Date)
   ::nSecsYear    := ::nSecsDay    * If ( IsBissexto(::Date), 366, 365 )

return nil
/*------------------------------------------------------------------------*/

****************************************************************************
METHOD Verify() CLASS TDateTime
****************************************************************************
*
* Verify if happen and Date update based on the Seconds
* Parametros: Nenhum
* Retorno: Nil
*
* Autor .......: Samir
* Date ........: 2/3/2010 às 10:30:20
*
****************************************************************************

Local lRewind := .F.

   //-- Verify if is negative or positive
   If ::Secs < 0
   
      lRewind := .T.
      
      ::Secs := Abs(::Secs)
      
   end

   //-- Increase
   If !lRewind

      //-- Verify if increase one Day
      While ::Secs > ::nSecsDay

         ::Secs -= ::nSecsDay
         ::AddDay()

      end

      //-- Update time with the rest
      ::Time := TString(::Secs)

   //-- Decrease
   else

      //-- Verify if decrease one Day
      While ::Secs > ::nSecsDay

         ::Secs -= ::nSecsDay
         ::RemDay()

      end

      //-- If time is negative, make reference to the last day
      ::RemDay()

      //-- Update time with the rest
      ::Time := TString(::nSecsDay - ::Secs)

   end
   
   ::UpdateVar()

return nil

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

****************************************************************************
METHOD AddHour(nHour) CLASS TDateTime
****************************************************************************
*
* Add Hour
* Parametros: nHour
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:33:57
*
****************************************************************************

   Default nHour := 1
   
   ::Secs += nHour * ::nSecsHour
   
   ::Verify()

return nil

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

****************************************************************************
METHOD AddMinute(nMinute) CLASS TDateTime
****************************************************************************
*
* Add Minute
* Parametros: nMinute
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:30
*
****************************************************************************

   Default nMinute := 1
   
   ::Secs += nMinute * ::nSecsMinute

   ::Verify()

return nil

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

****************************************************************************
METHOD AddSecond(nSecond) CLASS TDateTime
****************************************************************************
*
* Add Second
* Parametros: nSecond
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:58
*
****************************************************************************

local Result := nil

   Default nSecond := 1

   ::Secs += nSecond

   ::Verify()

return nil

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

****************************************************************************
METHOD AddDay(nDay) CLASS TDateTime
****************************************************************************
*
* Add Day
* Parametros: nDay
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:37:46
*
****************************************************************************

local Result := nil, nMax := 0, nEndMonth := 0, nAux := 0, cAux := ""

   Default nDay := 1

   ::Date := ::Date + nDay

return nil

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

****************************************************************************
METHOD AddMonth(nMonth) CLASS TDateTime
****************************************************************************
*
* Add Month
* Parametros: nMonth
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:30
*
****************************************************************************

local Result := nil

   Default nMonth := 1

   ::Date := IncMonth(::Date,nMonth)

return nil

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

****************************************************************************
METHOD AddYear(nYear) CLASS TDateTime
****************************************************************************
*
* Add Year
* Parametros: nYear
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:58
*
****************************************************************************


local Result := nil, nDayAux := 0, nMonthAux := 0, nYearAux := 0, cDateAux := ""

   Default nYear := 1

   nDayAux      := Day(  ::Date())
   nMonthAux    := Month(::Date())
   nYearAux     := Year( ::Date())

   nYearAux += nYear

   cDateAux += StrZero(nDayAux,2)   + "/"
   cDateAux += StrZero(nMonthAux,2) + "/"
   cDateAux += StrZero(nYearAux,4)

   ::Date := CtoD(cDateAux)

return nil

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

****************************************************************************
METHOD RemHour(nHour) CLASS TDateTime
****************************************************************************
*
* Add Hour
* Parametros: nHour
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:33:57
*
****************************************************************************

local Result := nil

   Default nHour := 1
   
   ::Secs -= nHour * ::nSecsHour

   ::Verify()

return nil

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

****************************************************************************
METHOD RemMinute(nMinute) CLASS TDateTime
****************************************************************************
*
* Add Minute
* Parametros: nMinute
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:30
*
****************************************************************************

local Result := nil

   Default nMinute := 1
   
   ::Secs -= nMinute * ::nSecsMinute

   ::Verify()
   
return nil

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

****************************************************************************
METHOD RemSecond(nSecond) CLASS TDateTime
****************************************************************************
*
* Add Second
* Parametros: nSecond
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:58
*
****************************************************************************

local Result := nil

   Default nSecond := 1

   ::Secs -= nSecond
   
   ::Verify()

return nil

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

****************************************************************************
METHOD RemDay(nDay) CLASS TDateTime
****************************************************************************
*
* Add Day
* Parametros: nDay
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:37:46
*
****************************************************************************

local nMax := 0

   Default nDay := 1
   
   ::Date := ::Date - nDay
   
return nil

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

****************************************************************************
METHOD RemMonth(nMonth) CLASS TDateTime
****************************************************************************
*
* Add Month
* Parametros: nMonth
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:30
*
****************************************************************************

   Default nMonth := 1
   
   ::Date := DecMonth(::Date,nMonth)

return nil

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

****************************************************************************
METHOD RemYear(nYear) CLASS TDateTime
****************************************************************************
*
* Add Year
* Parametros: nYear
* Retorno: NIL
*
* Autor: Samir
* 2/3/2010 - 10:34:58
*
****************************************************************************

local nDayAux := 0, nMonthAux := 0, nYearAux := 0, cDateAux := ""

   Default nYear := 1
   
   nDayAux      := Day(::Date())
   nMonthAux    := Month(::Date())
   nYearAux     := Year(::Date())
   
   nYearAux -= nYear
   
   cDateAux += StrZero(nDayAux,2)   + "/"
   cDateAux += StrZero(nMonthAux,2) + "/"
   cDateAux += StrZero(nYearAux,4)
   
   ::Date := CtoD(cDateAux)

return nil

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

****************************************************************************
METHOD Absolute(dDateReferencia) CLASS TDateTime
****************************************************************************
*
* Obter um valor absoluto em Seconds da Date mais Time
* Parametros: dDateReferencia
* Retorno: nValorAbsoluto
*
* Autor: Samir
* 17/11/2010 - 10:51:08
*
****************************************************************************

local nValorAbsoluto := 0, nDays := 0

   Default dDateReferencia := cTod("01/01/1920")

   nDays := Abs( ::Date - dDateReferencia)

   nValorAbsoluto := nDays * ::nSecsDay

   nValorAbsoluto += ::Secs

return nValorAbsoluto
/*------------------------------------------------------------------------*/

****************************************************************************
static function IsBissexto(xDate)
****************************************************************************
*
* Verificar se um ano é bissexto ou não
* Parametros: xDate
* Retorno: lResult
*
* Autor: Samir
* 2/3/2010 - 11:15:02
*
****************************************************************************

local lResult := .T., nYear := 0

   If ValType(xDate) = "D"
      nYear := Year(xDate)
   elseif ValType(xDate) = "N"
      nYear := xDate
   elseif ValType(xDate) = "C"
      If IsDigit(xDate)
         If Len(xDate) = 2 .or. Len(xDate) = 4
            nYear := Val(xDate)
         else
            lResult := .F.
         end
      else
         lResult := .F.
      end
   else
      lResult := .F.
   end

   If lResult

      If nYear % 4 = 0 .and. nYear % 100 != 0
         lResult := .T.
      Elseif nYear % 100 = 0 .and. nYear % 400 = 0
         lResult := .T.
      Else
         lResult := .F.
      End

   else

      MsgInfo("Invalid Date parameter")
   
   end

Return lResult

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

****************************************************************************
function LastDay( dDateVal )
****************************************************************************
Local nLastDay, nMonthNum, nNumDays

   If dDateVal = NIL
      dDateVal := Date()
   ElseIf Valtype( dDateVal ) == 'N' 
      nMonthNum := dDateVal
   ElseIf Valtype( dDateVal ) == 'D'
      nMonthNum := Month( dDateVal )
   Else
      Return 0
   Endif

   nNumDays  := 31

   Do Case
      Case nMonthNum = 4 .or. nMonthNum = 6 .or. nMonthNum = 9 .or. ;
         nMonthNum = 11
         nNumDays := 30
      Case nMonthNum = 2
         If Year( dDateVal ) % 4 = 0 .and. Year( dDateVal ) % 100 != 0
            nNumDays := 29
         Elseif Year( dDateVal ) % 100 = 0 .and. Year( dDateVal ) % 400 = 0
            nNumDays := 29
         Else
            nNumDays := 28
         Endif
   Endcase

Return( nNumDays )

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

****************************************************************************
function IncMonth(dDate, nMonth)
****************************************************************************

local Result := dDate, nDia := 0, nAno := 0, nMes := 0, cData := ""

   nDia := Day(dDate)
   nMes := Month(dDate)
   nAno := Year(dDate)

   nMes += nMonth
   nMonth := nMes

   if nMes > 12
      if nMes % 12 == 0
         nMes := 12
      else
         nMes := nMes % 12
         nAno += Trunc(nMonth / 12,0)
      end
   end

   if (AllTrim(Str(nMes,2,0)) $ "4,6,9,11") .and. nDia >= 30
      nDia := 30
   elseif (AllTrim(Str(nMes,2,0)) == "2") .and. nDia >= 28
      nDia := 28
   end

   cData := AllTrim(Str(nDia,2,0)) + '/' + AllTrim(Str(nMes,2,0)) + '/' + ;
            AllTrim(Str(nAno,4,0))

   if Empty(CTOD(cData))
      MsgAlert(cData)
   end

   Result := CtoD(cData)

Return Result

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

****************************************************************************
function DecMonth(dDate, nMonth)
****************************************************************************

local Result := dDate, nDia := 0, nAno := 0, nMes := 0, cData := ""

   nDia := Day(dDate)
   nMes := Month(dDate)
   nAno := Year(dDate)

   nAno -= Trunc(nMonth / 12,0)

   nMes -= ( nMonth % 12 )

   if nMes <= 0

      if nMonth % 12 == 0
         //nMes := 12
         nMes := Month(dDate)
      else

         nAno -= 1
         nMes += 12

      end
   end

   if (AllTrim(Str(nMes,2,0)) $ "4,6,9,11") .and. nDia = 31
      nDia := 30
   elseif (AllTrim(Str(nMes,2,0)) == "2") .and. nDia >= 29
      nDia := 28
   end

   cData := AllTrim(Str(nDia,2,0)) + '/' + AllTrim(Str(nMes,2,0)) + '/' + ;
            AllTrim(Str(nAno,4,0))

   Result := CtoD(cData)

Return Result

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

Com o método Absolute() você tem o tempo em segundos e pode comparar o tempo de duas instâncias da classe, exemplo:

oDataHoraNFE := TDateTime():New(dDataNFE,cHoraNFE)

oDataHoraAtual := TDateTime():New()

nDiferenca := oDataHoraAtual:Absolute() - oDataHoraNFE:Absolute()

If nDiferenca > ( 24*60*60 ) //24 horas, 60 minutos, 60 segundos

?"Diferença maior que um dia"

End

Link to comment
Share on other sites

Ola Herberson

Tudo joia meu jovem,

É quase isso, o que quero é comprar as horas entre uma NFCe e uma NFe que foi tirada a partir de uma NFCe. pois estou tendo alguns problemas quando o meu cliente emite uma NFCe depois de alguns dias a pessoa volta pedindo uam NFe, até ai tudo bem pode ser tirada, mais as veses o cara tira a NFe e volta depois para cancelar a NFe por algum motivo, e nisso tenho que cancelar em CASCATA, 1o a NFCe depois a NFe, e nem sempre é possivel.

Fico no aguardo.

Link to comment
Share on other sites

  • 3 years later...
 

Ola Herberson

Tudo joia meu jovem,

É quase isso, o que quero é comprar as horas entre uma NFCe e uma NFe que foi tirada a partir de uma NFCe. pois estou tendo alguns problemas quando o meu cliente emite uma NFCe depois de alguns dias a pessoa volta pedindo uam NFe, até ai tudo bem pode ser tirada, mais as veses o cara tira a NFe e volta depois para cancelar a NFe por algum motivo, e nisso tenho que cancelar em CASCATA, 1o a NFCe depois a NFe, e nem sempre é possivel.

Fico no aguardo.

Jackson, boa noite

 

Porque vc não vai pelo caminho mais fácil, pois a partir do momento que perdeu o prazo de cancelamento, principalmente por se tratar de NFC-e, que é um documento exclusivamente de saída,  gera uma devolução pelo modelo 55 e em seguida gera mais um documento 55 para atender ao cliente.

 

[]s,

Link to comment
Share on other sites

Ola, Meu jovem

 

Não é isso, o problema esta em emitir as duas, sendo da seguinte forma:

1-Emito a NFC-e

2-Emito uma NF-e apartir da NFC-e "passo 1" 2 dias depois "por exemplo" pois não ha problema até aqui

3-No dia seguinte o Individuo vem devolver o produto, só que a NF-e EU consigo cancelar, já a NFC-e não

 

Mais já mudei a metodologia de emissão, para a seguinte forma: O vendedor solicita do CLIENTE se vai ser NF-e ou NFC-e, e se o CLIENTE depois quiser uma NF-e do produto, não mais será emitido, pois o mesmo OPITOU por NFC-e no ato da compra, ai neste caso cabe ao estabelecimento, EMITIR uma NF-e de ENTRADA referenciando a NFC-e, para posterior emitir uma NF-e.

 

Acho que deu para mostrar como ficou agora.

 

Fico no aguardo para quaisquer esclareimento.

Link to comment
Share on other sites

 

Ola, Meu jovem

 

Não é isso, o problema esta em emitir as duas, sendo da seguinte forma:

1-Emito a NFC-e

2-Emito uma NF-e apartir da NFC-e "passo 1" 2 dias depois "por exemplo" pois não ha problema até aqui

3-No dia seguinte o Individuo vem devolver o produto, só que a NF-e EU consigo cancelar, já a NFC-e não

 

Mais já mudei a metodologia de emissão, para a seguinte forma: O vendedor solicita do CLIENTE se vai ser NF-e ou NFC-e, e se o CLIENTE depois quiser uma NF-e do produto, não mais será emitido, pois o mesmo OPITOU por NFC-e no ato da compra, ai neste caso cabe ao estabelecimento, EMITIR uma NF-e de ENTRADA referenciando a NFC-e, para posterior emitir uma NF-e.

 

Acho que deu para mostrar como ficou agora.

 

Fico no aguardo para quaisquer esclareimento.

Jackson

Boa tarde

Eu entendi, e não estou criticando o seu processo,  só que, qdo vc faz o passo 2 sem finalizar o passo 1, vc fica com 2 documentos válidos para a mesma operação, então a preocupação em cancelar não é um problema, pois se passar do prazo legal, faz uma devolução, assim evita-se que o documento fique ativo e evita-se 2 documentos válidos para as mesmas mercadorias com possíveis diferença de estoque, ou seja duas saídas e nenhuma entrada.

Então, em relação aos procedimentos posteriores, seria operações normais, só não vejo razão pra colocar no sistema verificação de tempo para cancelamento, visto que (Ao menos nos sefaz em que tenho sistema, eles controlam e bloqueiam), causa erro de fora de prazo para cancelamento e o processo não é concretizado, então por consequência, é orientado ao operador proceder coma devolução.

[]s,

 

[]s

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...