def make_second_copy(request, invoice): user = request.user invoice = Invoice.objects.get(pk=invoice) aux = Invoice.objects.filter(status=1, organization=invoice.organization, due_date__gt=datetime.now()).count() if aux <= 0: inv = Invoice() inv.organization = invoice.organization inv.due_date = datetime.now() + timedelta(days=7) inv.expiry_date = invoice.expiry_date inv.ammount = invoice.ammount inv.discount = invoice.discount inv.status = 1 inv.plan = invoice.plan inv.save() invoice.status = 3 invoice.save() data = BradescoBilletData.objects.all()[0] billet_url = gera_boleto_bradesco(request.user.id, inv, days=data.default_second_copy_days, second_copy=True) inv.billet_url = billet_url inv.save() aux = True message = 'Second copy details saved successfully' else: message = 'Second copy not generated: there are billets that still requiring payment.' aux = False return render_to_response('organization/second_copy.html', locals(), context_instance=RequestContext(request))
def gera_boleto_bradesco_inscricao(resp_usuario_id, days=7): ''' Receives a dict filled with the data that will be sent to the billet generator and returns a permalink to the billet generated. ''' from gestorpsi import settings user = User.objects.get( pk=int(resp_usuario_id) ) profile = user.get_profile() person = profile.person d = Document() t = TypeDocument.objects.get(description='CPF') try: cpf = person.document.get(typeDocument__id=t.id).document except: cpf = '' try: addr = endereco = person.address.all()[0] except: addr = endereco = None if BradescoBilletData.objects.all(): # condicacao adicionada para evitar interrupcao no formulario de cadastro em 15/04/2013 (czd) data = BradescoBilletData.objects.all()[0] else: data = None org = Organization.objects.filter(organization__isnull=True).filter(person__profile__user=user)[0] inv = Invoice(organization=org, status=1) due_date = (datetime.now() + timedelta(days=days)) inv.due_date = due_date.strftime("%Y-%m-%d") expiry_date = (due_date + relativedelta(months=1)).replace(day=org.default_payment_day) inv.expiry_date = expiry_date.strftime("%Y-%m-%d") try: if float(data.inscription_default_value) > 0: inv.ammount = str(data.inscription_default_value) else: inv.ammount = str(INSCRIPTION_DEFAULT_VALUE) except: inv.ammount = str(INSCRIPTION_DEFAULT_VALUE) inv.save() org.current_invoice = inv org.save() if inv.billet_url is not None and len(inv.billet_url) > 5: return inv.billet_url else: if data: # condicacao adicionada para evitar interrupcao no formulario de cadastro em 15/04/2013 (czd) dados = {} #INFORMANDO DADOS SOBRE O CEDENTE (quem vai receber). dados['cedente_nome'] = data.cedente_nome dados['cedente_cnpj'] = data.cedente_cnpj #INFORMANDO DADOS SOBRE O SACADO (quem vai pagar). dados['sacado_nome'] = person.name dados['sacado_cpf'] = cpf #Informando o endereço do sacado. try: dados['enderecosac_uf'] = str(endereco.city.state.shortName) except: dados['enderecosac_uf'] = '' try: dados['enderecosac_localidade'] = endereco.city.name except: dados['enderecosac_localidade'] = '' try: dados['enderecosac_cep'] = endereco.zipCode except: dados['enderecosac_cep'] = '' try: dados['enderecosac_bairro'] = str(endereco.neighborhood) except: dados['enderecosac_bairro'] = '' try: dados['enderecosac_logradouro'] = endereco.addressLine1 except: dados['enderecosac_logradouro'] = '' try: dados['enderecosac_numero'] = endereco.addressNumber except: dados['enderecosac_numero'] = '' #INFORMANDO DADOS SOBRE O SACADOR AVALISTA (aquele que é contactado em caso de problemas). dados['sacadoravalista_nome'] = data.sacadoravalista_nome dados['sacadoravalista_cnpj'] = data.sacadoravalista_cnpj #Informando o endereço do sacador avalista. dados['enderecosacaval_uf'] = None if not hasattr(data.enderecosacaval_uf, "shortName") else data.enderecosacaval_uf.shortName dados['enderecosacaval_localidade'] = data.enderecosacaval_localidade dados['enderecosacaval_cep'] = data.enderecosacaval_cep dados['enderecosacaval_bairro'] = data.enderecosacaval_bairro dados['enderecosacaval_logradouro'] = data.enderecosacaval_logradouro dados['enderecosacaval_numero'] = data.enderecosacaval_numero #INFORMANDO OS DADOS SOBRE O TÍTULO. #Informando dados sobre a conta bancaria do titulo. dados['contabancaria_numerodaconta'] = data.contabancaria_numerodaconta dados['contabancaria_numerodaconta_digito'] = data.contabancaria_numerodaconta_digito dados['contabancaria_carteira'] = data.contabancaria_carteira dados['contabancaria_agencia'] = data.contabancaria_agencia dados['contabancaria_agencia_digito'] = data.contabancaria_agencia_digito #Código fornecido pelo Banco para identificação do título ou identificação #do título atribuído pelo emissor do título de cobrança. dados['titulo_nossonumero'] = ("%0.11d") % inv.id digito = 0 for p in str(inv.id): digito += int(p) digito = digito % 10 dados['titulo_digitodonossonumero'] = str(digito) dados['titulo_deducao'] = "0.00" dados['titulo_mora'] = "0.00" dados['titulo_acrecimo'] = "0.00" dados['titulo_valorcobrado'] = "0.00" dados['titulo_desconto'] = "0.00" dados['titulo_valor'] = str(inv.ammount) dados['titulo_datadodocumento'] = str(inv.date) dados['titulo_datadovencimento'] = str(inv.due_date) dados['titulo_numerododocumento'] = str(inv.id) #INFORMANDO OS DADOS SOBRE O BOLETO. dados['boleto_localpagamento'] = "Pagável preferencialmente no Bradesco." dados['boleto_instrucaoaosacado'] = "Pode ser pago em quaisquer agências." dados['boleto_instrucao1'] = "Após vencimento cobrar 50% de multa e 100% de juros ao dia." #dados['boleto_instrucao2'] = "PARA PAGAMENTO 2 até Amanhã Não cobre!" #dados['boleto_instrucao3'] = "PARA PAGAMENTO 3 até Depois de amanhã, OK, não cobre." #dados['boleto_instrucao4'] = "PARA PAGAMENTO 4 até 04/xx/xxxx de 4 dias atrás COBRAR O VALOR DE: R$ 01,00" #dados['boleto_instrucao5'] = "PARA PAGAMENTO 5 até 05/xx/xxxx COBRAR O VALOR DE: R$ 02,00" #dados['boleto_instrucao6'] = "PARA PAGAMENTO 6 até 06/xx/xxxx COBRAR O VALOR DE: R$ 03,00" #dados['boleto_instrucao7'] = "PARA PAGAMENTO 7 até xx/xx/xxxx COBRAR O VALOR QUE VOCÊ QUISER!" #dados['boleto_instrucao8'] = "APÓS o Vencimento, Pagável Somente na Rede X." for p in dados.keys(): dados[p] = smart_str(dados[p]) url = URL_GERADOR_BOLETOS data = urllib.urlencode(dados) #print datetime.now().strftime("%y-%m-%d %H:%M:%S") #raise Exception(url) req = urllib2.Request(url, data) #if the data parameter is here, it's a POST request response = urllib2.urlopen(req) the_page = response.read() if len(the_page) == 40: inv.billet_url = url+the_page inv.save() return url+the_page else: return False
def run(self, **kwargs): logger = self.get_logger(**kwargs) logger.info("CheckAndCharge Started.") orgs = Organization.objects.filter( organization__isnull=True, active=True) # for p in Invoice.objects.all(): # p.expiry_date = p.expiry_date # p.save() ''' INVOICE_STATUS_CHOICES = ( (1, _('Emitido')), (2, _('Pago')), (3, _('Excluido')), ) INVOICE_TYPES = ( (1, _('Inscription')), (2, _('Monthly fee')), ) ''' for org in orgs: last_invoice = org.current_invoice # correcao temporaria para evitar problemas no desenvolvimento try: len(last_invoice.status) except: last_invoice = Invoice.objects.filter( organization=org).order_by('-date')[0] if last_invoice.status == 1: # check if the last invoice isn't paid check = last_invoice.due_date > datetime.now() # check if the invoice is not due elif last_invoice.status == 2: # check if this company last paid invoice is going to expire in # ten days check = last_invoice.expiry_date < datetime.today() + timedelta(days=10) else: check = True if check: # no need to do anything with this organization continue else: # send an email to the person responsible for the organization with a new billet to pay person = ProfessionalResponsible.objects.get( organization=org).person user = person.user # create the new invoice inv = Invoice() inv.organization = org # prefered plan pplan = org.prefered_plan # verifica se ha um invoice passado para extrair um plano, caso nao, # atribui um plano de um mes para a quantia de funcionarios # cadastrados staff_count = org.person_set.all().count() if pplan is not None: inv.plan = pplan elif last_invoice.plan is not None: inv.plan = last_invoice.plan else: inv.plan = None # define a data de vencimento(pagamento) do boleto dday = org.default_payment_day inv.due_date = last_invoice.expiry_date.replace(day=dday) # define a data de vencimento(acesso ao sistema) do boleto pplan = org.prefered_plan inv.expiry_date = inv.due_date + \ relativedelta(months=pplan.duration) inv.save() org.current_invoice = inv org.save() url_boleto = gera_boleto_bradesco(user.id, inv) email = user.email if email is not None and len(email) > 0: bcc_list = ['*****@*****.**', user.email] else: bcc_list = ['*****@*****.**'] msg = EmailMessage() msg.subject = 'Teste: Cobrança de mensalidade' #temp = request.META # if request is None: msg.body = render_to_string( 'async_tasks/email_cobranca_mensalidade.html', locals()) # else: # from celery.schedules import discard_all # discard_all() # return render_to_response('async_tasks/email_cobranca_mensalidade.html', locals()) # msg.from = 'GestoPSI <*****@*****.**>' msg.to = ['*****@*****.**', ] msg.bcc = bcc_list msg.content_subtype = "html" # Main content is now text/html msg.send() logger.info("CheckAndCharge Finished.\n\n")
def run(self, **kwargs): logger = self.get_logger(**kwargs) logger.info("CheckAndCharge Started.") orgs = Organization.objects.filter(organization__isnull=True, active=True) #for p in Invoice.objects.all(): # p.expiry_date = p.expiry_date # p.save() ''' INVOICE_STATUS_CHOICES = ( (1, _('Emitido')), (2, _('Pago')), (3, _('Excluido')), ) INVOICE_TYPES = ( (1, _('Inscription')), (2, _('Monthly fee')), ) ''' for org in orgs: last_invoice = org.current_invoice #correcao temporaria para evitar problemas no desenvolvimento try: len(last_invoice.status) except: last_invoice = Invoice.objects.filter( organization=org).order_by('-date')[0] if last_invoice.status == 1: #check if the last invoice isn't paid check = last_invoice.due_date > datetime.now( ) #check if the invoice is not due elif last_invoice.status == 2: #check if this company last paid invoice is going to expire in ten days check = last_invoice.expiry_date < datetime.today( ) + timedelta(days=10) else: check = True if check: #no need to do anything with this organization continue else: #send an email to the person responsible for the organization with a new billet to pay person = ProfessionalResponsible.objects.get( organization=org).person user = person.user #create the new invoice inv = Invoice() inv.organization = org #prefered plan pplan = org.prefered_plan #verifica se ha um invoice passado para extrair um plano, caso nao, #atribui um plano de um mes para a quantia de funcionarios cadastrados staff_count = org.person_set.all().count() if pplan is not None: inv.plan = pplan elif last_invoice.plan is not None: inv.plan = last_invoice.plan else: inv.plan = None #define a data de vencimento(pagamento) do boleto dday = org.default_payment_day inv.due_date = last_invoice.expiry_date.replace(day=dday) #define a data de vencimento(acesso ao sistema) do boleto pplan = org.prefered_plan inv.expiry_date = inv.due_date + relativedelta( months=pplan.duration) inv.save() org.current_invoice = inv org.save() url_boleto = gera_boleto_bradesco(user.id, inv) email = user.email if email is not None and len(email) > 0: bcc_list = ['*****@*****.**', user.email] else: bcc_list = ['*****@*****.**'] msg = EmailMessage() msg.subject = 'Teste: Cobrança de mensalidade' #temp = request.META #if request is None: msg.body = render_to_string( 'async_tasks/email_cobranca_mensalidade.html', locals()) #else: # from celery.schedules import discard_all # discard_all() # return render_to_response('async_tasks/email_cobranca_mensalidade.html', locals()) #msg.from = 'GestoPSI <*****@*****.**>' msg.to = [ '*****@*****.**', ] msg.bcc = bcc_list msg.content_subtype = "html" # Main content is now text/html msg.send() logger.info("CheckAndCharge Finished.\n\n")