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 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 mycredit(): from invoices import CreditAccount, AccountingEntry, Order, Orderlist Order(db), CreditAccount(db), AccountingEntry(db), Orderlist(db) creditaccount = db(db.creditaccounts.user == 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(creditaccount=creditaccount, accountingentries=accountingentries, invoices=db(db.invoices.user == auth.user_id).select())
def delete_accountingentry(): if auth.has_membership('administradores') or auth.has_membership('superadministradores'): from invoices import Orderlist, AccountingEntry, CreditAccount Orderlist(db), AccountingEntry(db), CreditAccount(db) #comprobar que el AccountingEntry que se va a borrar es correcto try: accountingentry=db.accountingentries(request.vars.accountingentries) creditaccount=db.creditaccounts(accountingentry.creditaccount) balance=None if creditaccount.user==int(request.vars.customer): #buscar el primer accountingentry con ese orderlist y a partir de ese, la lista de accountingsentry con ese user hasta el final. accountingentries=db(db.accountingentries.id>=db((db.accountingentries.orderlist==accountingentry.orderlist) & (db.accountingentries.active==True)).select().first()['id']).select() #recorrer la lista for ae in accountingentries: #si coincide orderlist, quedarse con total*(-1), desactivar accountingentry if ae.orderlist==accountingentry.orderlist: if float(ae.total)>=0: total=float(ae.total)*(-1) else: total=0 #desactivar db(db.accountingentries.id==ae.id).update(active=False, deactivated_by=auth.user_id, deactivated_at=datetime.datetime.now()) #si no, sumarr a balance el total*(-1) else: aentry=db.accountingentries(ae.id) balance=float(aentry.balance)+total logger.debug("%s %s %s %s + %s = %s" % (aentry.id, total, aentry.balance, aentry.balance, total, balance)) aentry.update_record(balance=balance) #modificar balance de CreditAccount if balance!=None: db(db.creditaccounts.id==accountingentry.creditaccount).update(balance=balance) db.commit() return "ok" else: return "fail" except Exception as ex: db.rollback() logger.debug("Error delete_accountingentry %s" % ex) raise HTTP(500, ex) else: return "fail"
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: hosts = (http_host, socket.gethostname(), socket.gethostbyname(http_host),
def managecontract(self, contract): # Atención, esta función es altamente complicada porque se concentran casi todos los objetos, situaciones y operaciones del sistema. # Dolor de cabeza que te cagas llena de condiciones. De todo menos KISS. ALGUNA VEZ SIMPLIFICARE SEMEJANTE MIERDA! from shops import PricePlan, Shop from invoices import CreditAccount, AccountingEntry from adminsettings import Adminsettings from dateutil.relativedelta import relativedelta from gluon.contrib.pysimplesoap.client import SoapClient db=self.db CreditAccount(db), Shop(db), Adminsettings(db) accounting=AccountingEntry(db) adm=db.adminsettings(1) logger.debug(contract) #comprueba si active if contract.contractedproducts.active: total=((contract.products.price * adm.tax)/100) + contract.products.price credit=0 c=db(db.creditaccounts.user==contract.contractedproducts.user).select().first() if c!=None: credit=c.balance try: now=datetime.datetime.now() if contract.contractedproducts.period=='hours': #no usado por ahora inc=datetime.timedelta(hours=contract.contractedproducts.quantity) elif contract.contractedproducts.period=='days': #no usado por ahora inc=datetime.timedelta(days=contract.contractedproducts.quantity) elif contract.contractedproducts.period=='week': #no usado por ahora inc=datetime.timedelta(weeks=contract.contractedproducts.quantity) elif contract.contractedproducts.period=='month': inc=relativedelta(months=contract.contractedproducts.quantity) horizon_date=15 #15 días elif contract.contractedproducts.period=='year': inc=relativedelta(years=contract.contractedproducts.quantity) horizon_date=30*11 #días. No tengo en cuenta febreros ni bisiestos porque es sólo para hacer algo en 11 meses aprox. else: inc=datetime.timedelta(hours=0) #si autorenove, if contract.contractedproducts.autorenove: #si expiration is None: if contract.contractedproducts.expiration==None: # cambiar status y plan del shop si contract.order.status=="Pagado" if contract.orders.status=='Pagado': #comprueba si saldo if credit>=total: #activar servicios if contract.contractedproducts.automatics_action: client = SoapClient(wsdl="http://*****:*****@gextiendas.es">[email protected]</a> indicándonos su cuenta de usuario (email con el que accede al sistema).</p> <p>Si lo desea puede realizar el pago mediante paypal o cambiar la forma de pago siguiendo este enlace:</p> <p><a href="%(url)s">%(url)s</a></p> <p>El equipo de GEXtiendas.</p> """ % { "ordered_at": contract.orders.ordered_at.strftime("%d-%m-%Y %H:%M"), "name": contract.contractedproducts.user.first_name, "date": contract.contractedproducts.expiration, "product": contract.products.name, "shop_hostname":contract.contractedproducts.shop.host, "shop_name":contract.contractedproducts.shop.name, "url": urlpayment, } logger.debug("LLEGO16") subject="[GEXtiendas] seguimiento de servicios" plaintext=""" www.gestionexperta.com/www.gextiendas.es\n \n \n \t\t\t\t Fuengirola (Málaga), a %(ordered_at)s \n Estimado %(name)s, el próximo %(date)s caduca el servicio contratado:\n\n %(product)s para su tienda %(shop_name)s (%(shop_hostname)s)\n\n pero no tenemos constancia de su transferencia bancaria. Si cree que es un error, puede enviarnos por correo electrónico el justificante del banco por fax al 912692914 o por correo electrónico a <a href="mailto:[email protected]">[email protected]</a> indicándonos su cuenta de usuario (email con el que accede al sistema).\n Si lo desea puede realizar el pago mediante paypal o cambiar la forma de pago siguiendo este enlace:\n\n %(url)s \n\n\n El equipo de gextiendas """ % { "ordered_at": contract.orders.ordered_at.strftime("%d-%m-%Y %H:%M"), "name": contract.contractedproducts.user.first_name, "date": contract.contractedproducts.expiration, "product": contract.products.name, "shop_hostname":contract.contractedproducts.shop.host, "shop_name":contract.contractedproducts.shop.name, "url": urlpayment, } logger.debug("LLEGO17") self.__expirationwarningmail(contract.contractedproducts.user, html, subject, plaintext) logger.debug("LLEGO18") logger.debug("LLEGO19") logger.debug("Transferencia Pendiente pago, no ha expirado, managed==True y pedido tiene más de horizon días") # managed==False y status=="Pagado" elif (contract.contractedproducts.managed==False) and (contract.orders.status=="Pagado"): logger.debug("LLEGO20") #comprobar que realmente hay saldo, if credit>=total: logger.debug("LLEGO21") # actualizar fechas de renove y expiration # actualizar managed=True db(db.contractedproducts.id==contract.contractedproducts.id).update(renove=now, expiration= contract.contractedproducts.expiration + inc, managed=True) #quitar saldo logger.debug("LLEGO22") if contract.contractedproducts.credit_annotation: accounting.annotation(contract.contractedproducts.orderlist, db.orders(contract.orders.id), positive=False) logger.debug("LLEGO23") logger.debug("Transferencia Pagada no ha expirado, managed==False y pedido tiene más de horizon días") logger.debug("LLEGO24") db.commit() #si expirado margen de 2 día, desactivar servicios elif contract.contractedproducts.expiration < (datetime.datetime.now() + datetime.timedelta(days=2)): logger.debug("LLEGO25") if contract.contractedproducts.automatics_action: logger.debug("LLEGO26") client = SoapClient(wsdl="http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None") logger.debug("LLEGO27") if client.disableDomainShop(contract.contractedproducts.user, contract.contractedproducts.shop)['result']=="0": logger.debug("LLEGO28") db(db.shop.id==contract.contractedproducts.shop).update(status='enabled', priceplan=db(db.priceplans.paymode=="free").select().first()["id"]) logger.debug("LLEGO29") else: raise Exception("Imposible deshabilitar dominio userid: %s shopid: %s priceplan:%s" % (contract.contractedproducts.user, contract.contractedproducts.shop, db(db.priceplans.paymode=="free").select().first()["id"])) else: db(db.shop.id==contract.contractedproducts.shop).update(status='enabled', priceplan=db(db.priceplans.paymode=="free").select().first()["id"]) logger.debug("LLEGO30") db.commit() #si expirado margen de 7 día, desactivar servicios y borrar contrato elif contract.contractedproducts.expiration< (datetime.datetime.now() + datetime.timedelta(days=7)): if contract.contractedproducts.automatics_action: client = SoapClient(wsdl="http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None") if client.disableDomainShop(contract.contractedproducts.user, contract.contractedproducts.shop)['result']=="0": db(db.shop.id==contract.contractedproducts.shop).update(status='enabled', priceplan=db(db.priceplans.paymode=="free").select().first()["id"]) logger.debug("LLEGO31") else: raise Exception("Imposible deshabilitar dominio userid: %s shopid: %s priceplan:%s" % (contract.contractedproducts.user, contract.contractedproducts.shop, db(db.priceplans.paymode=="free").select().first()["id"])) else: db(db.shop.id==contract.contractedproducts.shop).update(status='enabled', priceplan=db(db.priceplans.paymode=="free").select().first()["id"]) logger.debug("LLEGO32") db.commit(db) logger.debug("LLEGO34") # Si es paypal no hacer nada, que lo haga IPN #db(db.contractedproducts.id==contract.contractedproducts.id).update(renove=now, expiration= contract.contractedproducts.expiration+inc) #update fecha de renove a now y suma tiempo a expiration #si no autorenove, dos casos, que sean ifselling o comprobar que el producto no sea de suscripción, si no, pasados 7 días borrar contrato, cambiar a plan gratuito y desactivar servicios si no lo estuviesen ya. else: if contract.products.plan=='ifselling' or contract.products.suscription==False: logger.debug("LLEGO33") if contract.contractedproducts.start==None: logger.debug("LLEGO34") # cambiar status y plan del shop si contract.order.status=="Pagado" if contract.orders.status=='Pagado': logger.debug("LLEGO35") #comprueba si saldo if credit>=total: #activar servicios logger.debug("LLEGO36") if contract.contractedproducts.automatics_action: logger.debug("LLEGO37") client = SoapClient(wsdl="http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None") logger.debug("LLEGO38") if client.enableDomainShop(contract.contractedproducts.user, contract.contractedproducts.shop)['result']=="0": logger.debug("LLEGO39") db(db.shop.id==contract.contractedproducts.shop).update(status='enabled', priceplan=contract.priceplans.id) logger.debug("LLEGO40") # cambiar de contractedproducts fecha de start y expiration db(db.contractedproducts.id==contract.contractedproducts.id).update(start=now, expiration= now+inc) logger.debug("LLEGO41") #quitar saldo if contract.contractedproducts.credit_annotation: logger.debug("LLEGO42") accounting.annotation(contract.contractedproducts.orderlist, db.orders(contract.orders.id), positive=False) logger.debug("LLEGO43") db.commit() logger.debug("LLEGO44") else: raise Exception("Imposible habilitar dominio userid: %s shopid: %s status:%s priceplan:%s" % (contract.contractedproducts.user, contract.contractedproducts.shop, 'enabled', contract.priceplans.id)) else: logger.debug("LLEGO45") db(db.shop.id==contract.contractedproducts.shop).update(status='enabled', priceplan=contract.priceplans.id) logger.debug("LLEGO46") # cambiar de contractedproducts fecha de start y expiration db(db.contractedproducts.id==contract.contractedproducts.id).update(start=now, expiration= now+inc) logger.debug("LLEGO47") #quitar saldo if contract.contractedproducts.credit_annotation: logger.debug("LLEGO48") accounting.annotation(contract.contractedproducts.orderlist, db.orders(contract.orders.id), positive=False) logger.debug("LLEGO49") db.commit() logger.debug("LLEGO50") #pasados 7 días borrar contrato, cambiar a plan gratuito y desactivar servicios si no lo estuviesen ya. elif contract.contractedproducts.expiration< (datetime.datetime.now() + datetime.timedelta(days=7)): logger.debug("LLEGO51") client = SoapClient(wsdl="http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None") logger.debug("LLEGO52") if client.disableDomainShop(contract.contractedproducts.user, contract.contractedproducts.shop)['result']=="0": logger.debug("LLEGO53") db(db.shop.id==contract.contractedproducts.shop).update(status='enabled', priceplan=db(db.priceplans.paymode=="free").select().first()["id"]) logger.debug("LLEGO54") db.commit() else: raise Exception("Imposible habilitar dominio userid: %s shopid: %s status:%s priceplan:%s" % (contract.contractedproducts.user, contract.contractedproducts.shop, 'enabled', db(db.priceplans.paymode=="free").select().first()["id"])) except Exception as ex: db.rollback() logger.debug("Error manage_plans_and_status %s" % ex)
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 order_approving(): if auth.has_membership('administradores') or auth.has_membership('superadministradores'): from shops import ContractedProduct, Product, Shop from invoices import Order, Orderlist, Invoice, CreditAccount, AccountingEntry from queuemail import Queuemail from gluon.contrib.pysimplesoap.client import SoapClient queue=Queuemail(db) ContractedProduct(db), Product(db), Shop(db), Order(db), Orderlist(db), AccountingEntry(db) order=db.orders(request.vars.order) # order=db.orders(orderid) try: if order: #crear factura invoice=Invoice(db) invoiceid=invoice.makeinvoice(order.id) #aquí se hace además la anotación positiva en creditaccount if invoiceid!=None: # notificar recepción del pago subject="[gextiendas] Factura Nº %s" % db.invoices(invoiceid).invoice_number queuedata=[] urlinvoice= '%(scheme)s://%(host)s%(url)s' % {'scheme':request.env.wsgi_url_scheme,'host':request.env.http_host, 'url':URL('payment','code',args=[order.payment_code.code])} data={ "now": datetime.datetime.now().strftime("%d-%m-%Y %H:%M"), "name": order.user.first_name, "code": order.payment_code.code, "url": urlinvoice, } plaintext=""" \t\t\t\t Fuengirola (Málaga), a %(now)s \n Estimado %(name)s, hemos recibido un pago mediante transferencia correspondiente a la referencia de pago: %(code)s \n Puede descargarse la factura siguiendo este enlace:\n %(url)s \n El equipo de GEXtiendas.\n """ % data html=""" <p>Fuengirola (Málaga), a %(now)s</p> <p>Estimado %(name)s, hemos recibido un pago mediante transferencia correspondiente a la referencia de pago: %(code)s</p> <p>Puede descargarse la factura siguiendo este enlace:</p> <p><a href='%(url)s'>%(url)s</a></p> <p>El equipo de GEXtiendas.</p> """ % data queuedata.append({ 'to': '%s'%order.user.email, 'subject':subject, 'message':plaintext, 'html':XML(html), 'template':'communications/paymentreceived_template.html', 'title':'Pago recibido: %s' % subject, 'unsubscribe':'' }) queue.queuemessage(queuedata) # # client = SoapClient(wsdl="http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None") # logger.debug(client.enableDomainShop()) # buscar si hay dominios que estén esperando ser habilitados en una tienda del productocontratado en la lista de ese pedido # activar dominio # anotar accountinentry negativo # actualizar crédito session.flash="Operación realizada con éxito" else: session.flash="Hubo un error y no se pudo aprobar el pedido" else: session.flash="Hubo un error. No se pudo aprobar el pedido" except Exception as ex: logger.debug(ex) session.flash="Ocurrió un error %s " % ex redirect(URL('administrator','orders')) else: redirect(URL(request.application,'default','user/login'))
def postcontracts(): import simplejson from dateutil.relativedelta import relativedelta if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): from shops import ContractedProduct, Product, Shop from invoices import Order, Orderlist, CreditAccount, AccountingEntry Order(db), Orderlist(db), Product(db), ContractedProduct(db), Shop(db) accounting = AccountingEntry(db) logger.debug(request.post_vars) data = simplejson.loads(request.post_vars.datacontracts) shopid = request.post_vars.shopid try: for d in data: #NO SE PUEDE HACER EL INSERT DIRECTAMENTE. HAY QUE VER SI EL SHOP YA TIENE CONTRATADO EL PRODUCTO. SI NO TIENE se hace un INSERT, si no, no hace nada. #Sólo se va a poder contratar una unidad y la recursividad y duración de la periodicidad harán el resto. orderlist = db(db.orderlist.id == int(d['orderlist'])).select( db.orderlist.ALL, db.products.ALL, db.orders.ALL, join=[ db.products.on(db.products.id == db.orderlist.product), db.orders.on(db.orders.id == db.orderlist.g_order) ]).first() contracted = db( (db.contractedproducts.shop == shopid) & (db.contractedproducts.user == session.usercontract) & (db.contractedproducts.product == orderlist.orderlist.product)).select().first() if not contracted: db.contractedproducts.insert( user=session.usercontract, product=orderlist.orderlist.product, period=orderlist.products. min_period, #optimizar para evitar más consultas autorenove=d['autorenove'], shop=shopid, orderlist=orderlist.orderlist.id, paymentmethod=orderlist.orders.payment_method, automatics_action=d['automatics_action'], notifications=d['notifications'], credit_annotation=d['credit_annotation'], invoice=request.vars.invoice) else: contracted.update_record( autorenove=d['autorenove'], automatics_action=d['automatics_action'], notifications=d['notifications'], credit_annotation=d['credit_annotation'], ) logger.debug("LLegoogoo1") #anotar crédito si orders pagado y si credit_annotation==True y si not in accountingentries if orderlist.orders.status == "Pagado" and d[ 'credit_annotation']: if not db((db.accountingentries.orderlist == orderlist.orderlist.id) & (db.accountingentries.active == True)).select( ).first(): logger.debug("LLegoogoo2") if not accounting.annotation( db.orderlist(orderlist.orderlist.id), db.orders(orderlist.orders.id), positive=True): raise Exception( "Ocurrió un error al hacer la anotación en postcontracts" ) logger.debug("LLegoogoo3") if contracted: if request.vars.invoice and contracted.invoice: if int(request.vars.invoice) > int( contracted.invoice): expiration = contracted.expiration if contracted.period == 'hours': #no usado por ahora inc = datetime.timedelta( hours=contracted.quantity) elif contracted.period == 'days': #no usado por ahora inc = datetime.timedelta( days=contracted.quantity) elif contracted.period == 'week': #no usado por ahora inc = datetime.timedelta( weeks=contracted.quantity) elif contracted.period == 'month': inc = relativedelta( months=contracted.quantity) horizon_date = 15 #15 días elif contracted.period == 'year': inc = relativedelta( years=contracted.quantity) horizon_date = 30 * 11 #días. No tengo en cuenta febreros ni bisiestos porque es sólo para hacer algo en 11 meses aprox. else: inc = datetime.timedelta(hours=0) if not accounting.annotation( db.orderlist( orderlist.orderlist.id), db.orders(orderlist.orders.id), positive=False): raise Exception( "Ocurrió un error al hacer la anotación en postcontracts" ) contracted.update_record( expiration=expiration + inc, invoice=request.vars.invoice) db.commit() session.flash = "Contratos creados correctamente" except Exception as ex: logger.debug("Se produjo un error en postcontracts %s" % ex) db.rollback() raise HTTP(500, ex) session.usercontract = None return "ok" else: return "no authorized"
def confirminvoice(): from invoices import Order, Invoice, Orderlist, CreditAccount, AccountingEntry from adminsettings import Adminsettings Adminsettings(db), Order(db), Invoice(db), Orderlist(db) accounting = AccountingEntry(db) from auxiliartools import AuxiliarTools external = AuxiliarTools(db) settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first() if auth.has_membership('superadministradores') or auth.has_membership( 'administradores'): try: if request.vars.budget != 'None' and request.vars.budget != None: order = db((db.orders.user == request.vars.customer) & ( db.orders.budget == request.vars.budget)).select().first() elif request.vars.order != 'None' and request.vars.order != None: order = db((db.orders.user == request.vars.customer) & ( db.orders.id == request.vars.order)).select().first() else: order = db((db.orders.user == request.vars.customer) & ( db.orders.status == "CreandoAdmin")).select().first() if not order.invoice: total = float(0) totaltax = float(0) orderlist = db(db.orderlist.g_order == order.id).select() fail = True if orderlist: fail = False for row in orderlist: total = total + (float(row.quantity) * float(row.price)) totaltax = (total * float(settings.tax)) / 100 if request.vars.paid == 'False': status = "Pendiente pago" else: status = "Pagado" payment_code = None if order.payment_method == "Transferencia": payment_code = db.paymentcodes.insert( code=external.generatecode()) db(db.orders.id == order.id).update( total="%.2f" % total, totaltax="%.2f" % totaltax, status=status, payment_code=payment_code, confirmed_at=datetime.datetime.now(), confirmed_ip=request.client, confirmed_by=auth.user_id) if request.vars.paid != 'False': invoiceid = Invoice(db).makeinvoice( order.id, None, True) #Factura pagada elif request.vars.paid == 'False': invoiceid = Invoice(db).makeinvoice( order.id, "Pendiente pago", True) #Pendiente de pago if request.vars.budget != 'None' and request.vars.budget != None: db(db.budgets.id == request.vars.budget).update( invoice=invoiceid) db.commit() # Al ser una factura manual, hay que buscar si hay contratos esperando de ser tratados tras el pago # buscar los contratos que pertenezcan a cada uno de los orderlist y si no están ya en accountingentries # hacer las anotaciones que se tengan que hacer si credit_annotation==True for row in orderlist: contract = db(db.contractedproducts.orderlist == row.id).select().first() if contract: #anotar crédito si orders pagado y si credit_annotation==True y si not in accountingentries if contract.credit_annotation == True: if not db( (db.accountingentries.orderlist == row.id) & (db.accountingentries.active == True) ).select().first(): if not accounting.annotation( row, order, positive=True): raise Exception( 'Ocurrió un error al hacer la anotación en billing.confirminvoice' ) else: redirect( URL(request.application, 'administrator', 'viewinvoice', args=invoiceid)) return dict() 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('billing', 'newinvoice', args=auth.user_id)) return dict() if fail: redirect( URL(request.application, 'administrator', 'editcustomer', args=request.vars.customer)) return dict() else: redirect( URL(request.application, 'administrator', 'viewinvoice', args=invoiceid)) return dict()