;** Ft_DpECF *******************************************************************
;*  Geracao de Duplicatas                                                      *
;*******************************************************************************
;Autor           : Vise Informatica (VISERP)
;Desenvolvido    : 26/06/2001 por Anivel Augusto Rodrigues
;Ultima Alteracao: 30/08/2003 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes
;Ultima Alteracao: 07/05/2008 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Indice Inddup1/Duplic
;Ultima Alteracao: 04/04/2009 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes Conta<>Empresa
;Ultima Alteracao: 24/08/2015 por Andrey Fillipe 
;Motivo Alteracao: Altera‡Æo no processo dos Numero do Lan‡amento - Numero_Lancamento()
;Ultima Alteracao: 27/05/2016 por Bruno Carvalho 
;Motivo Alteracao: Alterado NUM_LANCTO = PROXLANCTO_NLANC -> Padroniza‡Æo da rotina de Numero_Lancamento()
;Alterado em     : 17/08/2018 por Anivel Augusto Rodrigues
;Motivo Alteracao: Ajustes dupnf codigo do documento,Tipo do Documento

;*******************************************************************************
;* Grava Duplicata                                                             *
;*******************************************************************************
Proc Duplicata_DP()
Moveto "Dupc"
End
Down
[Codigo da Conta          ] = CX_CONTA_CAIXA
[Codigo da Empresa        ] = [NotaC->Codigo da Empresa        ]
[Numero do Documento      ] = DP_NUMDOCTO
[Codigo do Documento      ] = DP_CDDOCTO
[Nome Fantasia Empresa    ] = [NotaC->Nome Fantasia Empresa    ]
[Data de Emissao          ] = [NotaC->Data de Emissao          ]
[Tipo                     ] = [NotaC->Tipo                     ]
If Substr([NotaC->Descricao Condpagto],1,6)="CONTRA"
   Then [Condicoes Especiais]=[NotaC->Descricao Condpagto]
EndIf
[Codigo                   ] = [NotaC->Codigo                   ]
[Nome Fantasia EmitDest   ] = [NotaC->Nome Fantasia EmitDest   ]

ACHOU_CLIENTE=False
Moveto [Codigo]
Ativa_Lookup()
Moveto [Codigo]
Locate [DupC->Codigo]
If RetVal
   Then ACHOU_CLIENTE=True
        CopyToArray REG_CLIENTE
EndIf
KeyPress "ESC"
If ACHOU_CLIENTE
   Then [Razao Social Fatura]=REG_CLIENTE["Razao Social"]
        [CGC Fatura         ]=REG_CLIENTE["CGC"]
        [IE Fatura          ]=REG_CLIENTE["IE"]
        [Endereco Fatura    ]=REG_CLIENTE["Endereco"]
        [Bairro Fatura      ]=REG_CLIENTE["Bairro"]
        [CEP Fatura         ]=REG_CLIENTE["CEP"]
        [Cidade Fatura      ]=REG_CLIENTE["Cidade"]
        [UF Fatura          ]=REG_CLIENTE["UF"]
EndIf

Moveto [Lookup_End_Cob]
ACHOU_CLIENTE=False
Ativa_Lookup()
Moveto [Codigo]
Locate [DupC->Codigo]
If RetVal
   Then ACHOU_CLIENTE=True
        CopyToArray REG_CLIENTE
EndIf
KeyPress "ESC"
If ACHOU_CLIENTE
   Then [Endereco de Cobranca    ]=REG_CLIENTE["Endereco de Cobranca"]
        [Bairro de Cobranca      ]=REG_CLIENTE["Bairro de Cobranca"]
        [CEP de Cobranca         ]=REG_CLIENTE["CEP de Cobranca"]
        [Cidade de Cobranca      ]=REG_CLIENTE["Cidade de Cobranca"]
        [UF de Cobranca          ]=REG_CLIENTE["UF de Cobranca"]
EndIf

[Codigo da Destinacao     ] = [NotaC->Codigo da Destinacao     ]
[Descricao da Destinacao  ] = [NotaC->Descricao da Destinacao  ]
[Codigo do Representante  ] = [NotaC->Codigo do Representante  ]
[Nome Fantasia Represent  ] = [NotaC->Nome Fantasia Represent  ]
[Comissao do Representante] = [NotaC->Comissao do Representante]
[Pedido Cliente           ] = [NotaC->Tipo do Documento]+"/"+[NotaC->Numero do Documento]
[Valor Nota Fiscal        ] = [NotaC->Valor Nota Fiscal        ]
[Cta Receber Atualizado   ]="S"

Switch
   Case APLIC_ORIGEM="FATURA": [Sistema Gerador]="FT"
   Case APLIC_ORIGEM="CFe"   : [Sistema Gerador]="CF"
   Case APLIC_ORIGEM="BALCAO": [Sistema Gerador]="BA"
   Case APLIC_ORIGEM="TROCA" : [Sistema Gerador]="TR"
   Case APLIC_ORIGEM="NOTA"  : [Sistema Gerador]="DI"
EndSwitch
[Tipo Docto Gerador  ]=[NotaC->Codigo do Documento]
[Numero Docto Gerador]=[NotaC->Numero do Documento]
Controle_Dia()
UnLockRecord

Moveto [Codigo da Empresa]
Locate [NotaC->Codigo da Empresa  ], DP_NUMDOCTO, DP_SRDOCTO
EndProc

;*******************************************************************************
;* Grava Relacao de Notas                                                      *
;*******************************************************************************
Proc Nota_DP()
Moveto "DupNF"
End
Down
[Codigo da Empresa        ] = [Dupc->Codigo da Empresa    ]
[Numero do Documento      ] = [Dupc->Numero do Documento  ]
[Serie do Documento       ] = [Dupc->Serie do Documento   ]
[Sequencia                ] = "01"

[Codigo do Documento      ] = [NotaC->Codigo do Documento ]
[Tipo do Documento        ] = [NotaC->Tipo do Documento   ]

[Numero da Nota           ] = [NotaC->Numero do Documento ]
[Serie da Nota            ] = [NotaC->Serie do Documento  ]
[Valor da Nota Fiscal     ] = [NotaC->Valor Nota Fiscal   ]
UnLockRecord
EndProc

;*******************************************************************************
;* Grava Desdobramentos                                                        *
;*******************************************************************************
Proc Desdobra_DP()
Private DP_ORDEM
If DP_NPARC=1
   Then DP_ORDEM=""
   Else DP_ORDEM=CHR(65+(DP_CONTDP-1))
EndIf
Moveto "DupI"
End
Down
[Codigo da Empresa  ] = [Dupc->Codigo da Empresa  ]
[Numero do Documento] = [Dupc->Numero do Documento]
[Serie do Documento ] = [Dupc->Serie do Documento ]
[Ordem do Documento ] = DP_ORDEM
[Data Vencimento    ] = [NotaV->Data ]
[Valor Duplicata    ] = [NotaV->Valor]
[Taxa de Juros      ] = PARAM_TXJUROS
[Tipo Taxa de Juros ] = PARAM_FORMA_TXJUROS
If PARAM_FORMA_TXJUROS="A" Then [NDias Taxa de Juros]=365 Endif
If PARAM_FORMA_TXJUROS="M" Then [NDias Taxa de Juros]=30  Endif
If PARAM_FORMA_TXJUROS="D" Then [NDias Taxa de Juros]=1   Endif
[Valor da Comissao  ] = [NotaV->Valor da Comissao]
UnLockRecord

Moveto [Codigo da Empresa]
Locate [NotaC->Codigo da Empresa  ], DP_NUMDOCTO, DP_SRDOCTO, DP_ORDEM
EndProc

;*******************************************************************************
;* Exportacao p/ Contas a Receber                                              *
;*******************************************************************************
Proc Atualiza_CR()
Private CHV_EMPRESA, CHV_TPDOCTO, CHV_NUMERO_ORDEM, CR_LANC, CR_NDIAS, CR_DATA

CHV_EMPRESA=[DupC->Codigo da Empresa]
CHV_TPDOCTO=[DupC->Codigo do Documento]
If [DupI->Ordem do Documento]<>""
   Then CHV_NUMERO_ORDEM=[DupI->Numero do Documento]+"/"+[DupI->Ordem do Documento]
   Else CHV_NUMERO_ORDEM=[DupI->Numero do Documento]
EndIf

Moveto "\\Sistemas\\CtaRec\\Duplic"   
While True
  End
  Moveto [Numero do Lancamento]
  If Numero_Lancamento("Interno","")
     Then CR_LANC = PROXLANCTO_NLANC
          Release Vars PROXLANCTO_NLANC
  EndIf
  Locate CR_LANC
  If Retval
     Then Loop
     Else End Down
          [Numero do Lancamento ]=CR_LANC
          If IsLockRecord()
             Then UnLockRecord
                  Loop
          EndIf
  EndIf
  QuitLoop
EndWhile
[Codigo da Conta         ]=[DupC->Codigo da Conta         ]
[Codigo da Empresa       ]=[DupC->Codigo da Empresa       ]
[Nome Fantasia Empresa   ]=[DupC->Nome Fantasia Empresa   ]
[Codigo do Documento     ]=[DupC->Codigo do Documento     ]
[Numero do Documento     ]=CHV_NUMERO_ORDEM
[Codigo do Destinatario  ]=[DupC->Codigo                  ]
[Nome Fantasia EmitDest  ]=[DupC->Nome Fantasia EmitDest  ]
[Data de Emissao         ]=[DupC->Data de Emissao         ]
[Data de Vencimento      ]=[DupI->Data Vencimento         ]
[Data a Receber          ]=[DupI->Data Vencimento         ]
[Tipo do Lancamento      ]="E"
[Descricao do Lancamento ]="CARTEIRA"
While True
  CR_NDIAS=0
  If Dow([Data a Receber])="Sat"
     Then CR_NDIAS=2
     Else If Dow([Data a Receber])="Sun"
             Then CR_NDIAS=1
          EndIf
  EndIf
  CR_DATA = [Data a Receber]
  Moveto "\\Sistemas\\Cadastro\\Feriados"
  Moveto [Data do Feriado]
  Locate CR_DATA
  If Retval
     Then If [Dias a Receber]>0
             Then CR_NDIAS=[Dias a Receber]
          EndIf
          UnLockRecord
  EndIf
  Moveto "\\Sistemas\\CtaRec\\Duplic"
  [Data a Receber]=[Data a Receber]+CR_NDIAS
  If CR_NDIAS=0
     Then QuitLoop
  EndIf
EndWhile
[Valor do Documento      ]=[DupI->Valor Duplicata         ]
[Saldo do Documento      ]=[DupI->Valor Duplicata         ]
[Valor do Desconto       ]=[DupI->Valor do Desconto       ]
[Data Limite Desconto    ]=[DupI->Data Limite Desconto    ]
[Taxa de Juros           ]=[DupI->Taxa de Juros           ]
[Tipo Taxa de Juros      ]=[DupI->Tipo Taxa de Juros      ]
[NDias Taxa de Juros     ]=[DupI->NDias Taxa de Juros     ]
[Tipo do Pagamento       ]=[NotaV->Forma de Pagamento     ]
[Codigo do Representante ]=[DupC->Codigo do Representante ]
[Nome Fantasia Represent ]=[DupC->Nome Fantasia Represent ]
[Observacoes             ]=[NotaC->Tipo do Documento]+"/"+[NotaC->Numero do Documento]
[Valor da Comissao       ]=[DupI->Valor da Comissao       ]
[Saldo da Comissao       ]=[DupI->Valor da Comissao       ]
UnLockRecord
EndProc

;*******************************************************************************
;* Elimina Lancamentos existentes ou regerados                                 *
;*******************************************************************************
Proc Estorna_Lanctos_DPCR()
Private CHV_EMPRESA, CHV_TPDOCTO, CHV_NUMERO_ORDEM

NF_EXISTE=False
Moveto "DupNF"
Moveto [Numero da Nota]
Locate IndexOrder by "idupnf10" [NotaC->Numero do Documento],[NotaC->Serie do Documento],[NotaC->Codigo da Empresa],[NotaC->Codigo do Documento]
If RetVal
   Then NF_EXISTE=True
        DP_NUMDOCTO=[Numero do Documento]
        DP_SRDOCTO =[Serie do Documento ]
        Del
EndIf

Moveto "DupI"
Moveto [Codigo da Empresa]
Locate [NotaC->Codigo da Empresa], DP_NUMDOCTO, DP_SRDOCTO
If RetVal
   Then While [Codigo da Empresa  ]=[NotaC->Codigo da Empresa  ] and
              [Numero do Documento]=DP_NUMDOCTO and
              [Serie do Documento ]=DP_SRDOCTO

          CHV_EMPRESA=[DupI->Codigo da Empresa]
          CHV_TPDOCTO=DP_CDDOCTO
          If [DupI->Ordem do Documento]<>""
             Then CHV_NUMERO_ORDEM=[DupI->Numero do Documento]+"/"+[DupI->Ordem do Documento]
             Else CHV_NUMERO_ORDEM=[DupI->Numero do Documento]
          EndIf

          Moveto "\\Sistemas\\CtaRec\\Duplic"
          Moveto [Codigo da Empresa]
          Locate IndexOrder by "IndDup1" CHV_EMPRESA,CHV_TPDOCTO,CHV_NUMERO_ORDEM
          If RetVal
             Then Del
          EndIf

          Moveto "DupI"
          Del
          If EOT() Then QuitLoop EndIf
        EndWhile
EndIf

Moveto "Dupc"
Moveto [Codigo da Empresa]
Locate [NotaC->Codigo da Empresa], DP_NUMDOCTO, DP_SRDOCTO
If RetVal
   Then Del
EndIf

EndProc

;*******************************************************************************
;* Cancelar Lancamentos                                                        *
;*******************************************************************************
Proc Cancelar_Duplicatas()
Private CHV_EMPRESA, CHV_TPDOCTO, CHV_NUMERO_ORDEM

NF_EXISTE=False
Moveto "DupNF"
Moveto [Numero da Nota]
Locate IndexOrder by "idupnf10" [NotaC->Numero do Documento],[NotaC->Serie do Documento],[NotaC->Codigo da Empresa],[NotaC->Codigo do Documento]
If RetVal
   Then NF_EXISTE=True
        DP_NUMDOCTO=[Numero do Documento]
        DP_SRDOCTO =[Serie do Documento ]
   Else Return
EndIf

Moveto "DupI"
Moveto [Codigo da Empresa]
Locate [NotaC->Codigo da Empresa], DP_NUMDOCTO, DP_SRDOCTO
If RetVal
   Then While [Codigo da Empresa  ]=[NotaC->Codigo da Empresa  ] and
              [Numero do Documento]=DP_NUMDOCTO and
              [Serie do Documento ]=DP_SRDOCTO

          CHV_EMPRESA=[DupI->Codigo da Empresa]
          CHV_TPDOCTO=DP_CDDOCTO
          If [DupI->Ordem do Documento]<>""
             Then CHV_NUMERO_ORDEM=[DupI->Numero do Documento]+"/"+[DupI->Ordem do Documento]
             Else CHV_NUMERO_ORDEM=[DupI->Numero do Documento]
          EndIf

          Moveto "\\Sistemas\\CtaRec\\Duplic"
          Moveto [Codigo da Empresa]
          Locate IndexOrder by "IndDup1" CHV_EMPRESA,CHV_TPDOCTO,CHV_NUMERO_ORDEM
          If RetVal
             Then Del
          EndIf

          Moveto "DupI"
          Skip
          If EOT() Then QuitLoop EndIf
        EndWhile
EndIf

Moveto "Dupc"
Moveto [Codigo da Empresa]
Locate [NotaC->Codigo da Empresa], DP_NUMDOCTO, DP_SRDOCTO
If RetVal
   Then [Situacao]="C"
EndIf

EndProc

;*******************************************************************************
;* Rotina Principal                                                            *
;*******************************************************************************

If CANCELA_DUP
   Then Moveto "NotaC"
        Moveto [Codigo da Destinacao]
        Ativa_Lookup()
        Moveto [Codigo da Destinacao]
        Locate [NotaC->Codigo da Destinacao]
        DP_GERA_DUPLICATA=[Gera Duplicata]
        keyPress "ESC"

        If SubStr([NotaC->Codigo do Documento],1,2)="NF"
           Then DP_CDDOCTO="DUP"
                DP_SRDOCTO=""
           Else DP_CDDOCTO=[NotaC->Codigo do Documento]
                DP_SRDOCTO=[NotaC->Serie do Documento ]
        EndIf
        If DP_GERA_DUPLICATA="S"
           Then Cancelar_Duplicatas()
                Moveto "NotaC"
        EndIf
   Else Moveto "NotaC"

        Moveto [Codigo da Destinacao]
        Ativa_Lookup()
        Moveto [Codigo da Destinacao]
        Locate [NotaC->Codigo da Destinacao]
        DP_GERA_DUPLICATA=[Gera Duplicata]
        keyPress "ESC"

        If SubStr([NotaC->Codigo do Documento],1,2)="NF"
           Then DP_CDDOCTO="DUP"
                DP_SRDOCTO=""
           Else DP_CDDOCTO=[NotaC->Codigo do Documento]
                DP_SRDOCTO=[NotaC->Serie do Documento ]
        EndIf
        While DP_GERA_DUPLICATA="S"
          If PARAM_DUPLIC_NUMERO="D"    ;**** Diferente ****
             Then Moveto "NumeroDP"
                  Moveto [Codigo da Empresa]
                  Locate [NotaC->Codigo da Empresa], DP_CDDOCTO
                  If Not RetVal
                     Then Mensagem("Controle da numera‡„o p/ duplicatas n„o informado !// Duplicatas n„o foram geradas !")
                          DP_GERA_DUPLICATA="N"
                          Loop
                  EndIf
                  While True
                    If Not IsLockRecord()
                       Then QuitLoop
                    EndIf
                  EndWhile
                  DP_NUMDOCTO=AlinhM(StrVal([Proximo Numero]),6)
             Else DP_NUMDOCTO=[NotaC->Numero do Documento]  ;**** Igual****
          EndIf
          Estorna_Lanctos_DPCR()
          Duplicata_DP()
          Nota_DP()

          DP_NPARC=0
          Moveto "NotaV"
          Moveto [Codigo da Empresa]
          Locate [NotaC->Codigo da Empresa  ],
                 [NotaC->Numero do Documento],
                 [NotaC->Serie do Documento ]
          If RetVal
             Then While [Codigo da Empresa  ]=[NotaC->Codigo da Empresa  ] and
                        [Numero do Documento]=[NotaC->Numero do Documento] and
                        [Serie do Documento ]=[NotaC->Serie do Documento ]
                    If [Data]>[NotaC->Data de Emissao] Or PARAM_AVISTADUPLIC="S"
                       Then DP_NPARC=DP_NPARC+1     ;*** Contagem de desdobramentos ***
                    EndIf
                    Skip
                    If EOT() Then QuitLoop EndIf
                  EndWhile
          EndIf
          Moveto [Codigo da Empresa]
          Locate [NotaC->Codigo da Empresa  ],
                 [NotaC->Numero do Documento],
                 [NotaC->Serie do Documento ]
          If RetVal
             Then DP_CONTDP=0
                  While [Codigo da Empresa  ]=[NotaC->Codigo da Empresa  ] and
                        [Numero do Documento]=[NotaC->Numero do Documento] and
                        [Serie do Documento ]=[NotaC->Serie do Documento ]
                    If [Data]>[NotaC->Data de Emissao] Or PARAM_AVISTADUPLIC="S"
                       Then DP_CONTDP=DP_CONTDP+1
                            Desdobra_DP()
                            Atualiza_CR()
                    EndIf
                    Moveto "NotaV"
                    Skip
                    If EOT() Then QuitLoop EndIf
                  EndWhile
          EndIf

          If PARAM_DUPLIC_NUMERO="D"    ;**** Diferente ****
             Then Moveto "NumeroDP"
                  If not NF_EXISTE
                     Then [Proximo Numero]=[Proximo Numero]+1
                  EndIf
                  UnLockRecord
          EndIf

          QuitLoop
        EndWhile
EndIf

Release Vars dp_numdocto, dp_nparc, dp_gera_duplicata, dp_cddocto, dp_srdocto, dp_contdp, nf_existe
Release Procs Atualiza_CR, Desdobra_DP, Nota_DP, Duplicata_DP, Cancelar_Duplicatas
