def viewinvoice(): if auth.has_membership('administradores') or auth.has_membership('superadministradores'): from invoices import Invoice, Order, Orderlist, Budget, AccountingEntry, CreditAccount Invoice(db), Order(db), Orderlist(db), Budget(db), AccountingEntry(db), CreditAccount(db) invoice= db(db.invoices.id==request.args(0)).select(db.invoices.ALL, db.auth_user.id, db.auth_user.first_name, db.auth_user.last_name, db.fiscals.ALL, left=[ db.auth_user.on(db.auth_user.id==db.invoices.user), db.fiscals.on(db.fiscals.user==db.auth_user.id)]).first() orderlist= db(db.orders.invoice==invoice.invoices.id).select( db.orders.ALL, db.orderlist.ALL, db.products.ALL, left=[ db.orderlist.on(db.orderlist.g_order==db.orders.id), db.products.on(db.products.id==db.orderlist.product)]) order=db(db.orders.invoice==invoice.invoices.id).select(db.orders.ALL).first() return dict(invoice=invoice, orderlist=orderlist, order=order) else: redirect(URL(request.application,'default','user/login'))
def viewbudget(): if auth.has_membership('administradores') or auth.has_membership( 'superadministradores'): from invoices import Budget, Budgetlist from shops import Product Budget(db), Budgetlist(db), Product(db) budget = db(db.budgets.id == request.args(0)).select( db.budgets.ALL, db.auth_user.id, db.auth_user.first_name, db.auth_user.last_name, db.fiscals.ALL, left=[ db.auth_user.on(db.auth_user.id == db.budgets.user), db.fiscals.on(db.fiscals.user == db.auth_user.id) ]).first() if budget: budgetlist = db( db.budgetlist.g_budget == budget.budgets.id).select( db.budgetlist.ALL, db.products.ALL, left=[ db.products.on(db.products.id == db.budgetlist.product) ]) return dict(budget=budget, budgetlist=budgetlist) else: redirect(URL(request.application, 'administrator', 'users')) else: redirect(URL(request.application, 'default', 'user/login'))
def delitem(): if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): from invoices import Invoice, Budget, Budgetlist from shops import Product from adminsettings import Adminsettings Adminsettings(db), Invoice(db), Budget(db), Budgetlist(db), Product(db) settings = db(db.adminsettings.id > 0).select( db.adminsettings.ALL).first() budget = db((db.budgets.user == request.vars.customer) & (db.budgets.id == request.vars.budgetid)).select().first() try: db((db.budgetlist.id == request.vars.id) & (db.budgetlist.g_budget == budget.id)).delete() db.commit() except: db.rollback() return db((db.budgetlist.g_budget == budget.id)).select( db.budgetlist.ALL, db.products.name, db.products.id, join=[db.products.on(db.products.id == db.budgetlist.product) ]).as_list() else: return dict()
def items(): if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): from invoices import Invoice, Budget, Budgetlist from shops import Product from adminsettings import Adminsettings Adminsettings(db), Invoice(db), Budget(db), Budgetlist(db), Product(db) settings = db(db.adminsettings.id > 0).select( db.adminsettings.ALL).first() #entrada: data: { 'product': int, 'quantity': int, 'rate': int, 'operation': ['add','del','set'] } #salida: (json)sales #begin #comprobar si tiene un budget abierta y si no crearla budget = db((db.budgets.user == request.vars.customer) & (db.budgets.id == request.vars.budgetid)).select().first() try: if not budget: budgetid = db.budgets.insert(status="Creando", user=request.vars.customer, tax=settings.tax) budget = db.budgets(budgetid) return db((db.budgetlist.g_budget == budget.id)).select( db.budgetlist.ALL, db.products.name, db.products.id, join=[db.products.on(db.products.id == db.budgetlist.product) ]).as_list() except Exception as ex: logger.debug(ex) db.rollback() else: return dict()
def viewinvoice(): from invoices import Invoice, Order, Orderlist, Budget, AccountingEntry, CreditAccount Invoice(db), Order(db), Orderlist(db), Budget(db), AccountingEntry( db), CreditAccount(db) invoice = db((db.invoices.invoice_number == request.args(0)) & (db.invoices.user == auth.user_id)).select( db.invoices.ALL, db.auth_user.id, db.auth_user.first_name, db.auth_user.last_name, db.fiscals.ALL, left=[ db.auth_user.on(db.auth_user.id == db.invoices.user), db.fiscals.on(db.fiscals.user == db.auth_user.id) ]).first() orderlist = db(db.orders.invoice == invoice.invoices.id).select( db.orders.ALL, db.orderlist.ALL, db.products.ALL, left=[ db.orderlist.on(db.orderlist.g_order == db.orders.id), db.products.on(db.products.id == db.orderlist.product) ]) order = db(db.orders.invoice == invoice.invoices.id).select( db.orders.ALL).first() return dict(invoice=invoice, orderlist=orderlist, order=order)
def newbudget(): from shops import Product from invoices import Fiscal, Budget from adminsettings import Adminsettings Adminsettings(db), Product(db), Fiscal(db), Budget(db) settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first() if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): if request.args(0): products = db(db.products.active == True).select() if request.args(1): budget = db((db.budgets.user == request.args(0)) & ( db.budgets.id == request.args(1))).select().first() else: budget = db((db.budgets.user == request.args(0)) & (db.budgets.status == "Creando")).select().first() if not budget: budgetid = db.budgets.insert(status="Creando", tax=settings.tax, user=request.args(0)) budget = db.budgets(budgetid) customer = db(db.auth_user.id == request.args(0)).select( db.auth_user.id, db.auth_user.first_name, db.auth_user.last_name, db.auth_user.email, db.fiscals.ALL, left=[db.fiscals.on(db.fiscals.user == db.auth_user.id) ]).first() db.commit() return dict(products=products, customer=customer, tax=budget.tax, budgetid=budget.id) else: redirect(URL(request.application, 'administrator', 'users')) else: redirect(URL(request.application, 'default', 'user/login'))
def cancelbudget(): from invoices import Budget Budget(db) if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): try: db((db.budgets.user == request.vars.customer) & (db.budgets.id == request.vars.budgetid)).delete() except Exception as ex: logger.debug( "OCurrió un error al borrar una orden de pedido desde billing: %s" % ex) response.flash = "Ocurrió un error: %s" % ex redirect( URL(request.application, 'administrator', 'editcustomer', args=request.vars.customer)) return dict()
def confirmbudget(): from invoices import Budget, Budgetlist from adminsettings import Adminsettings Adminsettings(db), Budget(db), Budgetlist(db) settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first() if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): try: budget = db((db.budgets.user == request.vars.customer) & ( db.budgets.id == request.vars.budgetid)).select().first() total = float(0) totaltax = float(0) budgetlist = db(db.budgetlist.g_budget == budget.id).select() if budgetlist: for row in budgetlist: total = total + (float(row.quantity) * float(row.price)) totaltax = (total * float(settings.tax)) / 100 db(db.budgets.id == budget.id).update( total="%.2f" % total, totaltax="%.2f" % totaltax, status="Creado", confirmed_at=datetime.datetime.now()) db.commit() except Exception as ex: db.rollback() logger.debug("Ocurrió un error al generar la factura %s" % ex) session.flash = "Se produjo un error al generar la factura: %s" % ex redirect(URL('budget', 'newbudget', args=budget.id)) redirect( URL(request.application, 'administrator', 'editcustomer', args=request.vars.customer)) return dict()
import datetime import copy import gluon.contenttype import gluon.fileutils from blog import Blog, Draft, Images from shops import Shop, DomainShop, PricePlan, Product, ContractedProduct, ProfilePlan, PricePlan, CustomerAgreement, Agreement from invoices import Invoice, Order, Orderlist, Fiscal, CreditAccount, AccountingEntry, Budget, Budgetlist from regnews import Regnews from province import Province from cities import Cities Images(db), Blog(db, ckeditor), Draft( db, ckeditor), Regnews(db), Province(db), Cities(db) Shop(db), PricePlan(db), DomainShop(db), Product(db) ProfilePlan(db), PricePlan(db), CustomerAgreement(db), Agreement(db) Invoice(db), Order(db), Orderlist(db), Budget(db), Budgetlist(db), Fiscal( db), ContractedProduct(db), CreditAccount(db), AccountingEntry(db) try: import pygraphviz as pgv except ImportError: pgv = None # ## critical --- make a copy of the environment global_env = copy.copy(globals()) global_env['datetime'] = datetime http_host = request.env.http_host.split(':')[0] remote_addr = request.env.remote_addr try:
def editcustomer(): if auth.has_membership('administradores') or auth.has_membership('superadministradores'): if request.args(0): from invoices import Fiscal, Order, Orderlist, Invoice, Budget, AccountingEntry, CreditAccount from shops import ContractedProduct, Product, Shop from cities import Cities from province import Province Fiscal(db), Province(db), Cities(db), ContractedProduct(db), Product(db), Shop(db), Order(db), Orderlist(db), AccountingEntry(db), CreditAccount(db), Invoice(db), Budget(db) customer=db(db.auth_user.id==request.args(0)).select( db.auth_user.id, db.auth_user.first_name, db.auth_user.last_name, db.auth_user.email, db.fiscals.ALL, left=[db.fiscals.on(db.fiscals.user==db.auth_user.id)]).first() wpoblacion = SQLFORM.widgets.autocomplete(request, db.cities.poblacion, limitby=(0,10), min_length=2) wprovincia = SQLFORM.widgets.autocomplete(request, db.province.provincia, limitby=(0,10), min_length=2) inc=datetime.timedelta(days=30) contractedproducts = db((db.contractedproducts.user==request.args(0)) & ( (db.contractedproducts.expiration+inc>=datetime.datetime.now()) | (db.contractedproducts.expiration==None) )).select( db.contractedproducts.ALL, db.products.ALL, db.shop.ALL, db.auth_user.ALL, db.fiscals.ALL, left=[ db.products.on(db.products.id==db.contractedproducts.product), db.shop.on(db.shop.id==db.contractedproducts.shop), db.auth_user.on(db.auth_user.id==db.contractedproducts.user), db.fiscals.on(db.fiscals.user==db.auth_user.id)], orderby=~db.contractedproducts.expiration) invoices = db( db.invoices.user==request.args(0)).select(db.invoices.ALL, db.orders.id, db.orders.status, left=[ db.orders.on(db.orders.invoice==db.invoices.id)], orderby=~db.invoices.id, groupby=db.orders.id ) budgets = db((db.budgets.user==request.args(0)) & (db.budgets.status!="Creando")).select(db.budgets.ALL, orderby=~db.budgets.id) orders= db((db.orders.invoice==None) & (db.orders.user==request.args(0))).select(orderby=~db.orders.id) if customer!=None: first_name= Field('first_name', 'string', label=XML("<strong>Nombre</strong>"), length=128, notnull=True, default=customer.auth_user.first_name, requires=IS_NOT_EMPTY(error_message="No olvide esta dato")) last_name= Field('last_name', 'string', label=XML("<strong>Apellidos</strong>"), length=128, notnull=True, default=customer.auth_user.last_name, requires=IS_NOT_EMPTY(error_message="No olvide esta dato")) email=Field('email', label=XML('<strong>Email</strong>'), length=128, writable=False, notnull=True, default=customer.auth_user.email, requires=[IS_NOT_EMPTY(), IS_EMAIL(error_message='No puede estar vacío.')]) tax_identification = Field('tax_identification', 'string', label=XML("<strong>NIF/CIF/NIE</strong> <span class='glyphicon glyphicon-question-sign'></span>"),length=45, notnull=True, default=customer.fiscals.tax_identification, requires=IS_NOT_EMPTY(error_message="No olvide esta dato")) fiscalname=Field('fiscalname', 'string', label=XML("<strong>Nombre empresa</strong>") ,length =128, notnull=False, default=customer.fiscals.fiscalname) address=Field('address', 'string', label=XML("<strong>Dirección</strong>"), length =196, notnull=True, default=customer.fiscals.address, requires=IS_NOT_EMPTY(error_message="no olvide este dato")) city= Field('city', 'string', label=XML("<strong>Ciudad/Población</strong>"), length=45, notnull=True, default=customer.fiscals.city, requires=IS_NOT_EMPTY(error_message="no olvide este dato"), widget=wpoblacion) province = Field('province', 'string', label=XML("<strong>Provincia</strong>"), length=45, notnull=True, default=customer.fiscals.province, requires=IS_NOT_EMPTY(error_message="no olvide este dato"), widget=wprovincia) country=Field('country', 'string', label=XML("<strong>Pais</strong>"), length =45, notnull=True, default=customer.fiscals.country, requires=IS_NOT_EMPTY(error_message="no olvide este dato")) postalcode=Field('postal_code', 'string', label=XML("<strong>Código postal</strong>"), length=10, notnull=False, default=customer.fiscals.postal_code) phone=Field('phone', 'string', label=XML("<strong>Teléfono</strong>"), length=20, notnull=False, default=customer.fiscals.phone) form = SQLFORM.factory(first_name, last_name, email, tax_identification, fiscalname, address, city, province, country, postalcode, phone, submit_button = 'enviar datos', formstyle='bootstrap3_inline') if form.validate(keepvalues=True): try: db(db.auth_user.id==customer.auth_user.id).update(first_name=form.vars.first_name, last_name=form.vars.last_name) db(db.fiscals.id==customer.fiscals.id).update(tax_identification=form.vars.tax_identification, fiscalname=form.vars.fiscalname, address=form.vars.address, city=form.vars.city, province=form.vars.province, country=form.vars.country, postal_code=form.vars.postal_code, phone=form.vars.phone) db.commit() except Exception, ex: logger.debug("No se pudo modificar los datos del usuario/fiscal: %s" % ex) db.rollback() response.flash = 'Hubo un error: %s' % ex response.flash="Datos enviados correctamente" elif form.errors: response.flash = 'Hay errores' form.element('input[name=city]')['_class']='form-control' form.element('input[name=province]')['_class']='form-control' creditaccount=db(db.creditaccounts.user==customer.auth_user.id).select().first() accountingentries=None if creditaccount: accountingentries = db( (db.accountingentries.creditaccount==creditaccount.id) & (db.accountingentries.active==True) ).select( db.accountingentries.ALL, db.orders.ALL, db.invoices.ALL, db.products.name, join=[ db.orderlist.on(db.accountingentries.orderlist==db.orderlist.id), db.products.on(db.products.id==db.orderlist.product), db.orders.on(db.orders.id==db.orderlist.g_order), db.invoices.on(db.invoices.id==db.orders.invoice)], orderby=~db.accountingentries.id) return dict(form=form, contractedproducts=contractedproducts, invoices=invoices, budgets=budgets, orders=orders, userid=customer.auth_user.id, accountingentries=accountingentries, creditaccount=creditaccount) else: redirect(URL('administrator','newcustomer')) else: redirect(URL('administrator','users'))
def printbudget(): import os, uuid, subprocess import gluon.contenttype, gluon.globals from appy.pod.renderer import Renderer from invoices import Budget, Budgetlist from shops import Product from adminsettings import Adminsettings Adminsettings(db), Budget(db), Budgetlist(db), Product(db) settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first() if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): budget = db(db.budgets.id == request.args(0)).select( db.budgets.ALL, db.auth_user.id, db.auth_user.first_name, db.auth_user.last_name, db.auth_user.email, db.fiscals.ALL, left=[ db.auth_user.on(db.auth_user.id == db.budgets.user), db.fiscals.on(db.fiscals.user == db.auth_user.id) ]).first() if budget: budgetnumber = "%s" % budget.budgets.id budgetdate = "%s" % budget.budgets.created_at.strftime("%d-%m-%Y") customernumber = "%s" % budget.auth_user.email customernif = "%s" % ("", budget.fiscals.tax_identification )[budget.fiscals.tax_identification != None] nombre = "%s" % ( "%s %s" % (budget.auth_user.first_name, budget.auth_user.last_name), budget.fiscals.fiscalname)[budget.fiscals.fiscalname != ""] domicilio = "%s" % ( "", budget.fiscals.address)[budget.fiscals.address != None] domicilio2 = "%s %s %s" % ( ("", budget.fiscals.postal_code )[budget.fiscals.postal_code != None], ("", budget.fiscals.city)[budget.fiscals.city != None], ("", budget.fiscals.province)[budget.fiscals.province != None]) telefono = "%s" % budget.fiscals.country fax = "%s" % budget.fiscals.phone iva = "%.2f" % budget.budgets.tax totaliva = "%.2f" % float(budget.budgets.totaltax) total = "%.2f" % float(budget.budgets.total) totalbudget = "%.2f" % float( float(budget.budgets.total) + float(budget.budgets.totaltax)) items = [] for item in db(db.budgetlist.g_budget == budget.budgets.id).select( db.budgetlist.ALL, db.products.ALL, left=[ db.products.on(db.products.id == db.budgetlist.product) ]): tax_result = "%.2f" % ( ((float(item.budgetlist.price) * (float(item.budgetlist.quantity))) * float(item.budgetlist.tax)) / float(100)) items.append( dict( id="%s" % item.products.id, name="%s" % item.products.name, cant="%s" % item.budgetlist.quantity, price="%.2f" % float(item.budgetlist.price), percent="%.2f" % float( item.budgetlist.tax ), #se refiere al iva, pero en el .odt puse este nombre de variable por una ida de olla. total="%.2f" % (float(item.budgetlist.quantity) * float(item.budgetlist.price)))) try: # Report creation template_file = os.path.join(request.folder, 'private', 'budget.odt') # tmp_uuid = uuid.uuid4() output_file_odt = os.path.join( request.folder, 'private', 'tmp', '%s_%s.odt' % ("presupuesto", budget.budgets.id)) output_file_pdf = os.path.join( request.folder, 'private', 'tmp', '%s_%s.pdf' % ("presupuesto", budget.budgets.id)) #por si existiese de vez anterior for filepath in [output_file_odt, output_file_pdf]: if os.path.exists(filepath): os.remove(filepath) renderer = Renderer(template_file, locals(), output_file_odt) renderer.run() command = "unoconv --format pdf --output %s %s" % ( os.path.join(request.folder, 'private', 'tmp'), output_file_odt) process = subprocess.Popen(command, shell=True) processcode = process.wait() response.headers['Content-Length'] = '%s' % os.path.getsize( output_file_pdf) response.headers[ 'Content-Type'] = '%s' % gluon.contenttype.contenttype( '.pdf') response.headers[ 'Content-Disposition'] = 'attachment; filename=%s_%s.pdf' % ( "presupuesto", budget.budgets.id) stream = open(output_file_pdf, 'rb') for filepath in [output_file_odt, output_file_pdf]: if os.path.exists(filepath): os.remove(filepath) return stream # response.stream(output_file_pdf, chunk_size=4096) except Exception as ex: for filepath in [output_file_odt, output_file_pdf]: if os.path.exists(filepath): os.remove(filepath) logger.debug("Error general al generar PDF: %s " % ex) pass except IOError, e: # Explicitly ignore IOError if it occurs. for filepath in [output_file_odt, output_file_pdf]: if os.path.exists(filepath): os.remove(filepath) logger.debug("Error IOerror al generar PDF: %s" % e) pass session.flash = 'No se pudo encontrar el presupuesto, inténtelo de nuevo' if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): redirect( URL(request.application, 'administrator', 'viewinvoice', args=request.args(0))) else: redirect( URL(request.application, 'account', 'billing', args=request.args(0)))
def item(): if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): from shops import Product from invoices import Budget, Budgetlist from adminsettings import Adminsettings Adminsettings(db), Budget(db), Budgetlist(db), Product(db) settings = db(db.adminsettings.id > 0).select( db.adminsettings.ALL).first() #entrada: data: { 'product': int, 'quantity': int, 'rate': int, 'operation': ['add','del','set'] } #salida: (json)sales #begin #comprobar si tiene un budget abierta y si no crearla if request.vars.budgetid: budget = db((db.budgets.user == request.vars.customer) & ( db.budgets.id == request.vars.budgetid)).select().first() else: budget = db((db.budgets.user == request.vars.customer) & (db.budgets.status == "Creando")).select().first() if not budget and request.vars.operation == "add": budgetid = db.budgets.insert(status="Creando", user=request.vars.customer, tax=settings.tax) budget = db.budgets(budgetid) budgetlist_id = None try: #add/del product y quantity. row = db((db.budgetlist.product == request.vars.product) & (db.budgetlist.g_budget == budget.id)).select().first() if row: budgetlist_id = row.id if request.vars.operation == "add": db(db.budgetlist.id == budgetlist_id).update( quantity=int(row.quantity) + int(request.vars.quantity)) elif request.vars.operation == "set": db(db.budgetlist.id == budgetlist_id).update( quantity=int(request.vars.quantity)) db.commit() else: product = db( db.products.id == request.vars.product).select().first() #valor iva, para conservar el valor en caso de variar en el futuro #el precio para conservar en caso de variar en el futuro. budgetlist_id = db.budgetlist.insert( product=request.vars.product, g_budget=budget.id, quantity=request.vars.quantity, price=product.price, price_wdto=product.price, tax="%.2f" % settings.tax) db.commit() except Exception as ex: logger.debug("ALGO SALIO MAL en item %s" % ex) db.rollback() #retorna json del pedido data = db((db.budgetlist.g_budget == budget.id)).select( db.budgetlist.ALL, db.products.name, join=[db.products.on(db.products.id == db.budgetlist.product) ]).as_list() return data else: return dict()
def newinvoice(): from invoices import Invoice, Order, Orderlist, Budget, Budgetlist from shops import Product from adminsettings import Adminsettings Adminsettings(db), Invoice(db), Order(db), Orderlist(db), Product( db), Budget(db), Budgetlist(db) settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first() if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): if request.args(0): products = db(db.products.active == True).select() if request.vars.budget: order = db((db.orders.user == request.args(0)) & (db.orders.status == "CreandoAdmin") & (db.orders.budget == request.vars.budget)).select( ).first() if not order: orderid = db.orders.insert(status="CreandoAdmin", user=request.args(0), budget=request.vars.budget, payment_method='Transferencia', tax=settings.tax, manual_operation=True) for row in db(db.budgetlist.g_budget == request.vars.budget).select(): db.orderlist.insert(product=row.product, g_order=orderid, quantity=row.quantity, price=row.price, price_wdto=row.price_wdto, tax=row.tax, dto=row.dto, dto_percentage=row.dto_percentage) db.commit() else: orderid = order.id elif request.vars.order: order = db((db.orders.user == request.args(0)) & ( db.orders.id == request.vars.order)).select().first() if order: orderid = order.id else: response.flash = "Error" else: order = db((db.orders.user == request.args(0)) & (db.orders.status == "CreandoAdmin") & (db.orders.budget == None)).select().first() if not order: orderid = db.orders.insert(status="CreandoAdmin", user=request.args(0), tax=settings.tax, payment_method='Transferencia', manual_operation=True) db.commit() else: orderid = order.id customer = db(db.auth_user.id == request.args(0)).select( db.auth_user.id, db.auth_user.first_name, db.auth_user.last_name, db.auth_user.email, db.fiscals.ALL, left=[db.fiscals.on(db.fiscals.user == db.auth_user.id) ]).first() paymentmethod = db.orders(orderid).payment_method return dict(products=products, customer=customer, tax=settings.tax, paymentmethod=paymentmethod) else: redirect(URL(request.application, 'administrator', 'users')) else: redirect(URL(request.application, 'default', 'user/login'))