def Imprimir_Recibo(self, key, window_id): template = 'recibo' record = get_records_to_print(key=key, model=self) cliente = Terceiro().get(key=record['cliente'][0])[0] try: from my_contacto import Contacto except: from contacto import Contacto moradas = Contacto(where="terceiro='{cliente}'".format(cliente=cliente['id'])).get() if len(moradas) != 0: moradas=moradas[0] else: moradas = {'morada':None} if moradas['morada']: record['morada'] = moradas['morada'] else: record['morada'] = '' if cliente['nif']: record['cliente_nif'] = cliente['nif'] else: record['cliente_nif'] = '' caixas = [] for pagamento in record['pagamentos']: caixas.append(pagamento['caixa'][0]) sql = """ SELECT id, data_inicial FROM caixa WHERE id {caixas}""".format(caixas = to_tuple(caixas)) lista_datas_de_caixa = run_sql(sql) datas_de_caixa = {} for data in lista_datas_de_caixa: datas_de_caixa[str(data['id'])] = data['data_inicial'] for pagamento in record['pagamentos']: pagamento['data'] = datas_de_caixa[pagamento['caixa'][0]] return Report(record=record, report_template=template).show()
def Imprimir(self, key, window_id): template = 'factura_cli' record = get_records_to_print(key=key, model=self) #print(record) cliente = Terceiro().get(key=record['cliente'][0])[0] try: from my_contacto import Contacto except: from contacto import Contacto moradas = Contacto(where="terceiro='{cliente}'".format(cliente=cliente['id'])).get() if len(moradas) != 0: moradas=moradas[0] else: moradas = {'morada':None} if moradas['morada']: record['morada'] = moradas['morada'] else: record['morada'] = '' if cliente['nif']: record['cliente_nif'] = cliente['nif'] else: record['cliente_nif'] = '' if to_decimal(record['numero']) <10: record['numero']= str('00'+record['numero']) elif to_decimal(record['numero'])>9 & to_decimal(record['numero'])<100: record['numero']= str('0'+record['numero']) return Report(record=record, report_template=template).show()
def Facturar(self, key, window_id): #Gera Factura em rascunho!!! #Aqui se o a entrega estiver paga a factura deve de alguma forma reflectir isso ou seja deve estar logo como paga self.kargs = get_model_record(model = self, key = key) self.kargs['estado'] = 'Facturado' try: from my_factura_cli import FacturaCliente except: from factura_cli import FacturaCliente factura = FacturaCliente(data = self.kargs['data'], notas = self.kargs['notas'], entrega = self.kargs['id'], cliente = self.kargs['cliente'], residual = str(to_decimal('0')), estado = 'Rascunho', vendedor = self.kargs['user'], user = self.kargs['user']).put() self.kargs['factura'] = factura #Muda o movimento de não active para active try: from my_movimento import Movimento except: from movimento import Movimento movimentos = Movimento(where = "documento = 'entrega' and num_doc = {num_doc} ".format(num_doc = self.kargs['id'])).get() if movimentos: for movimento in movimentos: movimento['active'] = 'True' movimento['user'] = self.kargs['user'] Movimento(**movimento).put() #Valida se o cliente é sujeito a iva try: from my_terceiro import Terceiro except: from terceiro import Terceiro sujeito_iva = Terceiro(where="id=" + str(self.kargs['cliente'])).get()[0]['sujeito_iva'] try: from my_linha_entrega import LinhaEntrega except: from linha_entrega import LinhaEntrega record_lines = LinhaEntrega(where = "entrega = '{entrega}'".format(entrega = self.kargs['id'])).get() if record_lines: try: from my_produto import Produto except: from produto import Produto try: from my_linha_factura_cli import LinhaFacturaCliente except: from linha_factura_cli import LinhaFacturaCliente for line in record_lines: quantidade = to_decimal(line['quantidade']) product = Produto().get(key = line['produto'])[0] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = to_decimal(0) total_sem_iva = line['valor_total']/(1+taxa_iva) iva = taxa_iva LinhaFacturaCliente(factura_cli = factura, unidade = line['unidade'], valor_unitario = line['valor_unitario'], produto = line['produto'], quantidade = quantidade, valor_total = line['valor_total'], desconto = line['desconto'], iva = iva, user = self.kargs['user']).put() self.put() ctx_dict = get_context(window_id) ctx_dict['main_key'] = self.kargs['id'] set_context(window_id, ctx_dict) return form_edit(window_id = window_id).show()
def Facturar(self, key, window_id): #Gera Factura em rascunho!!! #Altera o movimento contabilistico para active!!! record_id = key record = model.get(key=record_id)[0] record['user'] = session.get('user', None) record['estado'] = 'Facturado' from factura_cli import FacturaCliente factura = FacturaCliente(data=record['data'], notas=record['notas'], talao=record['id'], cliente=record['cliente'], residual=str(to_decimal('0')), estado='Rascunho', user=session.get('user', None)).put() record['factura'] = factura Talao(**record).put() #Muda o movimento de não active para active from movimento import Movimento movimentos = Movimento( where="documento='talao'and num_doc={num_doc} ".format( num_doc=record['id'])).get() if movimentos: for movimento in movimentos: movimento['active'] = 'True' movimento['user'] = session.get('user', None) Movimento(**movimento).put() #Valida se o cliente é sujeito a iva from terceiro import Terceiro sujeito_iva = Terceiro(where="id='{cliente}'".format( cliente=str(record['cliente']))).get()[1][0]['sujeito_iva'] from linha_talao import LinhaTalao record_lines = LinhaTalao(where="talao = '{talao}'".format( talao=record['id'])).get() if record_lines: from linha_factura_cli import LinhaFacturaCliente for line in record_lines: quantidade = to_decimal(str(line['quantidade'])) LinhaFacturaCliente(factura_cli=factura, produto=line['produto'], quantidade=quantidade, valor_total=line['valor_total'], desconto=line['desconto'], iva=line['iva'], valor_unitario=line['valor_unitario'], ean=line['ean'], user=session.get('user', None)).put() return form_edit(key=key, window_id=window_id)
def Confirmar(self, key, window_id): # Gera movimento contabilistico (conta de receitas contra conta de terceiros) if key == 'None': #Grava o registo se ainda não estiver guardado key = get_actions(request=bottle.request, action='save', key=None, model_name=model.__model_name__, title=model.__title__, name=model.__name__, internal=True) record_id = key record = model.get(key=record_id)[0] record['user'] = session['user'] record['estado'] = 'Confirmado' record['numero'] = base_models.Sequence().get_sequence( 'leitura_tecnica') from diario import Diario diario = Diario(where="tipo='vendas'").get()[0]['id'] periodo = None from periodo import Periodo periodos = Periodo().get() for p in periodos: lista_datas = generate_dates(start_date=p['data_inicial'], end_date=p['data_final']) if str(format_date(record['data'])) in lista_datas: periodo = p['id'] if not periodo: return error_message( 'não existe periodo definido para a data em questão! \n') #Valida se o cliente é sujeito a iva from terceiro import Terceiro terceiro = Terceiro(where="id='{cliente}'".format( cliente=record['cliente'])).get()[0] sujeito_iva = terceiro['sujeito_iva'] conta_terceiro = terceiro['a_receber'] from movimento import Movimento movimento = Movimento( data=record['data'], numero=base_models.Sequence().get_sequence('movimento'), num_doc=record['numero'], descricao='Nossa Factura', diario=diario, documento='leitura_tecnica', periodo=periodo, estado='Confirmado', user=session['user']).put() record['movimento'] = movimento LeituraTecnica(**record).put() from linha_leitura_tecnica import LinhaLeituraTecnica record_lines = LinhaLeituraTecnica( where="leitura_tecnica = '{factura}'".format( factura=record['id'])).get() if record_lines: from linha_movimento import LinhaMovimento from produto import Produto from familia_produto import FamiliaProduto for line in record_lines: # aqui depois considerar a contabilização do desconto quantidade = float(line['quantidade']) product = Produto().get(key=line['produto'])[0] conta_mercadorias = product['conta_receitas'] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = 0.0 #familia = FamiliaProduto().get(key=product['familia'])[1][0] descricao = product['nome'] total_sem_iva = line['valor_total'] / (1 + taxa_iva) LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_terceiro, quant_debito=quantidade, debito=total_sem_iva, quant_credito=0.0, credito=0.0, user=session['user']).put() LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_receitas, quant_debito=0.0, debito=0.0, quant_credito=quantidade, credito=total_sem_iva, user=session['user']).put() return form_edit(key=key, window_id=window_id) else: return error_message( 'Não pode confirmar facturas sem linhas de factura! \n')
def get_tac(self): return Terceiro().get_tac()
def efectuar_pagamento(self, key, window_id): """Esta acção efectua o pagamento""" active = False record_id = key record = model.get(key=record_id)[0] record['user'] = session['user'] record['estado'] = 'Pago' #Verifica se tem caixa aberta, se não tiver abre #Faz o pagamento em caixa try: from my_caixa import Caixa except: from caixa import Caixa try: from my_linha_caixa import LinhaCaixa except: from linha_caixa import LinhaCaixa try: from my_terminal import Terminal except: from terminal import Terminal terminal = Terminal(where="""name='Esplanada'""").get() if terminal[0] > 0: terminal = terminal[1][0]['id'] caixa = Caixa( where= "estado = 'Aberta' AND terminal='{terminal}' AND data_inicial <= '{today}'" .format(terminal=terminal, today=record['data'])).get() if not caixa: caixa = Caixa(data_inicial=record['data'], hora_inicial=time.strftime('%H:%M:%S'), valor_inicial=0, valor_final=0, estado='Aberta', user=session['user'], vendedor=session['user'], terminal=terminal).put() else: caixa = caixa[0]['id'] if record['factura']: active = True record['estado'] = 'Pago' try: from my_metodo_pagamento import MetodoPagamento except: from metodo_pagamento import MetodoPagamento metodos_pagamento = MetodoPagamento().get_options() first = True total_entregue = to_decimal('0') for metodo in metodos_pagamento: if bottle.request.forms.get(metodo[1]): method = to_decimal(str(bottle.request.forms.get(metodo[1]))) else: method = to_decimal('0') if method > to_decimal('0'): total_entregue += to_decimal( str(bottle.request.forms.get(metodo[1]))) if total_entregue >= to_decimal( str(bottle.request.forms.get('total_a_pagar'))): for metodo in metodos_pagamento: if first == True: default_metodo = metodo first = False if bottle.request.forms.get(metodo[1]): method = to_decimal( str(bottle.request.forms.get(metodo[1]))) else: method = to_decimal('0') if method > to_decimal('0'): linha_caixa = LinhaCaixa( caixa=caixa, descricao='Nosso Talão de Bar', documento='talao_bar', num_doc=record['numero'], valor_documento=to_decimal( str(bottle.request.forms.get('total_a_pagar'))), terceiro=record['cliente'], metodo=metodo[0], entrada=bottle.request.forms.get(metodo[1]), saida=0, active=active, user=session['user']).put() troco = total_entregue - to_decimal( str(bottle.request.forms.get('total_a_pagar'))) if troco > to_decimal('0'): linha_caixa = LinhaCaixa( caixa=caixa, descricao='Nosso Talão de Bar', documento='talao_bar', num_doc=record['numero'], valor_documento=to_decimal( str(bottle.request.forms.get('total_a_pagar'))), terceiro=record['cliente'], metodo=default_metodo[0], entrada=0, saida=troco, active=active, user=session['user']).put() else: troco = to_decimal('0') record['residual'] = to_decimal( str(bottle.request.forms.get( 'total_a_pagar'))) - total_entregue + troco #Faz o lançamento contabilistico se tiver factura como movimento activo, se não como movimento geral #Vê o metodo de pagamento e lança na conta adequada try: from my_diario import Diario except: from diario import Diario diario = Diario(where="tipo='caixa'").get()[0]['id'] periodo = None try: from my_periodo import Periodo except: from periodo import Periodo periodos = Periodo().get() for p in periodos: lista_datas = generate_dates(start_date=p['data_inicial'], end_date=p['data_final']) if str(format_date(record['data'])) in lista_datas: periodo = p['id'] if not periodo: return error_message( 'não existe periodo definido para a data em questão! \n') try: from my_movimento import Movimento except: from movimento import Movimento try: from my_linha_movimento import LinhaMovimento except: from linha_movimento import LinhaMovimento movimento = Movimento( data=record['data'], numero=base_models.Sequence().get_sequence('movimento'), num_doc=record['numero'], descricao='Pagamento de Talão de Bar', diario=diario, documento='talao_bar', periodo=periodo, estado='Rascunho', user=session['user'], active=active).put() TalaoBar(**record).put() try: from my_terceiro import Terceiro except: from terceiro import Terceiro conta_cliente = Terceiro().get( key=record['cliente'])[0]['a_receber'] for metodo in metodos_pagamento: if bottle.request.forms.get(metodo[1]): method = to_decimal( str(bottle.request.forms.get(metodo[1]))) else: method = to_decimal('0') if method > to_decimal('0'): conta_pagamento = MetodoPagamento().get( key=metodo[0])[0]['conta'] LinhaMovimento(movimento=movimento, descricao='Pagamento de Talão de Bar', conta=conta_pagamento, quant_debito=to_decimal('0'), debito=to_decimal( str(bottle.request.forms.get( metodo[1]))), quant_credito=to_decimal('0'), credito=to_decimal('0'), user=session['user']).put() LinhaMovimento(movimento=movimento, descricao='Pagamento de Talão de Bar', conta=conta_cliente, quant_debito=to_decimal('0'), debito=to_decimal('0'), quant_credito=to_decimal('0'), credito=to_decimal( str(bottle.request.forms.get( metodo[1]))), user=session['user']).put() return form_edit(key='None', window_id=window_id) else: return 'Segundo as Regras da Empresa não é possivel receber valores inferiores ao valor a Pagar, Torne a efectuar o pagamento por Favor!' #depois ver a possibilidade de ficar no mesmo sitio
def get_terceiros(self): return Terceiro().get_funcionarios()
def get_clientes(self): return Terceiro().get_clientes()
def put_informacao_modelo(self, key): """metodo que coloca as informações dos anexos no modelo dpr""" self.kargs = get_model_record(model=self, key=key) anexoSal = XMLAnexoSalarioDPR(where="xml_modelo_dpr='{id}'".format( id=key)).get() if anexoSal: self.kargs['g1'] = XMLAnexoSalarioDPR().get_ir_teu( key=anexoSal[0]['id']) anexoForn = XMLAnexoFornecedorDPR(where="xml_modelo_dpr='{id}'".format( id=key)).get() if anexoForn: linhas = XMLLinhaAnexoFornecedorDPR( where="xml_anexo_fornecedor_dpr='{id}'".format( id=anexoForn[0]['id'])).get() for linha in linhas: if linha['tipologia'] in ('B.1', 'B.2', 'B.3', 'B.4', 'B.5'): self.kargs['g2'] = to_decimal( self.kargs['g2']) + to_decimal(linha['ir_teu']) elif linha['tipologia'] in ('C.1', 'C.2', 'C.3', 'C.4'): self.kargs['g3'] = to_decimal( self.kargs['g3']) + to_decimal(linha['ir_teu']) elif linha['tipologia'] in ('D.1', 'D.2'): terceiro = Terceiro( where="nome='{nome}' AND nif='{nif}'".format( nome=linha['designacao'], nif=linha['nif'])).get() if terceiro: if terceiro[0]['tipo_entidade'] == 'pessoa_colectiva': self.kargs['g5'] = to_decimal( self.kargs['g5']) + to_decimal(linha['ir_teu']) else: self.kargs['g4'] = to_decimal( self.kargs['g4']) + to_decimal(linha['ir_teu']) else: self.kargs['g6'] = to_decimal( self.kargs['g6']) + to_decimal(linha['ir_teu']) anexoCli = XMLAnexoClienteDPR(where="xml_modelo_dpr='{id}'".format( id=key)).get() if anexoCli: linhas = XMLLinhaAnexoClienteDPR( where="xml_anexo_cliente_dpr='{id}'".format( id=anexoCli[0]['id'])).get() for linha in linhas: if linha['tipologia'] in ('B.1', 'B.2', 'B.3', 'B.4', 'B.5'): self.kargs['g2'] = to_decimal( self.kargs['g2']) + to_decimal(linha['ir_teu']) elif linha['tipologia'] in ('C.1', 'C.2', 'C.3', 'C.4'): self.kargs['g3'] = to_decimal( self.kargs['g3']) + to_decimal(linha['ir_teu']) elif linha['tipologia'] in ('D.1', 'D.2'): terceiro = Terceiro( where="nome='{nome}' AND nif='{nif}'".format( nome=linha['designacao'], nif=linha['nif'])).get() if terceiro: if terceiro[0]['tipo_entidade'] == 'pessoa_colectiva': self.kargs['g5'] = to_decimal( self.kargs['g5']) + to_decimal(linha['ir_teu']) else: self.kargs['g4'] = to_decimal( self.kargs['g4']) + to_decimal(linha['ir_teu']) else: self.kargs['g6'] = to_decimal( self.kargs['g6']) + to_decimal(linha['ir_teu']) #guardar tudo self.put()
def Gerar_Factura(self, key, window_id): #Gera Factura em rascunho!!! self.kargs = get_model_record(model=self, key=key) self.kargs['estado'] = 'Com Factura' try: from my_factura_cli import FacturaCliente except: from factura_cli import FacturaCliente factura = FacturaCliente(data=self.kargs['data'], notas=self.kargs['notas'], entrega=self.kargs['id'], cliente=self.kargs['cliente'], residual=str(to_decimal('0')), estado='Rascunho', user=self.kargs['user']).put() self.kargs['factura'] = factura #Valida se o cliente é sujeito a iva try: from my_terceiro import Terceiro except: from terceiro import Terceiro sujeito_iva = Terceiro(where="id='{cliente}'".format( cliente=str(self.kargs['cliente']))).get()[0]['sujeito_iva'] try: from my_linha_proforma import LinhaProforma except: from linha_proforma import LinhaProforma record_lines = LinhaProforma(where="proforma = '{proforma}'".format( proforma=self.kargs['id'])).get() if record_lines: try: from my_produto import Produto except: from produto import Produto try: from my_linha_factura_cli import LinhaFacturaCliente except: from linha_factura_cli import LinhaFacturaCliente for line in record_lines: quantidade = to_decimal(line['quantidade']) product = Produto().get(key=line['produto'])[0] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = to_decimal(0) total_sem_iva = line['valor_total'] / (1 + taxa_iva) iva = taxa_iva LinhaFacturaCliente(factura_cli=factura, unidade=line['unidade'], valor_unitario=line['valor_unitario'], produto=line['produto'], quantidade=quantidade, valor_total=line['valor_total'], desconto=line['desconto'], iva=iva, user=self.kargs['user']).put() self.put() ctx_dict = get_context(window_id) ctx_dict['main_key'] = self.kargs['id'] set_context(window_id, ctx_dict) return form_edit(window_id=window_id).show()
def Confirmar(self, key, window_id, internal = False): """Gera movimento contabilistico (conta de receitas contra conta de terceiros)""" #print ('Inicio do confirmar factura_cli') self.kargs = get_model_record(model = self, key = key, force_db = self.__force_db__) if self.kargs['estado'] == 'Rascunho': self.kargs['estado'] = 'Confirmado' self.kargs['residual'] = self.get_total(key = key) if not self.kargs['numero']: self.kargs['numero'] = base_models.Sequence().get_sequence('factura_cli') try: from my_diario import Diario except: from diario import Diario diario = Diario().get_diario(diario = 'vendas') try: from my_periodo import Periodo except: from periodo import Periodo periodo = Periodo().get_periodo(data = self.kargs['data']) #Valida se o cliente é sujeito a iva try: from my_terceiro import Terceiro except: from terceiro import Terceiro terceiro = Terceiro().get(key = self.kargs['cliente'])[0] sujeito_iva = terceiro['sujeito_iva'] conta_terceiro = terceiro['a_receber'] try: from my_movimento import Movimento except: from movimento import Movimento movimento = Movimento(data = self.kargs['data'], numero = base_models.Sequence().get_sequence('movimento'), num_doc = self.kargs['numero'], descricao = 'Nossa Factura', diario = diario, documento = 'factura_cli', periodo = periodo, estado = 'Confirmado', user = self.kargs['user']).put() #self.kargs['movimento'] = movimento try: from my_linha_factura_cli import LinhaFacturaCliente except: from linha_factura_cli import LinhaFacturaCliente record_lines = LinhaFacturaCliente(where = "factura_cli = '{factura}'".format(factura = self.kargs['id'])).get() if record_lines: try: from my_linha_movimento import LinhaMovimento except: from linha_movimento import LinhaMovimento try: from my_produto import Produto except: from produto import Produto try: from my_familia_produto import FamiliaProduto except: from familia_produto import FamiliaProduto for line in record_lines: # aqui depois considerar a contabilização do desconto quantidade = to_decimal(line['quantidade']) product = Produto().get(key = line['produto'])[0] contas = Produto().get_accounts(line['produto']) #print (contas) conta_receitas = contas['conta_receitas'] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = to_decimal(0) #familia = FamiliaProduto().get(key=product['familia'])[0] descricao = product['nome'] total_sem_iva = line['valor_total']#/(1+taxa_iva) #fazer o lancamento das receitas mas tambem do iva LinhaMovimento(movimento = movimento, descricao = descricao, conta = conta_terceiro, quant_debito = quantidade, debito = total_sem_iva, quant_credito = to_decimal(0), credito = to_decimal(0), user = self.kargs['user']).put() LinhaMovimento(movimento = movimento, descricao = descricao, conta = conta_receitas, quant_debito = to_decimal(0), debito = to_decimal(0), quant_credito = quantidade, credito = total_sem_iva, user = self.kargs['user']).put() self.put() ctx_dict = get_context(window_id) ctx_dict['main_key'] = self.kargs['id'] set_context(window_id, ctx_dict) result = form_edit(window_id = window_id).show() else: result = error_message('Não pode confirmar facturas sem linhas de factura! \n') if not internal: #não foi chamado pela side_bar e por isso deverá devolver o form, se vem do side_bar não tem necessidade return result
def efectuar_pagamento(self, key, window_id): """Esta acção efectua o pagamento""" record_id = key self.kargs = self.get(key=record_id)[0] self.kargs['user'] = bottle.request.session['user'] self.kargs['id'] = key #Verifica se tem caixa aberta, se não tiver abre e deve atribuir um numero de caixa de imediato para que dessa forma possa constar no recibo! #Faz o pagamento em caixa try: from my_caixa import Caixa except: from caixa import Caixa try: from my_linha_caixa import LinhaCaixa except: from linha_caixa import LinhaCaixa caixa = Caixa(where="estado = 'Aberta' AND vendedor={user}".format(user=self.kargs['user'])).get() if not caixa: caixa = Caixa(data_inicial=datetime.date.today(), hora_inicial=time.strftime('%H:%M'), valor_inicial=0, valor_final=0 , estado='Aberta', terminal=get_terminal(bottle.request.session['terminal']), user=self.kargs['user'], vendedor=self.kargs['user'], numero=base_models.Sequence().get_sequence('caixa')).put() else: caixa = caixa[0]['id'] try: from my_metodo_pagamento import MetodoPagamento except: from metodo_pagamento import MetodoPagamento metodos_pagamento = MetodoPagamento().get_options() first = True total_entregue = to_decimal('0') for metodo in metodos_pagamento: if bottle.request.forms.get(metodo[1]): method = to_decimal(str(bottle.request.forms.get(metodo[1]))) else: method = to_decimal('0') if method > to_decimal('0'): total_entregue += to_decimal(str(bottle.request.forms.get(metodo[1]))) for metodo in metodos_pagamento: if first == True: default_metodo = metodo first = False if bottle.request.forms.get(metodo[1]): method = to_decimal(str(bottle.request.forms.get(metodo[1]))) else: method = to_decimal(0) if method > to_decimal(0): linha_caixa = LinhaCaixa(caixa=caixa, descricao='Nossa Factura ao Cliente', documento='factura_cli', num_doc=self.kargs['numero'], valor_documento=to_decimal(bottle.request.forms.get('total_a_pagar')), terceiro=self.kargs['cliente'], metodo=metodo[0], entrada=bottle.request.forms.get(metodo[1]), saida=0, user=self.kargs['user']).put() troco = total_entregue - to_decimal(bottle.request.forms.get('total_a_pagar')) if troco > to_decimal(0): linha_caixa = LinhaCaixa(caixa=caixa, descricao='Nossa Factura ao Cliente', documento='factura_cli', num_doc=self.kargs['numero'], valor_documento=to_decimal(bottle.request.forms.get('total_a_pagar')), terceiro=self.kargs['cliente'], metodo=default_metodo[0], entrada=0, saida=troco, user=self.kargs['user']).put() else: troco = to_decimal(0) self.kargs['residual'] = to_decimal(bottle.request.forms.get('total_a_pagar')) - total_entregue + troco #Faz o lançamento contabilistico #Vê o metodo de pagamento e lança na conta adequada try: from my_diario import Diario except: from diario import Diario diario = Diario(where="tipo='caixa'").get()[0]['id'] periodo = None try: from my_periodo import Periodo except: from periodo import Periodo periodos = Periodo().get()[1] for p in periodos: lista_datas = generate_dates(start_date=p['data_inicial'], end_date=p['data_final']) if str(format_date(self.kargs['data'])) in lista_datas: periodo = p['id'] try: from my_movimento import Movimento except: from movimento import Movimento try: from my_linha_movimento import LinhaMovimento except: from linha_movimento import LinhaMovimento movimento = Movimento(data= datetime.date.today(), numero=base_models.Sequence().get_sequence('movimento'), num_doc=self.kargs['numero'], descricao='Pagamento de Factura', diario=diario, documento='factura_cli', periodo=periodo, estado='Rascunho', user=self.kargs['user']).put() if self.kargs['residual'] <= 0: self.kargs['estado'] = 'Pago' self.put() try: from my_terceiro import Terceiro except: from terceiro import Terceiro conta_cliente = Terceiro().get(key=self.kargs['cliente'])[0]['a_receber'] for metodo in metodos_pagamento: if bottle.request.forms.get(metodo[1]): method = to_decimal(bottle.request.forms.get(metodo[1])) else: method = to_decimal(0) if method > to_decimal(0): conta_pagamento = MetodoPagamento().get(key=metodo[0])[0]['conta'] LinhaMovimento(movimento=movimento, descricao='Pagamento de Nota de Entrega', conta=conta_pagamento, quant_debito=to_decimal(0), debito=to_decimal(bottle.request.forms.get(metodo[1])), quant_credito=to_decimal(0), credito=to_decimal(0), user=self.kargs['user']).put() LinhaMovimento(movimento=movimento, descricao='Pagamento de Nota de Entrega', conta=conta_cliente, quant_debito=to_decimal(0), debito=to_decimal(0), quant_credito=to_decimal(0), credito=to_decimal(bottle.request.forms.get(metodo[1])), user=self.kargs['user']).put() return form_edit(window_id=window_id).show()
def get_fornecedores(self): return Terceiro().get_fornecedores()
def Cancelar(self, key, window_id): #Estorna movimento contabilistico #extorna caso confirmada ou simplesmente cancela se em rascunho record_id = key record = model.get(key=record_id)[0] record['user'] = session['user'] record['estado'] = 'Cancelado' from diario import Diario diario = Diario(where="tipo='vendas'").get()[0]['id'] periodo = None from periodo import Periodo periodos = Periodo().get() for p in periodos: lista_datas = generate_dates(start_date=p['data_inicial'], end_date=p['data_final']) if str(format_date(str(datetime.date.today()))) in lista_datas: periodo = p['id'] if not periodo: return error_message( 'não existe periodo definido para o data em questão! \n') #Valida se o cliente é sujeito a iva from terceiro import Terceiro terceiro = Terceiro(where="id='{cliente}'".format( cliente=record['cliente'])).get()[0] sujeito_iva = terceiro['sujeito_iva'] conta_terceiro = terceiro['a_receber'] #Tanto no movimento como no stock eu poderei ter vários movimentos, por exemplo o movimento em si e a anulação, além disso teremos que ter reconciliação de movimentos. from movimento import Movimento movimento = Movimento( data=datetime.date.today(), numero=base_models.Sequence().get_sequence('movimento'), num_doc=record['numero'], descricao='Anulação de Nossa Factura', documento='leitura_tecnica', diario=diario, periodo=periodo, estado='Confirmado', user=session['user']).put() record['movimento'] = movimento LeituraTecnica(**record).put() from linha_leitura_tecnica import LinhaLeituraTecnica record_lines = LinhaLeituraTecnica( where="leitura_tecnica = '{factura}'".format( factura=record['id'])).get() if record_lines: from linha_movimento import LinhaMovimento from produto import Produto from familia_produto import FamiliaProduto for line in record_lines: # aqui depois considerar a contabilização do desconto quantidade = float(line['quantidade']) product = Produto().get(key=line['produto'])[0] conta_receitas = product['conta_receitas'] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = 0.0 descricao = product['nome'] total_sem_iva = line['valor_total'] / (1 + taxa_iva) LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_receitas, quant_debito=quantidade, debito=total_sem_iva, quant_credito=0.0, credito=0.0, user=session['user']).put() LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_terceiro, quant_debito=0.0, debito=0.0, quant_credito=quantidade, credito=total_sem_iva, user=session['user']).put() return form_edit(key=key, window_id=window_id)
def get_informacao_salario(self, key): self.kargs = get_model_record(model=self, key=key) salarios = RHFolhaSalario( where= "to_char(date_create,'YYYY-MM')='{ano}-{periodo}' AND (estado='Recibos Confirmado' OR estado='Pago')" .format(ano=self.kargs['ano'], periodo=self.kargs['periodo'])).get() if salarios: #guadar o anexo_salario content = { 'user': self.kargs['user'], 'xml_modelo_dpr': str(key), 'nome': erp_config.enterprise, 'nif': erp_config.nif, 'ano': self.kargs['ano'], 'periodo': self.kargs['periodo'], 'cd_af': self.kargs['cd_af'], 'dec': self.kargs['dec'], 'dt_emissao': self.kargs['dt_emissao'] } id_anexo = XMLAnexoSalarioDPR(**content).put() for salario in salarios: recibos = RHReciboSalario( where= "rh_folha_salario='{id}' AND (estado='Confirmado' OR estado='Pago')" .format(id=salario['id'])).get() if recibos: for recibo in recibos: terceiro = Terceiro(where="id='{ter}'".format( ter=recibo['terceiro'])).get() content = { 'user': self.kargs['user'], 'xml_anexo_salario_dpr': str(id_anexo), 'designacao': terceiro[0]['nome'], 'nif': terceiro[0]['nif'], 'periodo': "{ano}-{mes}".format(ano=recibo['ano'], mes=recibo['periodo']), 'base': int(RHReciboSalario().get_salario( key=recibo['id'])), 'aces': int(RHReciboSalario().get_rendimentosAcessorios( key=recibo['id'])), 'isento': int(RHReciboSalario().get_rendimentosIsentos( key=recibo['id'])), 'trib': int(RHReciboSalario().get_rendimentosTributaveis( key=recibo['id'])), 'tipologia': self.get_tipologiaFuncionario( tipoFunc=recibo['tipo_funcionario']), 'ir_teu': int(RHReciboSalario().get_retencao( key=recibo['id'])), 'inps': int(RHReciboSalario().get_segurancaSocial( key=recibo['id'])), 'outros': int(RHReciboSalario().get_outrosRetencoes( key=recibo['id'])), 'tp_oper': self.kargs['tipo_operacao'] } XMLLinhaAnexoSalarioDPR(**content).put()
def Confirmar(self, key, window_id): # Gera movimento contabilistico (conta de mercadorias contra conta de gastos) # Gera movimento de Stock (sai de armazem por contrapartida de cliente) #print (key) if key in ['None', None]: key = get_actions(action='save', key=None, model_name=model.__model_name__, internal=True) #print (key) record_id = key record = model.get(key=record_id)[0] record['user'] = session.get('user', None) record['estado'] = 'Confirmado' record['numero'] = base_models.Sequence().get_sequence('talao') record['residual'] = model.get_total(key=record_id) from diario import Diario diario = Diario(where="tipo='stock'").get()[0]['id'] periodo = None from periodo import Periodo periodos = Periodo().get() for p in periodos: lista_datas = generate_dates(start_date=p['data_inicial'], end_date=p['data_final']) if str(format_date(record['data'])) in lista_datas: periodo = p['id'] from armazem import Armazem armazem_cliente = Armazem(where="tipo='cliente'").get()[0]['id'] #Valida se o cliente é sujeito a iva from terceiro import Terceiro sujeito_iva = Terceiro(where="id='{cliente}'".format( cliente=str(record['cliente']))).get()[0]['sujeito_iva'] from movimento import Movimento movimento = Movimento( data=record['data'], numero=base_models.Sequence().get_sequence('movimento'), num_doc=record['numero'], descricao='Nosso Talão de Venda', diario=diario, documento='talao', periodo=periodo, estado='Confirmado', user=session.get('user', None), active=False).put() from stock import Stock stock = Stock(data=record['data'], numero=base_models.Sequence().get_sequence('stock'), num_doc=record['numero'], descricao='Nosso Talão de Venda', documento='talao', periodo=periodo, estado='Confirmado', user=session.get('user', None)).put() Talao(**record).put() from linha_talao import LinhaTalao record_lines = LinhaTalao(where="talao = '{talao}'".format( talao=record['id'])).get() if record_lines: from linha_movimento import LinhaMovimento from linha_stock import LinhaStock from produto import Produto from familia_produto import FamiliaProduto for line in record_lines: # aqui depois considerar a contabilização do desconto # tambem depois considerar a verificação se o total está bem calculado e logs se o preço unitário for modificado quantidade = to_decimal(str(line['quantidade'])) product = Produto().get(key=line['produto'])[0] contas = Produto().get_accounts(line['produto']) conta_mercadorias = contas['conta_mercadorias'] conta_gastos = contas['conta_gastos'] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = to_decimal('0') armazem_vendas = None familia = FamiliaProduto().get(key=product['familia']) if familia: familia = familia[0] if familia['armazem_vendas']: armazem_vendas = familia['armazem_vendas'] descricao = product['nome'] total_sem_iva = line['valor_total'] / (1 + taxa_iva) LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_gastos, quant_debito=quantidade, debito=line['valor_total'], quant_credito=to_decimal('0'), credito=to_decimal('0'), user=session.get('user', None)).put() LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_mercadorias, quant_debito=to_decimal('0'), debito=to_decimal('0'), quant_credito=quantidade, credito=line['valor_total'], user=session.get('user', None)).put() LinhaStock(stock=stock, descricao=descricao, produto=line['produto'], armazem=armazem_vendas, quant_saida=quantidade, quant_entrada=to_decimal('0'), user=session.get('user', None)).put() LinhaStock(stock=stock, descricao=descricao, produto=line['produto'], armazem=armazem_cliente, quant_saida=to_decimal('0'), quant_entrada=quantidade, user=session.get('user', None)).put() return form_edit(key=key, window_id=window_id) else: return error_message( 'Não pode confirmar talões sem linhas de Talão! \n')
def get_informacao_fornecedor(self, key): self.kargs = get_model_record(model=self, key=key) if self.kargs['forn'] == '1': facturas = FacturaFornecedor( where= "retencao='SIM' AND to_char(date_create,'YYYY-MM')='{ano}-{mes}'" .format(ano=self.kargs['ano'], mes=self.kargs['periodo'])).get() if facturas: print("\n\n\n\nRRRRRRRRRRRRRRRRRRRRRR\n\n", facturas, "\nRRRRRRRRRRRRRRRRRRRRR\n\n\n\n") content = { 'user': self.kargs['user'], 'xml_modelo_dpr': str(key), 'estado': 'Gerado', 'nome': erp_config.enterprise, 'nif': erp_config.nif, 'ano': self.kargs['ano'], 'periodo': self.kargs['periodo'], 'cd_af': self.kargs['cd_af'], 'dec': self.kargs['dec'], 'dt_emissao': self.kargs['dt_emissao'] } id_anexo = XMLAnexoFornecedorDPR(**content).put() for factura in facturas: terceiro = Terceiro(where="id='{id}'".format( id=factura['fornecedor'])).get() if terceiro: terceiro = terceiro[0] linhas = LinhaFacturaFornecedor( where="factura_forn='{id}'".format( id=factura['id'])).get() if linhas: produto = Produto(where="id='{id}'".format( id=linhas[0]['produto'])).get() if produto: content = { 'user': self.kargs['user'], 'xml_anexo_fornecedor_dpr': str(id_anexo), 'origem': terceiro['origem'], 'designacao': terceiro['nome'], 'nif': terceiro['nif'], 'tp_doc': 'FT', 'serie': factura['serie'], 'num_doc': factura['numero'], 'dt_recibo': factura['data'], 'vl_recibo': factura['total'], 'tipologia': self.get_tipologiaCliFornecedor( rendimento=produto[0]['tipologia'], entidade=terceiro['tipo_entidade']), 'tx_ret': int(to_decimal(factura['taxa_retencao'])), 'ir_teu': factura['valor_retido'], 'tp_oper': self.kargs['tipo_operacao'] } XMLLinhaAnexoFornecedorDPR(**content).put()
def Confirmar(self, key, window_id): # Gera movimento contabilistico (conta de mercadorias contra conta de gastos) # Gera movimento de Stock (sai de armazem por contrapartida de cliente) # if key in ['None', None]: # m_action = model_action(obj=self) # key = m_action.save(key=None, internal=True) self.kargs = get_model_record(model=self, key=key) self.kargs['estado'] = 'Confirmado' self.kargs['residual'] = self.get_total(key=key) if not self.kargs['numero']: self.kargs['numero'] = base_models.Sequence().get_sequence('entrega') try: from my_diario import Diario except: from diario import Diario diario = Diario().get_diario(diario = 'stock') try: from my_periodo import Periodo except: from periodo import Periodo periodo = Periodo().get_periodo(data = self.kargs['data']) try: from my_armazem import Armazem except: from armazem import Armazem armazem_cliente = Armazem(where = "tipo = 'cliente'").get()[0]['id'] #Valida se o cliente é sujeito a iva try: from my_terceiro import Terceiro except: from terceiro import Terceiro terceiro = Terceiro().get(key = self.kargs['cliente'])[0] sujeito_iva = terceiro['sujeito_iva'] conta_terceiro = terceiro['a_receber'] try: from my_movimento import Movimento except: from movimento import Movimento movimento = Movimento(data = self.kargs['data'], numero = base_models.Sequence().get_sequence('movimento'), num_doc = self.kargs['numero'], descricao = 'Nossa Nota de Entrega', diario = diario, documento = 'entrega', periodo = periodo, estado = 'Rascunho', user = self.kargs['user'], active = False).put() try: from my_stock import Stock except: from stock import Stock stock = Stock(data = self.kargs['data'], numero = base_models.Sequence().get_sequence('stock'), num_doc = self.kargs['numero'], descricao = 'Nossa Nota de Entrega', documento = 'entrega', periodo = periodo, estado = 'Confirmado', user = self.kargs['user']).put() try: from my_linha_entrega import LinhaEntrega except: from linha_entrega import LinhaEntrega record_lines = LinhaEntrega(where = "entrega = '{entrega}'".format(entrega = self.kargs['id'])).get() if record_lines: try: from my_linha_movimento import LinhaMovimento except: from linha_movimento import LinhaMovimento try: from my_linha_stock import LinhaStock except: from linha_stock import LinhaStock try: from my_produto import Produto except: from produto import Produto try: from my_familia_produto import FamiliaProduto except: from familia_produto import FamiliaProduto for line in record_lines: # aqui depois considerar a contabilização do desconto e do iva quantidade = line['quantidade'] product = Produto().get(key = line['produto'])[0] contas = Produto().get_accounts(line['produto']) conta_mercadorias = contas['conta_mercadorias'] conta_gastos = contas['conta_gastos'] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = to_decimal('0') armazem_vendas = None familia = FamiliaProduto().get(key = product['familia']) if familia: familia = familia[0] if familia['armazem_vendas']: armazem_vendas = familia['armazem_vendas'] descricao = product['nome'] total_sem_iva = line['valor_total']/(1+taxa_iva) LinhaMovimento(movimento = movimento, descricao = descricao, conta = conta_gastos, quant_debito = quantidade, debito = line['valor_total'], quant_credito = to_decimal('0'), credito = to_decimal('0'), user = self.kargs['user']).put() LinhaMovimento(movimento = movimento, descricao = descricao, conta = conta_mercadorias, quant_debito = to_decimal('0'), debito = to_decimal('0'), quant_credito = quantidade, credito = line['valor_total'], user = self.kargs['user']).put() LinhaStock(stock = stock, descricao = descricao, produto = line['produto'], armazem = armazem_vendas, quant_saida = quantidade, quant_entrada = to_decimal('0'), user = self.kargs['user']).put() LinhaStock(stock = stock, descricao = descricao, produto = line['produto'], armazem = armazem_cliente, quant_saida = to_decimal('0'), quant_entrada = quantidade, user = self.kargs['user']).put() self.put() ctx_dict = get_context(window_id) ctx_dict['main_key'] = self.kargs['id'] set_context(window_id, ctx_dict) return form_edit(window_id = window_id).show() else: return error_message('Não pode confirmar entregas sem linhas de Entrega! \n')
def get_fornecedores(self): #print('estou em get_fornecedores do factura fornecedor') return Terceiro().get_fornecedores()
def efectuar_pagamento(self, key, window_id): """Esta acção efectua o pagamento""" self.kargs = get_model_record(model = self, key = key, force_db = True) self.kargs['estado'] = 'Pago' #print (self.kargs, self) #Verifica se tem caixa aberta, se não tiver abre #Faz o pagamento em caixa #print ('inicio do efectuar pagamento') try: from my_caixa import Caixa except: from caixa import Caixa try: from my_linha_caixa import LinhaCaixa except: from linha_caixa import LinhaCaixa #print ('1') try: from my_metodo_pagamento import MetodoPagamento except: from metodo_pagamento import MetodoPagamento metodos_pagamento = MetodoPagamento().get_options() first = True total_entregue = to_decimal('0') #print ('1.1') for metodo in metodos_pagamento: if bottle.request.forms.get(metodo[1]): method = to_decimal(str(bottle.request.forms.get(metodo[1]))) else: method = to_decimal('0') if method > to_decimal('0'): total_entregue += to_decimal(str(bottle.request.forms.get(metodo[1]))) #print ('1.2') if total_entregue >= to_decimal(str(bottle.request.forms.get('total_a_pagar'))): caixa = Caixa(where = "estado = 'Aberta' AND vendedor = '{user}'".format(user = self.kargs['user'])).get() if not caixa: caixa = Caixa(data_inicial = datetime.date.today(), hora_inicial = time.strftime('%H:%M'), valor_inicial = 0, valor_final = 0 , estado = 'Aberta', terminal = get_terminal(bottle.request.session['terminal']), user = self.kargs['user'], vendedor = self.kargs['user'], numero = base_models.Sequence().get_sequence('caixa')).put() else: caixa = caixa[0]['id'] for metodo in metodos_pagamento: if first == True: default_metodo = metodo first = False if bottle.request.forms.get(metodo[1]): method = to_decimal(str(bottle.request.forms.get(metodo[1]))) else: method = to_decimal(0) if method > to_decimal(0): linha_caixa = LinhaCaixa(caixa = caixa, descricao = 'Nossa Nota de Entrega', documento = 'entrega', num_doc = self.kargs['numero'], valor_documento = to_decimal(bottle.request.forms.get('total_a_pagar')), terceiro = self.kargs['cliente'], metodo = metodo[0], entrada = bottle.request.forms.get(metodo[1]), saida = 0, user = self.kargs['user']).put() #print ('1.3') troco = total_entregue - to_decimal(bottle.request.forms.get('total_a_pagar')) if troco > to_decimal(0): linha_caixa = LinhaCaixa(caixa = caixa, descricao = 'Nossa nota de Entrega', documento = 'entrega', num_doc = self.kargs['numero'], valor_documento = to_decimal(bottle.request.forms.get('total_a_pagar')), terceiro = self.kargs['cliente'], metodo = default_metodo[0], entrada = 0, saida = troco, user = self.kargs['user']).put() else: troco = to_decimal(0) #print ('2') self.kargs['residual'] = to_decimal(bottle.request.forms.get('total_a_pagar')) - total_entregue + troco #Faz o lançamento contabilistico se tiver factura como movimento activo, se não como movimento geral #Vê o metodo de pagamento e lança na conta adequada try: from my_diario import Diario except: from diario import Diario diario = Diario(where = "tipo='caixa'").get()[0]['id'] periodo = None try: from my_periodo import Periodo except: from periodo import Periodo periodos = Periodo().get() for p in periodos: lista_datas = generate_dates(start_date = p['data_inicial'], end_date = p['data_final']) if str(format_date(self.kargs['data'])) in lista_datas: periodo = p['id'] if not periodo: return error_message('não existe periodo definido para a data em questão! \n') try: from my_movimento import Movimento except: from movimento import Movimento try: from my_linha_movimento import LinhaMovimento except: from linha_movimento import LinhaMovimento movimento = Movimento(data = datetime.date.today(), numero = base_models.Sequence().get_sequence('movimento'), num_doc = self.kargs['numero'], descricao = 'Pagamento de Nota de Entrega', diario = diario, documento = 'entrega', periodo = periodo, estado = 'Rascunho', user = self.kargs['user']).put() try: from my_terceiro import Terceiro except: from terceiro import Terceiro conta_cliente = Terceiro().get(key = self.kargs['cliente'])[0]['a_receber'] for metodo in metodos_pagamento: if bottle.request.forms.get(metodo[1]): method = to_decimal(bottle.request.forms.get(metodo[1])) else: method = to_decimal(0) if method > to_decimal(0): conta_pagamento = MetodoPagamento().get(key = metodo[0])[0]['conta'] LinhaMovimento(movimento = movimento, descricao = 'Pagamento de Nota de Entrega', conta = conta_pagamento, quant_debito = to_decimal(0), debito = to_decimal(bottle.request.forms.get(metodo[1])), quant_credito = to_decimal(0), credito = to_decimal(0), user = self.kargs['user']).put() LinhaMovimento(movimento = movimento, descricao = 'Pagamento de Nota de Entrega', conta = conta_cliente, quant_debito = to_decimal(0), debito = to_decimal(0), quant_credito = to_decimal(0), credito = to_decimal(bottle.request.forms.get(metodo[1])), user = self.kargs['user']).put() self.put() ctx_dict = get_context(window_id) ctx_dict['main_key'] = self.kargs['id'] ctx_dict['model_name'] = self.__model_name__ set_context(window_id, ctx_dict) #print ('fim do efectuar pagamento') return form_edit(window_id = window_id).show() else: return 'Segundo as Regras da Empresa não é possivel receber valores inferiores ao valor a Pagar, Torne a efectuar o pagamento por Favor!'
def Confirmar(self, key, window_id): """Gera movimento contabilistico (conta de receitas contra conta de terceiros)""" self.kargs = get_model_record(model=self, key=key) self.kargs['estado'] = 'Confirmado' if not self.kargs['numero']: self.kargs['numero'] = base_models.Sequence().get_sequence( 'factura_forn') try: from my_diario import Diario except: from diario import Diario diario = Diario().get_diario(diario='compras') try: from my_periodo import Periodo except: from periodo import Periodo periodo = Periodo().get_periodo(data=self.kargs['data']) #Valida se o cliente é sujeito a iva try: from my_terceiro import Terceiro except: from terceiro import Terceiro terceiro = Terceiro().get(key=self.kargs['fornecedor'])[0] sujeito_iva = terceiro['sujeito_iva'] conta_terceiro = terceiro['a_receber'] try: from my_movimento import Movimento except: from movimento import Movimento movimento = Movimento( data=self.kargs['data'], numero=base_models.Sequence().get_sequence('movimento'), num_doc=self.kargs['numero'], descricao='Vossa Factura', diario=diario, documento='factura_forn', periodo=periodo, estado='Confirmado', user=self.kargs['user']).put() #self.kargs['movimento'] = movimento try: from my_linha_factura_forn import LinhaFacturaFornecedor except: from linha_factura_forn import LinhaFacturaFornecedor record_lines = LinhaFacturaFornecedor( where="factura_forn = '{factura}'".format( factura=self.kargs['id'])).get() if record_lines: try: from my_linha_movimento import LinhaMovimento except: from linha_movimento import LinhaMovimento try: from my_produto import Produto except: from produto import Produto try: from my_familia_produto import FamiliaProduto except: from familia_produto import FamiliaProduto for line in record_lines: # aqui depois considerar a contabilização do desconto quantidade = float(line['quantidade']) product = Produto().get(key=line['produto'])[0] contas = Produto().get_accounts(line['produto']) #print (contas) conta_gastos = contas['conta_gastos'] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = to_decimal(0) descricao = product['nome'] total_sem_iva = line['valor_total'] / (1 + taxa_iva) LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_terceiro, quant_debito=quantidade, debito=total_sem_iva, quant_credito=to_decimal(0), credito=to_decimal(0), user=self.kargs['user']).put() LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_gastos, quant_debito=to_decimal(0), debito=to_decimal(0), quant_credito=quantidade, credito=total_sem_iva, user=self.kargs['user']).put() self.put() ctx_dict = get_context(window_id) ctx_dict['main_key'] = self.kargs['id'] set_context(window_id, ctx_dict) return form_edit(window_id=window_id).show() else: return error_message( 'Não pode confirmar facturas sem linhas de factura! \n')
def get_default_cliente(self): default_cliente = 0 for cliente in Terceiro().get_clientes(): if cliente[1] == 'Clientes Gerais': return cliente[0]
def Cancelar(self, key, window_id): """ Estorna movimento contabilistico extorna caso confirmada ou simplesmente cancela se em rascunho """ self.kargs = get_model_record(model=self, key=key) self.kargs['estado'] = 'Cancelado' #print (self.kargs) try: from my_diario import Diario except: from diario import Diario diario = Diario().get_diario(diario='compras') try: from my_periodo import Periodo except: from periodo import Periodo periodo = Periodo().get_periodo(data=str(datetime.date.today())) #Valida se o cliente é sujeito a iva try: from my_terceiro import Terceiro except: from terceiro import Terceiro terceiro = Terceiro().get(key=self.kargs['fornecedor'])[0] sujeito_iva = terceiro['sujeito_iva'] conta_terceiro = terceiro['a_receber'] #Tanto no movimento como no stock eu poderei ter vários movimentos, por exemplo o movimento em si e a anulação, além disso teremos que ter reconciliação de movimentos. try: from my_movimento import Movimento except: from movimento import Movimento movimento = Movimento( data=datetime.date.today(), numero=base_models.Sequence().get_sequence('movimento'), num_doc=self.kargs['numero'], descricao='Anulação de Vossa Factura', documento='factura_forn', diario=diario, periodo=periodo, estado='Confirmado', user=self.kargs['user']).put() #record['movimento'] = movimento try: from my_linha_factura_forn import LinhaFacturaFornecedor except: from linha_factura_forn import LinhaFacturaFornecedor record_lines = LinhaFacturaFornecedor( where="factura_forn = '{factura}'".format( factura=self.kargs['id'])).get() if record_lines: try: from my_linha_movimento import LinhaMovimento except: from linha_movimento import LinhaMovimento try: from my_produto import Produto except: from produto import Produto try: from my_familia_produto import FamiliaProduto except: from familia_produto import FamiliaProduto for line in record_lines: # aqui depois considerar a contabilização do desconto quantidade = to_decimal(line['quantidade']) product = Produto().get(key=line['produto'])[0] contas = Produto().get_accounts(line['produto']) conta_gastos = contas['conta_gastos'] if sujeito_iva: taxa_iva = product['iva'] else: taxa_iva = to_decimal(0) descricao = product['nome'] total_sem_iva = line['valor_total'] / (1 + taxa_iva) LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_gastos, quant_debito=quantidade, debito=total_sem_iva, quant_credito=to_decimal(0), credito=to_decimal(0), user=self.kargs['user']).put() LinhaMovimento(movimento=movimento, descricao=descricao, conta=conta_terceiro, quant_debito=to_decimal(0), debito=to_decimal(0), quant_credito=quantidade, credito=total_sem_iva, user=self.kargs['user']).put() self.put() ctx_dict = get_context(window_id) ctx_dict['main_key'] = self.kargs['id'] set_context(window_id, ctx_dict) return form_edit(window_id=window_id).show()
def get_funcionarios(self): try: from my_terceiro import Terceiro except: from terceiro import Terceiro return Terceiro().get_funcionarios()
def gerarRecibosSubsidios(self, key): self.kargs = get_model_record(model=self, key=key,force_db=True) funcionarios=[] if self.kargs['para_todos']: funcionarios = Terceiro(where="funcionario=True").get(order_by='nome') else: sql = """SELECT t.* FROM terceiro t WHERE (t.active = True OR t.active IS NULL) AND t.id IN ( SELECT fs.terceiro FROM rh_funcionario_subsidio fs WHERE (fs.active = True OR fs.active IS NULL) AND fs.rh_folha_salario = '{idSal}' )""".format(idSal=key) funcionarios = run_sql(sql) for func in funcionarios: contrato = RHContratoFuncionario(where="terceiro='{id}'".format(id=func['id'])).get() if contrato: contrato=contrato[0] content = { 'estado':'Rascunho', 'user':self.kargs['user'], 'rh_folha_salario':self.kargs['id'], 'terceiro':func['id'], 'periodo':self.kargs['periodo'], 'ano':self.kargs['ano'] } idRecibo = RHReciboSalario(**content).put() linhas = [] #SALARIO linhas.append({'nome':'Salário', 'valor':contrato['salario_base'],'rh_tipo_rendimento':None,'rh_tipo_desconto':None, 'origem':'salario','parte_trib':to_decimal(0)}) #IUR if (contrato['tipo'] == 'dependente') & (contrato['vinculo'] in ('efectivo','a_termo')): #calcular a nova base tributavel (salario e rendiementos tributaveis) salario_bruto_iur = to_decimal(contrato['salario_base'])+to_decimal(self.get_total_rendimento_tributaveis(idFuncionario=func['id'])) iur = self.calcularIURfuncionario(salario=salario_bruto_iur) linhas.append({'nome':'IUR', 'valor':-iur, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':None, 'origem':'iur','parte_trib':to_decimal(0)}) elif (contrato['tipo'] == 'dependente') & (contrato['vinculo'] =='prestacao_servico'): #calcular a nova base tributavel (salario e rendiementos tributaveis) salario_bruto_iur = to_decimal(contrato['salario_base'])+to_decimal(self.get_total_rendimento_tributaveis(idFuncionario=func['id'])) iur = self.calcularIURprestadorServico(salario=salario_bruto_iur) linhas.append({'nome':'IUR', 'valor':-iur, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':None, 'origem':'iur','parte_trib':to_decimal(0)}) elif contrato['tipo'] == 'pensionista': iur = self.calcularRetencaoPensionista(salario=contrato['salario_base']) linhas.append({'nome':'IUR', 'valor':-iur, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':None, 'origem':'iur','parte_trib':to_decimal(0)}) elif contrato['tipo'] == 'nao_residente': iur = self.calcularIURnaoResidente(salario=contrato['salario_base']) linhas.append({'nome':'IUR', 'valor':-iur, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':None, 'origem':'iur','parte_trib':to_decimal(0)}) #SEGURANCA SOCIAL if (contrato['tipo'] == 'dependente') & (contrato['vinculo'] in ('efectivo','a_termo')): salario_bruto_inps = to_decimal(contrato['salario_base'])+to_decimal(self.get_total_rendimento_Inps_subsidio(idFuncionario=func['id'])) inps = self.calcularDescontoInpsFuncionario(salario=salario_bruto_inps) linhas.append({'nome':'Segurança Social', 'valor':-inps,'rh_tipo_rendimento':None,'rh_tipo_desconto':None, 'origem':'inps','parte_trib':to_decimal(0)}) #### RHGastoSuportado(rh_recibo_salario=idRecibo, nome="INPS", valor=self.calcularDescontoInpsEntidade(salario=salario_bruto_inps), user=self.kargs['user']).put() #RENDIMENTOS rendimentos = RHRendimentoFuncionario(where="terceiro='{id}' AND em_subsidio = True".format(id=func['id'])).get() for line in rendimentos: tipo = RHTipoRendimento(where="id='{tr}'".format(tr=line['rh_tipo_rendimento'])).get() if tipo: linhas.append({'nome':tipo[0]['nome'], 'valor':line['valor'], 'rh_tipo_rendimento':tipo[0]['id'], 'rh_tipo_desconto':None, 'origem':'rendimento','parte_trib':self.get_parteTributavel(tipo_rend=tipo[0]['id'], valor=line['valor'])}) #OUTROS RENDIMENTOS outrosRendimentos = RHOutrosRendimentosFuncionario(where="terceiro='{id}' AND rh_folha_salario = '{folha}'".format(id=func['id'], folha=key)).get() for line in outrosRendimentos: tipo = RHTipoRendimento(where="id='{tr}'".format(tr=line['rh_tipo_rendimento'])).get() if tipo: linhas.append({'nome':tipo[0]['nome'], 'valor':line['valor'], 'rh_tipo_rendimento':tipo[0]['id'], 'rh_tipo_desconto':None, 'origem':'rendimento','parte_trib':self.get_parteTributavel(tipo_rend=tipo[0]['id'], valor=line['valor'])}) #DESCONTOS descontos = RHDescontoFuncionario(where="terceiro='{idTer}' AND em_subsidio=True".format(idTer=func['id'])).get() for line in descontos: tipo = RHTipoDesconto(where="id='{tr}'".format(tr=line['rh_tipo_desconto'])).get() if tipo: tipo = tipo[0] if tipo['taxa']: if tipo['base']=='salario base': valor = contrato['salario_base']*line['valor']/100 linhas.append({'nome':tipo['nome'], 'valor':-valor, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':tipo['id'], 'origem':'desconto','parte_trib':to_decimal(0)}) else: valor = (contrato['salario_base']+self.get_total_rendimento_tributaveis_subsidio(idFuncionario=func['id']))*line['valor']/100 linhas.append({'nome':tipo['nome'], 'valor':-valor, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':tipo['id'], 'origem':'desconto','parte_trib':to_decimal(0)}) else: linhas.append({'nome':tipo['nome'], 'valor':-line['valor'], 'rh_tipo_rendimento':None, 'rh_tipo_desconto':tipo['id'], 'origem':'desconto','parte_trib':to_decimal(0)}) #OUTROS DESCONTOS outrosDescontos = RHOutrosDescontosFuncionario(where="terceiro='{idTer}' AND rh_folha_salario='{idSal}'".format(idTer=func['id'], idSal=key)).get() for line in outrosDescontos: tipo = RHTipoDesconto(where="id='{tr}'".format(tr=line['rh_tipo_desconto'])).get() if tipo: tipo = tipo[0] if tipo['taxa']: if tipo['base']=='salario base': valor = contrato['salario_base']*line['valor']/100 linhas.append({'nome':tipo['nome'], 'valor':-valor, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':tipo['id'], 'origem':'outros_descontos', 'parte_trib':to_decimal(0)}) else: valor = (contrato['salario_base']+self.get_total_rendimento_tributaveis_subsidio(idFuncionario=func['id']))*line['valor']/100 linhas.append({'nome':tipo['nome'], 'valor':-valor, 'rh_tipo_rendimento':None, 'rh_tipo_desconto':tipo['id'], 'origem':'outros_descontos', 'parte_trib':to_decimal(0)}) else: linhas.append({'nome':tipo['nome'], 'valor':-line['valor'], 'rh_tipo_rendimento':None, 'rh_tipo_desconto':tipo['id'], 'origem':'outros_descontos', 'parte_trib':to_decimal(0)}) for line in linhas: content = { 'user':self.kargs['user'], 'rh_recibo_salario':idRecibo, 'nome':line['nome'], 'valor':line['valor'], 'rh_tipo_rendimento':line['rh_tipo_rendimento'], 'rh_tipo_desconto':line['rh_tipo_desconto'], 'origem':line['origem'], 'parte_trib':line['parte_trib'] } RHLinhaReciboSalario(**content).put()