odex25_standard/odex25_ensan/odex_benefit/controllers/benefit_services.py

384 lines
17 KiB
Python

# -*- coding: utf-8 -*-
import re
from odoo.tools.translate import _
from odoo.http import request
import base64
import json
import logging
from odoo import http, modules
_logger = logging.getLogger(__name__)
class services(http.Controller):
def get_server_error(self, e):
x = False
if len(e.args) == 2:
x, y = e.args
x = re.sub('\n', '', x)
else:
x = e.args
text = (_("Contact Admin"))
message = "%s, %s" % (x, text)
return message
def get_validation_error(self, filed_id):
filed = filed_id.replace('_', ' ')
result = ({'status': False, 'msg': (
_('Enter The ' + filed)), 'data': {'filed': filed_id}})
return result
# restaurant
@http.route(['/services/restaurant/add_profile'], type="http", auth="public", website=True, method=['POST'],
csrf=False)
def add_restaurant_profile(self, **kw):
values = {}
li = ['name', 'surplus_type', 'zone', 'neighborhood',
'city_id', 'address', 'lat', 'lon']
for filed in li:
if not kw.get(filed, False):
error = self.get_validation_error(filed)
return json.dumps(error)
if request.session.uid:
partner = request.env['res.partner'].sudo().search(
[('user_id', '=', request.session.uid)])
values['partner_id'] = partner.id
for field_name, field_value in kw.items():
values[field_name] = field_value
values['surplus_type'] = [1, 2] # TODO
surplus = request.env['benefit.food.surplus'].sudo().create(values)
surplus.surplus_type = values['surplus_type']
if surplus:
data = {'status': True, 'msg': (
_('Record created ')), 'data': {}}
else:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
else:
data = {'status': False, 'msg': (_('need user')), 'data': {}}
return json.dumps(data)
# restaurant
@http.route(['/services/restaurant/add_food'], type="http", auth="public", website=True, method=['POST'],
csrf=False)
def add_restaurant_food(self, id, **kw):
values = {}
li = ['surplus_type', 'surplus_count', 'date_start',
'date_end', 'quantity', 'description']
for filed in li:
if not kw.get(filed, False):
error = self.get_validation_error(filed)
return json.dumps(error)
for field_name, field_value in kw.items():
values[field_name] = field_value
values['food_surplus_id'] = id
surplus = request.env['food.surplus.line'].sudo().create(values)
if surplus:
data = {'status': True, 'msg': (_('Record created ')), 'data': {}}
else:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
return json.dumps(data)
@http.route(['/services/restaurant/request_food'], type="http", auth="public", website=True, method=['POST'],
csrf=False)
def request_restaurant_food(self, id):
user_id = request.env['grant.benefit'].sudo().search(
[('user_id', '=', request.session.uid)])
food = request.env['food.surplus.line'].sudo().search([
('id', '=', id)])
if user_id:
foods = food.sudo().benefit_ids = [(4, user_id.id)]
print(foods)
if foods:
data = {'status': True, 'msg': (_('Request created ')), 'data': {}}
else:
data = {'status': False, 'msg': (_('Request Not created created ')), 'data': {}}
# # Todo: add is_available check
# TODO return barcode after request
# if food.is_available:
# data = {'status': True, 'msg': (_('Record created ')), 'data': {}}
# else:
# data = {'status': False, 'msg': (_('Record Not created ')), 'data': {}}
#
return json.dumps(data)
################ get function ##################
# ZkataAlfter
@http.route(['/services/zkat_alfter'], type="http", auth="public", website=True, method=['GET'],
csrf=False)
def get_all_zkat(self):
try:
data = request.env['receive.benefit.zkat'].sudo().search(
[('state', '=', 'receiving')])
data = {'status': True, 'msg': (_('zkat Found')),
'data': [(s.id, s.name, s.description, s.uint_price, str(s.date_from), str(s.date_to)) for s in data]}
return json.dumps(data)
except Exception as e:
_logger.error(str(e))
message = self.get_server_error(e)
data = {'status': False, 'msg': message}
return json.dumps(data)
@http.route(['/services/receive_zkat'], type="http", auth="public", website=True, method=['POST'], csrf=False)
def add_zakat(self, id, **kw):
values = {}
if not kw.get('donor_name', False):
return json.dumps({'status': False, 'msg': (_('donor_name')), 'data': {}})
if not kw.get('donation_type', False):
return json.dumps({'status': False, 'msg': (_('donation_type')), 'data': {}})
if kw.get('donation_type', False) == 'cash' or kw.get('donation_type', False) == 'both':
if not kw.get('amount', False):
return json.dumps({'status': False, 'msg': (_('amount')), 'data': {}})
if kw.get('donation_type', False) == 'material' or kw.get('donation_type', False) == 'both':
if not kw.get('quantity', False):
return json.dumps({'status': False, 'msg': (_('quantity')), 'data': {}})
values['receive_zkat_id'] = id
for field_name, field_value in kw.items():
if field_name == 'donor_name' or field_name == 'phone_number' or field_name == 'donation_type' or field_name == 'amount' or field_name == 'quantity':
values[field_name] = field_value
else:
continue
# todo online payment
collection = request.env['payment.collection.line'].sudo().create(
values)
if collection:
data = {'status': True, 'msg': (_('Record created ')), 'data': {}}
else:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
return json.dumps(data)
@http.route(['/services/food_basket'], type="http", auth="public", website=True, method=['GET'],
csrf=False)
def get_all_basket(self):
try:
data = request.env['receive.food.basket'].sudo().search(
[('state', '=', 'receiving')])
results = []
if data:
results.append(({'basket': [{'id': s.id, 'name': s.name, 'description': s.description,
'date_start': str(s.date_start), 'date_end': str(s.date_end)} for s in data]}))
data = {'status': True, 'data': results}
return json.dumps(data)
except Exception as e:
_logger.error(str(e))
message = self.get_server_error(e)
data = {'status': False, 'msg': message}
return json.dumps(data)
@http.route(['/services/add_food_basket'], type="http", auth="public", website=True, method=['POST'],
csrf=False)
def add_food_basket(self, id, **kw):
values = {}
if not kw.get('name', False):
return json.dumps({'status': False, 'msg': (_('name')), 'data': {}})
if not kw.get('phone_number', False):
return json.dumps({'status': False, 'msg': (_('phone_number')), 'data': {}})
if not kw.get('donation_type', False):
return json.dumps({'status': False, 'msg': (_('donation_type')), 'data': {}})
# if not kw.get('qty', False):
# return json.dumps({'status': False, 'msg': (_('qty')), 'data': {}})
values['food_basket_id'] = id
values['donation_method'] = 'outside'
for field_name, field_value in kw.items():
if field_name == 'name' or field_name == 'phone_number' or field_name == 'donation_type' or field_name == 'amount' or field_name == 'qty' or field_name == 'donation_method':
values[field_name] = field_value
else:
continue
collection = request.env['food.basket.line'].sudo().create(values)
if collection:
data = {'status': True, 'msg': (_('Record created ')), 'data': {}}
else:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
return json.dumps(data)
# Food Surplus
@http.route(['/services/reservation_food'], type="http", auth="public", website=True, method=['POST'],
csrf=False)
def reservation_food(self, id, benefit_id, **kw):
collection = request.env['food.surplus.line'].sudo().browse(int(id))
benefit = request.env['grant.benefit'].sudo().browse(int(benefit_id))
if collection:
if len(collection.benefit_ids) >= collection.surplus_count:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
else:
data = {'status': True, 'msg': (
_('Record created ')), 'data': {}}
for co in collection:
co.sudo().write({'benefit_ids': [(4, benefit.id)]})
else:
data = {'status': False, 'msg': (
_('Record Not found ')), 'data': {}}
return json.dumps(data)
@http.route(['/services/clubs'], type="http", auth="public", website=True, method=['GET'],
csrf=False)
def get_all_club(self):
try:
# todo : add is_available domain
clubs = request.env['benefit.club'].sudo().search(
[('is_available', '=', True)])
results = []
if clubs:
results.append(({'clubs': [{'id': s.id, 'name': s.name, 'description': s.description,
'subscription_amount': s.subscription_amount,
'programs_type': s.programs_type} for s in clubs]}))
data = {'status': True, 'data': results}
return json.dumps(data)
except Exception as e:
_logger.error(str(e))
message = self.get_server_error(e)
data = {'status': False, 'msg': message}
return json.dumps(data)
@http.route(['/services/club_subscription'], type="http", auth="none", website=True, method=['POST'],
csrf=False)
def add_subscription_request(self, id, **kw):
values = {}
li = ['name', 'phone_number', 'birth_date', 'city', 'lat', 'lon']
for filed in li:
if not kw.get(filed, False):
error = self.get_validation_error(filed)
return json.dumps(error)
for field_name, field_value in kw.items():
values[field_name] = field_value
# todo
# todo online payment
partner_id = request.env.user.partner_id
external_by_partner_id = request.env['external.benefits'].sudo().search(
[('partner_id', '=', partner_id.id)], limit=1)
external_by_phone = request.env['external.benefits'].sudo().search(
[('phone', '=', values['phone_number'])], limit=1)
external_id = external_by_partner_id or external_by_phone
if not external_id:
external_id = request.env['external.benefits'].sudo().create({
"name": values['name'],
"phone": values['phone_number'],
"birth_date": values['birth_date'],
"city_id": values['city'],
})
if not external_id and partner_id:
external_id = request.env['external.benefits'].sudo().create({
"name": partner_id.name,
"phone": partner_id.phone,
"birth_date": partner_id.birth_date,
"city_id": partner_id.city_id,
"partner_id": partner_id.id
})
subscription = None
if external_id:
subscription = request.env['external.request'].sudo().create({
"club_id": int(id),
"external_id": external_id.id,
"lat": values['lat'],
"lon": values['lon'],
})
if subscription:
data = {'status': True, 'msg': (_('Record created ')), 'data': {}}
else:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
return json.dumps(data)
@http.route(['/services/food'], type="http", auth="public", website=True, method=['GET'],
csrf=False)
def get_available_food_surplus(self):
try:
foods = request.env['food.surplus.line'].sudo().search(
[]) # ([('is_available', '=', True)])
results = []
if foods:
results.append(({'foods': [{'id': s.id, 'name': s.food_surplus_id.name,
'name_food': s.surplus_type.name,
'description': s.description,
'surplus_count': s.surplus_count, 'quantity': s.quantity, 'address':
s.food_surplus_id.address, 'date_start': str(s.date_start), 'date_end': str(s.date_end)} for s in foods]}))
data = {'status': True, 'data': results}
return json.dumps(data)
except Exception as e:
_logger.error(str(e))
message = self.get_server_error(e)
data = {'status': False, 'msg': message}
return json.dumps(data)
@http.route(['/services/loans'], type="http", auth="public", website=True, method=['GET'],
csrf=False)
def get_all_loans(self):
try:
loans = request.env['benefit.loans'].sudo().search(
[('state', '=', 'announced')])
results = []
if loans:
results.append(({'loans': [{'id': s.id, 'name': s.family_id.name, 'description': s.description,
'benefits_total': s.benefits_total,
'project_name': s.name, 'loan_amount': s.loan_amount, } for s in loans]}))
data = {'status': True, 'data': results}
return json.dumps(data)
except Exception as e:
_logger.error(str(e))
message = self.get_server_error(e)
data = {'status': False, 'msg': message}
return json.dumps(data)
#create_loan in backend
@http.route(['/services/create_loan'], type="http", auth="public", website=True, method=['POST'],
csrf=False)
def create_loan(self, **kw):
values = {}
# if not kw.get('phone_number', False):
# return json.dumps({'status': False, 'msg': (_('phone_number')), 'data': {}})
# if not kw.get('loan_amount', False):
# return json.dumps({'status': False, 'msg': (_('loan_amount')), 'data': {}})
# if not kw.get('installment_value', False):
# return json.dumps({'status': False, 'msg': (_('installment_value')), 'data': {}})
# if not kw.get('installment_number', False):
# return json.dumps({'status': False, 'msg': (_('installment_number')), 'data': {}})
for field_name, field_value in kw.items():
values[field_name] = field_value
loan = request.env['receive.benefit.loans'].sudo().create(values)
if loan:
data = {'status': True, 'msg': (_('Record created ')), 'data': {}}
else:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
return json.dumps(data)
# restaurant
@http.route(['/services/appliancesFurniture/receive'], type="http", auth="public", website=True, method=['POST'],
csrf=False)
def add_appliances(self, **kw):
values = {}
li = ['name', 'donor_name', 'phone_number', 'address', 'lat', 'lon', 'date_receipt', 'uom_id', 'product_qty',
'product_status', 'description']
for filed in li:
if not kw.get(filed, False):
error = self.get_validation_error(filed)
return json.dumps(error)
for field_name, field_value in kw.items():
if field_name not in ['image_1', 'image_2', 'image_3', 'image_4']:
values[field_name] = field_value
for fname, fvalue in http.request.httprequest.files.items():
if fvalue:
file = fvalue.read()
if len(file) > 0:
values[fname] = base64.b64encode(file)
values['donation_method'] = 'platform'
appliances = request.env['receive.appliances.furniture'].sudo().create(
values)
if appliances:
data = {'status': True, 'msg': (_('Record created ')), 'data': {}}
else:
data = {'status': False, 'msg': (
_('Record Not created ')), 'data': {}}
return json.dumps(data)