Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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'))
Ejemplo n.º 3
0
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())
Ejemplo n.º 4
0
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"
Ejemplo n.º 5
0
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),
Ejemplo n.º 6
0
	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)
Ejemplo n.º 7
0
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'))
Ejemplo n.º 8
0
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'))
Ejemplo n.º 9
0
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"
Ejemplo n.º 10
0
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()