Пример #1
0
def myservices():
    from shops import ContractedProduct, Product, Shop
    from invoices import Order, Orderlist
    from pagination import Pagination
    from adminsettings import Adminsettings
    Adminsettings(db)
    ContractedProduct(db), Product(db), Shop(db), Order(db), Orderlist(db)
    settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first()
    records = db((db.contractedproducts.id > 0)
                 & (db.contractedproducts.user == auth.user_id)).count()
    items_per_page = settings.orderlistitems
    pag = Pagination(records, items_per_page)
    contractedproducts = db((db.contractedproducts.id > 0) & (
        db.contractedproducts.user == auth.user_id)).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,
            limitby=pag.limitby())

    return dict(contractedproducts=contractedproducts,
                pagination=pag,
                records=records,
                items_per_page=items_per_page)
Пример #2
0
def editproduct():
	if auth.has_membership('administradores') or auth.has_membership('superadministradores'):
		from shops import Product, PricePlan
		from pagination import Pagination
		Product(db), PricePlan(db)

		if request.vars.productid:
			product=db(db.products.id==request.vars.productid).select(db.products.ALL, db.priceplans.planname, left=[db.priceplans.on(db.priceplans.id==db.products.plan)]).first()
			name= Field('name', 'string', length=128, default=product.products.name, notnull=True, unique=True, requires=IS_NOT_EMPTY())
			price=Field('price', 'decimal(10,2)', default=product.products.price, notnull=True, requires=[IS_NOT_EMPTY(error_message='el precio es obligatorio'),IS_DECIMAL_IN_RANGE(minimum=0, maximum=10000, error_message='el precio debe ser entre 0.00 y 10000.00')])
			description=Field('description', 'text', default=product.products.description, notnull=False)
			active=Field('active', 'boolean', default=product.products.active)
			subscription=Field('suscription', 'boolean', default=product.products.suscription)
			min_period=Field('min_period', 'string', length='16', notnull=False, default=product.products.min_period, requires=IS_EMPTY_OR(IS_IN_SET(['hours','days','week','month','year'], error_message="Elija un estado")))
			plan=Field('plan', 'reference priceplans', default=product.products.plan, notnull=False, requires=IS_EMPTY_OR(IS_IN_DB(db, db.priceplans.id,'%(planname)s', error_message="Debe escoger un plan")))
			builtin=Field('builtin', 'boolean', default=product.products.builtin)
			form = SQLFORM.factory(name, price, description, active, subscription, min_period,  plan, builtin, submit_button = 'Guardar', formstyle='bootstrap3_inline')
			if form.validate():
				db(db.products.id==product.products.id).update(**dict(form.vars))
				session.flash = 'Producto editado'
				redirect(URL('administrator','products'))
			elif form.errors:
				response.flash = 'Hay errores'
			else:
				response.flash = 'Por favor completa los campos'

			return dict(form=form)
		else:
			redirect(URL(request.application,'administrator','newproduct'))

	else:
		redirect(URL(request.application,'default','user/login'))
Пример #3
0
def index():
	from invoices import Fiscal, Order, Orderlist
	from shops import Product, PricePlan
	Fiscal(db), Product(db), PricePlan(db), Order(db), Orderlist(db)
	fiscal=db(db.fiscals.user==auth.user_id).select().first()
	order=None
	orderlist=None
	if fiscal:
		order=db((db.orders.user==auth.user_id) & (db.orders.status=="Creando")).select().first()
		if order:
			orderlist=db(db.orderlist.g_order==order.id).select()
			flatrate=False
			for item in orderlist:
				if item.product.plan:
					if item.product.plan.paymode=="flatrate":
						flatrate=True
		else:
			redirect(URL(c='account',f='index'))

	else:
		redirect(URL('myaccount', 'fiscal', vars=dict(wizard=True)))

	form=FORM(	INPUT(_type='radio', _name='paypal', _id='paypal', _value='paypal', value='yes').xml(),
				INPUT(_type='radio', _name='bank', _id='bank', _value='bank', value='no').xml(),
				INPUT(_name="confirm", _type='submit', _class="btn btn-grove-two btn-xlg"), _action=URL('confirm_order') )

	return dict(form=form, fiscal=fiscal, orderlist=orderlist, order=order, flatrate=flatrate)
Пример #4
0
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'))
Пример #5
0
def contractedproducts():
	if auth.has_membership('administradores') or auth.has_membership('superadministradores'):

		from shops import ContractedProduct, Product, Shop
		from invoices import Order, Orderlist
		from pagination import Pagination
		ContractedProduct(db), Product(db), Shop(db), Order(db), Orderlist(db)
		settings = db(db.adminsettings.id>0).select(db.adminsettings.ALL).first()
		records=db(db.contractedproducts.id>0).count()
		items_per_page=settings.orderlistitems
		pag=Pagination(records, items_per_page)
		contractedproducts = db(db.contractedproducts.id>0).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, limitby=pag.limitby())

		return dict(contractedproducts=contractedproducts, pagination=pag, records=records, items_per_page=items_per_page)

	else:
		redirect(URL(request.application,'default','user/login'))
Пример #6
0
def profileplans():
	if auth.has_membership('administradores') or auth.has_membership('superadministradores'):
		from shops import Product, PricePlan, ProfilePlan
		from pagination import Pagination
		Product(db), PricePlan(db), ProfilePlan(db)
		prod=request.vars.product
		pricep=request.vars.priceplan

		if (prod!=None) and (pricep!=None):
			try:
				db.profileplans.insert(priceplan=pricep, product=prod)
			except Exception as ex:
				db.rollback()
				logger.debug("ocurrió un error al crear un perfil de plan")
				response.flash="ocurrió un error al crear un perfil de plan"
				
		profileplans=db(db.profileplans.id>0).select(	db.profileplans.ALL,
														db.priceplans.planname,
														db.products.name,
														join=[	db.priceplans.on(db.priceplans.id==db.profileplans.priceplan),
																db.products.on(db.products.id==db.profileplans.product)],
														orderby=db.profileplans.priceplan)
		return dict(profileplans=profileplans, 
					records=db(db.profileplans.id>0).count(), 
					priceplans=db(db.priceplans.id>0).select(), 
					products=db(db.products.id>0).select())
	else:
		redirect(URL(request.application,'default','user/login'))
Пример #7
0
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()
Пример #8
0
def delitem():
    if auth.has_membership('superadministradores') or auth.has_membership(
            'administradores'):
        from invoices import Invoice, Order, Orderlist
        from shops import Product
        from adminsettings import Adminsettings
        Adminsettings(db), Invoice(db), Order(db), Orderlist(db), Product(db)
        settings = db(db.adminsettings.id > 0).select(
            db.adminsettings.ALL).first()

        order = db((db.orders.user == request.vars.customer)
                   & (db.orders.id == request.vars.orderid)).select().first()
        try:
            db((db.orderlist.id == request.vars.id)
               & (db.orderlist.g_order == order.id)).delete()
            db.commit()
        except:
            db.rollback()

        return db((db.orderlist.g_order == order.id)).select(
            db.orderlist.ALL,
            db.products.name,
            db.products.id,
            join=[db.products.on(db.products.id == db.orderlist.product)
                  ]).as_list()
    else:
        return dict()
Пример #9
0
def vieworder():
    if auth.has_membership('administradores') or auth.has_membership(
            'superadministradores'):
        from invoices import Order, Orderlist
        from shops import Product
        Order(db), Orderlist(db), Product(db)
        order = db(db.orders.id == request.args(0)).select(
            db.orders.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.orders.user),
                db.fiscals.on(db.fiscals.user == db.auth_user.id)
            ]).first()

        if order:
            orderlist = db(db.orderlist.g_order == order.orders.id).select(
                db.orderlist.ALL,
                db.products.ALL,
                left=[db.products.on(db.products.id == db.orderlist.product)])

            return dict(order=order, orderlist=orderlist)
        else:
            redirect(URL(request.application, 'administrator', 'users'))
    else:
        redirect(URL(request.application, 'default', 'user/login'))
Пример #10
0
def datashop():
    from shops import Shop, DomainShop, ContractedProduct, Product
    from invoices import Order
    Shop(db), DomainShop(db), ContractedProduct(db), Product(db), Order(db)
    #store=db((db.shop.user==auth.user_id) & (db.shop.host==request.vars.host)).select()
    stores = db((db.shop.host == request.vars.host)
                & (db.shop.user == auth.user_id)).select(
                    db.shop.ALL,
                    db.domainshops.ALL,
                    db.priceplans.ALL,
                    left=[
                        db.domainshops.on(db.domainshops.shop == db.shop.id),
                        db.priceplans.on(db.priceplans.id == db.shop.priceplan)
                    ])

    contractedproducts = db(
        (db.contractedproducts.user == auth.user_id)
        & (db.contractedproducts.shop == stores[0].shop) &
        (db.contractedproducts.expiration <= datetime.datetime.now())).select(
            db.contractedproducts.ALL,
            db.products.ALL,
            left=[
                db.products.on(db.products.id == db.contractedproducts.product)
            ])
    return dict(stores=stores,
                host=stores[0].shop.host,
                ip=stores[0].shop.ip,
                contractedproducts=contractedproducts)
Пример #11
0
def newproduct():
	if auth.has_membership('administradores') or auth.has_membership('superadministradores'):
		from shops import Product, PricePlan
		from pagination import Pagination
		Product(db), PricePlan(db)
		name= Field('name', 'string', label="Nombre", length=128, notnull=True, unique=True, requires=IS_NOT_EMPTY())
		price=Field('price', 'decimal(10,2)', label="Precio", notnull=True, requires=[IS_NOT_EMPTY(error_message='el precio es obligatorio'),IS_DECIMAL_IN_RANGE(minimum=0, maximum=10000, error_message='el precio debe ser entre 0.00 y 10000.00')])
		description=Field('description', 'text', label="Descripción",notnull=True, requires=IS_NOT_EMPTY(error_message='se necesita una descripción'))
		active=Field('active', 'boolean', default=True)
		subscription=Field('suscription', 'boolean', default=True)
		min_period=Field('min_period', 'string', length='16', notnull=False, default='month', requires=IS_EMPTY_OR(IS_IN_SET(['hours','days','week','month','year'], error_message="Elija un estado")))
		plan=Field('plan', 'reference priceplans', default=None, notnull=False, requires=IS_EMPTY_OR(IS_IN_DB(db, db.priceplans.id,'%(planname)s', error_message="Debe escoger un plan")))
		builtin=Field('builtin', 'boolean', default=False)
		form = SQLFORM.factory(name, price, description, active, subscription, min_period, plan, builtin, submit_button = 'Guardar', formstyle='bootstrap3_inline')

		if form.validate():
			db.products.insert(**dict(form.vars))
			session.flash = 'Producto creado'
			redirect(URL('administrator','products'))
		elif form.errors:
			response.flash = 'Hay errores'
		else:
			response.flash = 'Por favor completa los campos'

		return dict(form=form)
Пример #12
0
	def __init__(self,db):
		Product(db)
		self.db=db 
		try:
			Fiscal(db)
			self.define_tables()
		except:
			pass
Пример #13
0
def enabledomain():
    from shops import Shop, DomainShop, PricePlan, ContractedProduct, Product
    Shop(db), DomainShop(db), PricePlan(db), ContractedProduct(db), Product(db)

    shop = db((db.shop.host == request.vars.host)
              & (db.shop.user == auth.user_id)).select().first()

    if shop:
        if shop.priceplan.paymode == 'free':
            #hay que pasar por caja, pero antes comprobar si hay algún pedido en planes distintos a free para esta tienda pendiente de ser aprobado
            pending = db((db.contractedproducts.shop == shop.id)
                         & (db.contractedproducts.user == auth.user_id)
                         & (db.contractedproducts.start == None)
                         & ((db.priceplans.paymode != None)
                            & (db.priceplans.paymode != 'free'))).select(
                                db.contractedproducts.id,
                                join=[
                                    db.products.on(db.products.id == db.
                                                   contractedproducts.product),
                                    db.priceplans.on(
                                        db.priceplans.id == db.products.plan)
                                ]).first()
            logger.debug(
                db((db.contractedproducts.shop == shop.id)
                   & (db.contractedproducts.user == auth.user_id)
                   & (db.contractedproducts.start == None)
                   & ((db.priceplans.paymode != None)
                      & (db.priceplans.paymode != 'free')))._select(
                          db.contractedproducts.id,
                          join=[
                              db.products.on(db.products.id ==
                                             db.contractedproducts.product),
                              db.priceplans.on(
                                  db.priceplans.id == db.products.plan)
                          ]))

            if pending == None:
                if request.vars.host:
                    redirect(
                        URL(request.application,
                            'plans',
                            'index',
                            vars=dict(host=request.vars.host)))
            else:
                session.flash = "Este pedido para cambiar de plan, estaba pendiente de confirmación pago"
                redirect(URL('payment', 'index'))

        else:
            #este dominio está en shop con un priceplan de pago, así que se puede llamar al api de internalgexcommerce para configurar el apache
            logger.debug("de pagoooo")
    else:
        session.flash = "No podemos encontrar la tienda %s" % request.vars.host
        redirect(URL('index'))
Пример #14
0
def del_profileplans():
	if auth.has_membership('administradores') or auth.has_membership('superadministradores'):
		from shops import Product, PricePlan, ProfilePlan
		from pagination import Pagination
		Product(db), PricePlan(db), ProfilePlan(db)
		try:
			if db(db.profileplans.id==request.vars.deleteid).delete():
				return "OK"
			else:
				return "Fail"
		except Exception, ex:
			logger.debug('hubo un error al borrar el profileplans id: %    error: %' % (request.vars.deleteid, ex))
			return "Fail"
Пример #15
0
def createcontracts():
    if auth.has_membership('superadministradores') or auth.has_membership(
            'administradores'):
        from shops import ContractedProduct, Product, Shop
        from invoices import Order, Orderlist
        Product(db), ContractedProduct(db), Order(db), Orderlist(db), Shop(db)
        if not request.vars.invoice == 'None' and not request.vars.invoice == None:
            g_order = db(db.orders.invoice ==
                         request.vars.invoice).select().first()["id"]
        else:
            g_order = request.vars.order

        if not request.vars.shop:
            shop = db(db.shop.user == request.args(0)).select()
        else:
            shopid = request.vars.shop

        if not shop:
            redirect(
                URL('contracts',
                    'createmanualshop',
                    args=request.args(0),
                    vars=dict(invoice=request.vars.invoice,
                              order=request.vars.order)))
        else:
            shopid = shop[0].id

        contractedproducts = db(
            (db.orderlist.g_order == g_order)
            & (db.orders.user == request.args(0))
            & ((db.contractedproducts.shop == shopid)
               | (db.contractedproducts.shop == None))).select(
                   db.orders.ALL,
                   db.orderlist.ALL,
                   db.contractedproducts.ALL,
                   db.products.ALL,
                   left=[
                       db.orderlist.on(db.orders.id == db.orderlist.g_order),
                       db.products.on(db.products.id == db.orderlist.product),
                       db.contractedproducts.on(
                           db.contractedproducts.product == db.products.id)
                   ],
                   groupby=db.orderlist.id)

        session.usercontract = request.args(0)
        return dict(contractedproducts=contractedproducts,
                    shop=shop,
                    shopid=shopid)
    else:
        redirect(URL(request.application, 'default', 'user/login'))
Пример #16
0
def products():
	if auth.has_membership('administradores') or auth.has_membership('superadministradores'):
		from shops import Product, PricePlan
		from pagination import Pagination
		Product(db), PricePlan(db)

		settings = db(db.adminsettings.id>0).select(db.adminsettings.ALL).first()
		records=db(db.products.id>0).count()
		items_per_page=settings.productitems
		pag=Pagination(records, items_per_page)
		products=db(db.products.id>0).select(db.products.ALL, db.priceplans.planname, left=[db.priceplans.on(db.priceplans.id==db.products.plan)], orderby=db.products.id, limitby=pag.limitby())
		return dict(products=products, pagination=pag, records=records, items_per_page=items_per_page)
	else:
		redirect(URL(request.application,'default','user/login'))
Пример #17
0
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'))
Пример #18
0
def items():
    if auth.has_membership('superadministradores') or auth.has_membership(
            'administradores'):
        from invoices import Invoice, Order, Orderlist
        from shops import Product
        from adminsettings import Adminsettings
        Adminsettings(db), Invoice(db), Order(db), Orderlist(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 order abierta y si no crearla
        order = db((db.orders.user == request.vars.customer)
                   & (db.orders.id == request.vars.orderid)).select().first()

        try:
            if not order:
                orderid = db.orders.insert(status="CreandoAdmin",
                                           user=request.vars.customer,
                                           payment_method='Transferencia',
                                           tax=settings.tax,
                                           manual_operation=True)
                order = db.orders(orderid)

            return db((db.orderlist.g_order == order.id)).select(
                db.orderlist.ALL,
                db.products.name,
                db.products.id,
                join=[db.products.on(db.products.id == db.orderlist.product)
                      ]).as_list()

        except Exception as ex:
            logger.debug(ex)
            db.rollback()
    else:
        return dict()
Пример #19
0
	def basicProducts(self):
		from shops import Product, PricePlan, ProfilePlan
		db=self.db
		Product(db), PricePlan(db), ProfilePlan(db)
		if db(db.products).isempty():
			db.products.insert(	name="Tarifa plana", 
								price="18.00", 
								plan=3,
								min_period="month",
								description="Vende lo que quieras y paga siempre lo mismo. Con certificado SSL incluído.")
			db.products.insert(	name="Carga crédito mínimo 'Paga si vendes'",
								price="40.00",
								plan=2,
								suscription=False,
								description="Para que si se disparan tus ventas, controles tu gasto con un límite de 40€")									
			db.products.insert(	name="Plan Asistido", 
								price="199.00", 
								plan=4,
								min_period="month",
								description="Con asistencia telefónica y Comunity Management Básico incluído todos los meses")
			db.products.insert(	name="Plan Difusión", 
								price="399.00", 
								plan=6,
								min_period="month",
								description="Community Management Avanzado mes a mes")
			db.products.insert(	name="Certificado SSL",
								min_period="year",
								price="15.00")
			db.products.insert( name="Certificado SSL (Planes por Suscripción)",
								min_period="year",
								price="0.00")
			db.products.insert(	name="Pack iniciación", 
								price="450.00",
								suscription=False,
								description="incluye la modificación de la plantilla para la inserción de logotipos y de imágenes de productos en Slider de presentación, compuesto por tres imágenes completamente montadas para promoción de tres artículos o servicios.")			
			db.products.insert(	name="Asistencia telefónica bono 5h", 
								price="210.00",
								suscription=False,
								description="Por si necesitas algo más, que la asistencia incluída en tu plan")
			db.products.insert(	name="Asistencia telefónica bono 10h", 
								price="380.00",
								suscription=False,
								description="Por si necesitas algo más, que la asistencia incluída en tu plan")
			db.products.insert(	name="Asistencia telefónica bono 15h", 
								price="480.00",
								suscription=False,
								description="Por si necesitas algo más, que la asistencia incluída en tu plan")
			db.products.insert(	name="Pack video corporativo",
								suscription=False,
								price="150.00",
								description="Filmación profesional en vídeo del negocio físico o productos para la creación de un video corporativo de aproximadamente 50 segundos una vez editado, asi como sesión de fotos profesional de artículos (de 10 a 15 tomas)")
			db.products.insert(	name="Community Management Básico", 
								price="200.00",
								description="Creación de identidad digital y un mes de difusión/discusión semanal en Facebook y twitter sobre productos y servicios.")
			db.products.insert(	name="Community Management Avanzado",
								price="300.00",
								description="Creación de identidad digital  y un mes de difusión/discusión semanal en Facebook, Twitter, Google+ y blog de empresa, sobre productos y servicios.")
			db.products.insert(	name="Facebook Social Management",
								price="60.00",
								description="Dos entradas semanales en Facebook")
			db.products.insert(	name="Twitter Social Management",
								price="60.00",
								description="Dos tweets semanales")
			db.products.insert(	name="Blog Social Management",
								price="80.00",
								description="Una entrada semanal en Blog")
			db.products.insert(	name="Google+ Social Management",
								price="60.00",
								description="Dos entradas semanales en tu comunidad Google+")
			db.products.insert(	name="Campaña SEO", 
								price="250.00",
								suscription=False,
								description="Análisis, adecuación de la tienda y puesta en marcha de estrategia.")
			db.products.insert(	name="SEM en Google adwords express", 
								price="130.00",
								active=False,
								suscription=False,
								description="Colocación y monitorización del anuncio y creación del Landing Page")
			db.products.insert(	name="SEM en Google adwords", 
								price="130.00",
								active=False,
								suscription=False,
								description="Colocación y monitorización del anuncio y creación del Landing Page")
			db.products.insert(	name="Ads en Facebook", 
								price="130.00",
								active=False,
								suscription=False,
								description="Colocación y monitorización del anuncio y creación del Landing Page")
			db.products.insert(	name="SEM en Bing", 
								price="130.00",
								active=False,
								suscription=False,
								description="Colocación y monitorización del anuncio y creación del Landing Page")
			db.products.insert(	name="Servicio de introducción de productos en tu catálogo", 
								price="28.00",
								suscription=False,
								description="Añadimos los productos que desees y su información relacionada: SEO, categoría, asociaciones, atributos y valores, marca del producto, ilustración del producto, marca de agua, 3 imágenes por artículo, existencias, administrar proveedor, tags.")

			db.products.insert(	name="Adecuación LOPD", 
								price="140.00",
								suscription=False,
								active=False,
								description="Para que cumplas con la Ley Orgánica de protección de datos, adecuamos tu tienda, desarrollamos el documento de seguridad, los contratos de acceso a datos por parte de terceros (asesorías, seguros, informáticos), te facilitamos toda la documentación relacionada y registramos los ficheros de datos personales en la Agencia de Protección de Datos. Además te damos un año de consultoría legal sobre LOPD totalmente gratis")
			
			db.products.insert(	name="Adecuación LSSICE", 
								price="60.00",
								suscription=False,
								active=False,
								description="Adaptamos su tienda para que cumpla la Ley de Servicios de la Sociedad de la Información y Comercio Electrónico, de obligado cumplimiento.")

			db.profileplans.insert(	product=db(db.products.name=="Carga crédito mínimo 'Paga si vendes'").select().first()['id'],
									priceplan=db(db.priceplans.planname=="Paga si vendes").select().first()['id'])

			db.profileplans.insert(	product=db(db.products.name=="Certificado SSL").select().first()['id'],
									priceplan=db(db.priceplans.planname=="Paga si vendes").select().first()['id'])

			db.profileplans.insert(	product=db(db.products.name=="Tarifa Plana").select().first()['id'],
									priceplan=db(db.priceplans.planname=="Tarifa plana").select().first()['id'])

			db.profileplans.insert(	product=db(db.products.name=="Certificado SSL (Planes por Suscripción)").select().first()['id'],
									priceplan=db(db.priceplans.planname=="Tarifa plana").select().first()['id'])
Пример #20
0
import os
import socket
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]
Пример #21
0
def payment():
    from invoices import Order, Orderlist
    from shops import Product, Shop, DomainShop, ContractedProduct
    from adminsettings import Adminsettings
    from auxiliartools import AuxiliarTools
    Adminsettings(db)
    settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first()
    Shop(db), Order(db), Orderlist(db), Product(db), DomainShop(
        db), ContractedProduct(db)
    external = AuxiliarTools(db)

    host = request.vars.host
    plan = request.vars.plan
    cert = request.vars.cert
    if host and plan and cert:  #hay que comprobar que viene por request un plan asignado a una tienda con el dato del cert
        try:
            db((db.orders.status == 'Creando')
               & (db.orders.user == auth.user_id)).delete(
               )  #sólo puede haber un pedido en estado de creación.
            plan = db(db.priceplans.id == request.vars.plan).select().first()
            shop = db((db.shop.host == request.vars.host)
                      & (db.shop.user == auth.user_id)).select().first()
            if shop and plan:  #comprobar que existe y es suyo (siempre por seguridad)
                profileplans = db(db.profileplans.priceplan == plan).select()
                total = float(0)
                for profileplan in profileplans:
                    if profileplan.active:
                        product = db(db.products.id ==
                                     profileplan.product).select().first()

                        if product.name.find("SSL") != -1 and cert == "false":
                            continue
                        total = total + float(product.price)

                orderid = db.orders.insert(
                    user=auth.user_id,
                    total=total,
                    totaltax="%.2f" % float(
                        ((total * float(settings.tax)) / 100)),
                    status="Creando",
                    payment_code=db.paymentcodes.insert(
                        code=external.generatecode()),
                    payment_method=None)
                for profileplan in profileplans:
                    if profileplan.active:
                        product = db(db.products.id ==
                                     profileplan.product).select().first()
                        if product.name.find("SSL") != -1 and cert == "false":
                            continue
                        orderlistid = db.orderlist.insert(
                            product=product.id,
                            g_order=orderid,
                            quantity=1,
                            price=product.price,
                            price_wdto=product.price,
                            tax=settings.tax)

                        #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.
                        #En realidad esta comprobación no hace falta porque no se va a dar este caso, pero sí en contracts.postcontracts por ser una generación de contratos manual .
                        #Sólo se va a poder contratar una unidad y la recursividad y duración de la periodicidad harán el resto.

                        contracted = db(
                            (db.contractedproducts.shop == shop.id)
                            & (db.contractedproducts.user == auth.user_id)
                            & (db.contractedproducts.product == product.id)
                        ).select().first()

                        if not contracted:
                            db.contractedproducts.insert(
                                user=auth.user_id,
                                product=product.id,
                                period=product.min_period,
                                autorenove=product.suscription,
                                start=None,
                                renove=None,  #fecha de la renovación.
                                expiration=None,
                                shop=shop.id,
                                orderlist=orderlistid,
                                paymentmethod=None)

                db.commit()
                return "OK"
        except Exception as ex:
            session.flash = "Ocurrió un error al crear el pedido %s" % ex
            redirect(request.env.http_referer)

    else:
        session.flash = "Disculpen la molestias. No podemos encontrar la información requerida"
        redirect(request.application, 'account', 'index')
Пример #22
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"
Пример #23
0
def item():
    if auth.has_membership('superadministradores') or auth.has_membership(
            'administradores'):

        from shops import Product
        from invoices import Order, Orderlist
        from adminsettings import Adminsettings
        Adminsettings(db), Order(db), Orderlist(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 order abierta y si no crearla
        if request.vars.orderid:
            order = db((db.orders.user == request.vars.customer) & (
                db.orders.id == request.vars.orderid)).select().first()
        else:
            order = db((db.orders.user == request.vars.customer) &
                       (db.orders.status == "CreandoAdmin")).select().first()
        if not order and request.vars.operation == "add":
            orderid = db.orders.insert(status="CreandoAdmin",
                                       user=request.vars.customer,
                                       payment_method='Transferencia',
                                       tax=settings.tax,
                                       manual_operation=True)
            order = db.orders(orderid)

        orderlist_id = None
        try:
            #add/del product y quantity.
            row = db((db.orderlist.product == request.vars.product)
                     & (db.orderlist.g_order == order.id)).select().first()

            if row:
                orderlist_id = row.id

                if request.vars.operation == "add":
                    db(db.orderlist.id == orderlist_id).update(
                        quantity=int(row.quantity) +
                        int(request.vars.quantity))

                elif request.vars.operation == "set":

                    db(db.orderlist.id == orderlist_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.
                orderlist_id = db.orderlist.insert(
                    product=request.vars.product,
                    g_order=order.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.orderlist.g_order == order.id)).select(
            db.orderlist.ALL,
            db.products.name,
            join=[db.products.on(db.products.id == db.orderlist.product)
                  ]).as_list()
        return data
    else:
        return dict()
Пример #24
0
def printorder():
    import os, uuid, subprocess
    import gluon.contenttype, gluon.globals
    from appy.pod.renderer import Renderer
    from invoices import Order, Orderlist
    from shops import Product
    from adminsettings import Adminsettings
    Adminsettings(db), Order(db), Orderlist(db), Product(db)
    settings = db(db.adminsettings.id > 0).select(db.adminsettings.ALL).first()
    if auth.has_membership('superadministradores') or auth.has_membership(
            'administradores'):

        order = db(db.orders.id == request.args(0)).select(
            db.orders.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.orders.user),
                db.fiscals.on(db.fiscals.user == db.auth_user.id)
            ]).first()
        if order:
            ordernumber = "%s" % order.orders.id
            orderdate = "%s" % order.orders.ordered_at.strftime("%d-%m-%Y")
            customernumber = "%s" % order.auth_user.email
            customernif = "%s" % ("", order.fiscals.tax_identification
                                  )[order.fiscals.tax_identification != None]
            nombre = "%s" % (
                "%s %s" %
                (order.auth_user.first_name, order.auth_user.last_name),
                order.fiscals.fiscalname)[order.fiscals.fiscalname != ""]
            domicilio = "%s" % (
                "", order.fiscals.address)[order.fiscals.address != None]
            domicilio2 = "%s %s %s" % (
                ("",
                 order.fiscals.postal_code)[order.fiscals.postal_code != None],
                ("", order.fiscals.city)[order.fiscals.city != None],
                ("", order.fiscals.province)[order.fiscals.province != None])
            telefono = "%s" % order.fiscals.country
            fax = "%s" % order.fiscals.phone

            iva = "%.2f" % order.orders.tax
            totaliva = "%.2f" % float(order.orders.totaltax)
            total = "%.2f" % float(order.orders.total)
            totalorder = "%.2f" % float(
                float(order.orders.total) + float(order.orders.totaltax))

            items = []

            for item in db(db.orderlist.g_order == order.orders.id).select(
                    db.orderlist.ALL,
                    db.products.ALL,
                    left=[
                        db.products.on(db.products.id == db.orderlist.product)
                    ]):

                tax_result = "%.2f" % (
                    ((float(item.orderlist.price) *
                      (float(item.orderlist.quantity))) *
                     float(item.orderlist.tax)) / float(100))

                items.append(
                    dict(
                        id="%s" % item.products.id,
                        name="%s" % item.products.name,
                        cant="%s" % item.orderlist.quantity,
                        price="%.2f" % float(item.orderlist.price),
                        percent="%.2f" % float(
                            item.orderlist.tax
                        ),  #se refiere al iva, pero en el .odt puse este nombre de variable por una ida de olla.
                        total="%.2f" % (float(item.orderlist.quantity) *
                                        float(item.orderlist.price))))

            try:

                # Report creation
                template_file = os.path.join(request.folder, 'private',
                                             'order.odt')
                # tmp_uuid = uuid.uuid4()
                output_file_odt = os.path.join(
                    request.folder, 'private', 'tmp',
                    '%s_%s.odt' % ("pedido", order.orders.id))
                output_file_pdf = os.path.join(
                    request.folder, 'private', 'tmp',
                    '%s_%s.pdf' % ("pedido", order.orders.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' % (
                        "pedido", order.orders.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 pedido, 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)))
Пример #25
0
def neworder():

    from shops import Product
    from invoices import Fiscal, Order, Orderlist, Budgetlist
    from adminsettings import Adminsettings
    Adminsettings(db), Product(db), Fiscal(db), Order(db), Orderlist(
        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,
                                               tax=settings.tax,
                                               payment_method='Transferencia',
                                               manual_operation=True)
                    order = db.orders(orderid)
                    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)

            else:

                if request.args(1):
                    order = db((db.orders.user == request.args(0)) & (
                        db.orders.id == request.args(1))).select().first()
                else:
                    order = db((db.orders.user == request.args(0)) & (
                        db.orders.status == "CreandoAdmin")).select().first()

                if not order:
                    orderid = db.orders.insert(status="CreandoAdmin",
                                               tax=settings.tax,
                                               user=request.args(0),
                                               payment_method='Transferencia',
                                               manual_operation=True)
                    order = db.orders(orderid)

            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=order.tax,
                        order=order)
        else:
            redirect(URL(request.application, 'administrator', 'users'))
    else:
        redirect(URL(request.application, 'default', 'user/login'))
Пример #26
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'))
Пример #27
0
#*/1 * * * * cd /home/gextiendas/web2py && /usr/bin/python web2py.py -S gextiendas -M -R applications/gextiendas/private/managetools/managedomains_contracts.py >> /tmp/manage_domains_contracts.out 2>&1

#este cron busca dominios para activar/desactivar en tiendas

# client = SoapClient(wsdl="http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None")

# client = SoapClient(wsdl="http://localhost:8000/internalgexcommerce/default/call/soap?WSDL=None")
# logger.debug(client.addShopSite(auth.user_id))

#buscar contratos cuya fecha de expiración sea NULL o >= CURRENT_DATE() y plan distinto de NULL o free

from gluon import *
from shops import ContractedProduct, Product, PricePlan, Shop
from invoices import Order, Orderlist
contract = ContractedProduct(db)
Product(db), PricePlan(db), Shop(db), Orderlist(db), Order(db)

mcontracts = db(
    ((db.contractedproducts.expiration == None)
     | (db.contractedproducts.expiration >= datetime.datetime.now()))
    & ((db.profileplans.active == True) & (db.priceplans.planname != "free")
       & (db.contractedproducts.active == True))).select(
           db.contractedproducts.ALL,
           db.products.plan,
           db.products.price,
           db.products.suscription,
           db.products.name,
           db.priceplans.planname,
           db.priceplans.id,
           db.profileplans.ALL,
           db.orders.ALL,
Пример #28
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'))