Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import uuid
- import random
- import string
- import openerp.addons.decimal_precision as dp
- from openerp import models, api, fields
- from helpers import get_total_farmer_land_size, compute_forecast_data,\
- get_total_coop_land_size
- from passlib.context import CryptContext
- class VendorFarmer(models.Model):
- """ Non member farmer model """
- _name = 'vendor.farmer'
- _rec_name = 'name'
- _description = 'Vendor Farmer'
- @api.multi
- @api.depends('vendor_land_ids')
- def get_total_land_plot_size(self):
- """
- Compute total land size for a given farmer
- """
- total = 0.0
- for a in self.vendor_land_ids:
- total += a.plot_size
- self.total_land_plot_size = total
- if total < 0.5:
- self.categ_total_land_plot_size = 'aless_0_5'
- elif total >= 0.5 and total < 1.0:
- self.categ_total_land_plot_size = 'bbtw_0_5_1'
- elif total >= 1.0:
- self.categ_total_land_plot_size = 'cmore_1'
- name = fields.Char(string='Name', required=True)
- phone = fields.Char(string='Cell Phone', required=True)
- email = fields.Char(string='Email', required=True)
- address = fields.Char(string='Address')
- gender = fields.Selection([('male', 'Male'), ('female', 'Female')],
- string='Sex')
- # Demographics data
- head_of_household = fields.Boolean(string='Head of Household')
- num_household_members = fields.Integer(string='# of Household Members')
- spouse_firstname = fields.Char(string='Spouse First Name')
- spouse_lastname = fields.Char(string='Spouse Last Name')
- cellphone_alt = fields.Char(string='Cell phone (Alt)')
- cell_carrier = fields.Char(string='Cell Carrier')
- membership_id = fields.Char(string='Membership ID',
- default="%s" % (uuid.uuid4().int))
- # Available Resources
- ar_tractors = fields.Boolean(string='Tractors')
- ar_harverster = fields.Boolean(string='Harvester')
- ar_dryer = fields.Boolean(string='Dryer')
- ar_thresher = fields.Boolean(string='Thresher')
- ar_safestorage = fields.Boolean(string='Safe storage')
- storage_details = fields.Char(string='Storage Details')
- ar_other = fields.Boolean(string='other')
- other_details = fields.Char(string='New resources')
- # Main Water source
- mws_dam = fields.Boolean('Dam')
- mws_well = fields.Boolean('Well')
- mws_borehole = fields.Boolean('Borehole')
- mws_rs = fields.Boolean('River/Stream')
- mws_pb = fields.Boolean('Pipe-Borne')
- mws_irrigation = fields.Boolean('Irrigation')
- mws_none = fields.Boolean('None')
- mws_other = fields.Boolean('Other')
- other_water_source = fields.Char(string='Other Source')
- total_land_plot_size = fields.Float(string='Total vendor land size of '
- + ' all maize arable plots in HA'
- + ' (rounded)',
- store=True,
- compute=get_total_land_plot_size)
- categ_total_land_plot_size = fields.Selection([('aless_0_5', '<0.5 ha'),
- ('bbtw_0_5_1', '0.5-1 ha'),
- ('cmore_1', '>1 ha')],
- 'Land Plot Size',
- store=True,
- compute=get_total_land_plot_size)
- user_id = fields.Integer(string='User Id')
- access_info_ids = fields.One2many('access.info.vendor',
- 'vendor_id',
- string='Access To Information')
- vendor_land_ids = fields.One2many('vendor.land',
- 'vendor_id',
- string='Vendor Land')
- forecast_vendor_ids = fields.One2many('forecast.vendor',
- 'vendor_id',
- string='Forecast Vendor')
- finance_data_ids = fields.One2many('finance.data.vendor',
- 'vendor_id',
- string='Finance Data Vendor')
- baseline_ids = fields.One2many('baseline.vendor',
- 'vendor_id',
- string='Baseline Vendor')
- @api.model
- def create(self, vals):
- p_info = CryptContext(['pbkdf2_sha512']).encrypt('unwomen')
- partn_info = self.env['res.partner'] \
- .create({'name': vals['name'], 'email': vals['email']})
- # create and assign a user account to vendor with user id
- vendor_user = self.env['res.users'] \
- .create({'login': vals['phone'], 'password_crypt': p_info,
- 'alias_id': 1, 'company_id': 1,
- 'partner_id': partn_info.id})
- # Add user id to vendor
- vals[u'user_id'] = vendor_user.id
- # Associate group to this account
- domain = [('name', 'like', 'Vendor')]
- group_info = self.env['res.groups'].search(domain)
- sql = "INSERT INTO res_groups_users_rel(gid, uid) VALUES({0}, {1})"
- sql = sql.format(group_info[1].id, vendor_user.id)
- self.env.cr.execute(sql)
- return super(VendorFarmer, self).create(vals)
- @api.multi
- def send_credential(self):
- # get user id, set password (password_crypt) and send it via sms to
- user_gen_password = "".join(random.choice(string.ascii_uppercase
- + string.ascii_lowercase
- + string.digits)
- for x in range(10))
- pass_info = CryptContext(['pbkdf2_sha512']).encrypt(user_gen_password)
- sql = "UPDATE res_users SET password_crypt = '{0}' WHERE id = {1}"
- sql = sql.format(pass_info, self.user_id)
- self.env.cr.execute(sql)
- # prepare sms
- msg = "Hi {0} this your credentials" \
- + " Login : {1}, password : {2}"
- msg = msg.format(self.name, self.phone, user_gen_password)
- tw_obj = self.env['twilio.message']
- tw_obj.send_sms(self.phone, msg)
- sms_msg = 'Confirmation Message'
- return {
- 'name': sms_msg,
- 'type': 'ir.actions.act_window',
- 'res_model': 'web.modal',
- 'view_mode': 'form',
- 'view_type': 'form',
- 'target': 'new',
- }
- class AccessInfoVendor(models.Model):
- """ Access Information Vendor """
- _name = 'access.info.vendor'
- _description = 'Access to Information Vendor'
- ar_aes = fields.Boolean(string='Agricultural extension services')
- ar_cri = fields.Boolean(string='Climate related information '
- + '(e.g. weather forecasts)')
- ar_seeds = fields.Boolean(string='Seeds')
- ar_of = fields.Boolean(string='Organic Fertilizers')
- ar_if = fields.Boolean(string='Inorganic Fertilizers')
- ar_labour = fields.Boolean(string='Labour')
- ar_iwp = fields.Boolean(string='Irrigation/water pumps')
- ar_ss = fields.Boolean(string='Spreaders or Sprayers')
- harvest_id = fields.Many2one('harvest.season', string='Harvest Season',
- required=True)
- vendor_id = fields.Many2one('vendor.farmer', string='Vendor',
- required=True)
- class VendorLand(models.Model):
- """Vendor Land """
- _name = 'vendor.land'
- _description = 'Vendor Land Data'
- vendor_id = fields.Many2one('vendor.farmer', string='Vendor',
- required=True)
- plot_size = fields.Float(string='Plot Size (ha)',
- digits=dp.get_precision('Land Size'),
- required=True)
- lat = fields.Float(string='Latitude',
- digits=dp.get_precision('LatLng'))
- lng = fields.Float(string='Longitude',
- digits=dp.get_precision('LatLng'))
- harvest_id = fields.Many2one('harvest.season',
- string='Harvest Season',
- required=True)
- @api.model
- def create(self, values):
- """
- Create new vendor land size
- """
- # Compute total land size of vendor x for a given season
- land_data = super(VendorLand, self).create(values)
- total_farmer_land_size = 0.0
- total_coop_land_size = 0.0
- land_size_farmer_query = """SELECT coalesce(sum(plot_size), 0.0) as total_land
- FROM farmer_land fl
- LEFT JOIN farmer f
- ON f.id = fl.vendor_id
- WHERE fl.vendor_id = %s AND fl.harvest_id = %s""" \
- % (values['vendor_id'], values['harvest_id'])
- self.env.cr.execute(land_size_farmer_query)
- res = self.env.cr.fetchone()
- if res:
- total_farmer_land_size = res[0]
- # Compute appropriate variable base on the total size
- expected_production_in_mt = total_farmer_land_size * 2000
- forecasted_yield_mt = total_farmer_land_size * 2000 * 0.55
- forecasted_harvest_sale_value = total_farmer_land_size * 2000 * 0.10
- # set farmer percentage land
- fpl = 0.0
- if total_coop_land_size != 0.0:
- fpl = (total_farmer_land_size / total_coop_land_size) * 100
- # (don't farget to update salesman_id to coop_id or vendor_id)
- lines = self.env['sale.order.contract.line'] \
- .search([('salesman_id', '=', values['vendor_id'])])
- current_ppp_commitment = 0.0
- for l in lines:
- current_ppp_commitment += l.product_uom_qty
- farmer_contribution_ppp = (fpl / 100) * current_ppp_commitment * 2000
- # Insert or Update on duplicate key
- update_farmer_data = """INSERT INTO forecast_vendor
- (expected_production_in_mt, forecasted_yield_mt,
- forecasted_harvest_sale_value, total_coop_land_size,
- farmer_percentage_land, current_ppp_commitment,
- farmer_contribution_ppp, farmer_id, harvest_id
- ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s)
- ON CONFLICT (harvest_id, farmer_id) DO UPDATE
- SET expected_production_in_mt = %s,
- forecasted_yield_mt = %s,
- forecasted_harvest_sale_value = %s,
- total_coop_land_size = %s,
- farmer_percentage_land = %s,
- current_ppp_commitment = %s,
- farmer_contribution_ppp = %s
- """ % (expected_production_in_mt, forecasted_yield_mt,
- forecasted_harvest_sale_value, total_coop_land_size,
- fpl, current_ppp_commitment, farmer_contribution_ppp,
- values['farmer_id'], values['harvest_id'],
- expected_production_in_mt, forecasted_yield_mt,
- forecasted_harvest_sale_value, total_coop_land_size,
- fpl, current_ppp_commitment, farmer_contribution_ppp)
- # Execute query
- self.env.cr.execute(update_farmer_data)
- return land_data
- @api.multi
- def write(self, values):
- """
- Update Vendor land size
- """
- # Compute old forecast data and expected yield
- # value base on the harvest id, farmer id and coop id
- tot_b_farmer_land_size = get_total_farmer_land_size(self)
- tot_b_coop_land_size = get_total_coop_land_size(self)
- forecast_data_bef = compute_forecast_data(tot_b_farmer_land_size,
- tot_b_coop_land_size,
- self)
- # update land information
- land_update_info = super(VendorLand, self).write(values)
- # Compute new forecast data and expected yield
- # value base on the harvest id, farmer id and coop id
- tot_farmer_land_size = get_total_farmer_land_size(self)
- tot_coop_land_size = get_total_coop_land_size(self)
- forecast_data_after = compute_forecast_data(tot_farmer_land_size,
- tot_coop_land_size,
- self)
- # Deduct old forecast data and expected yield value
- deduct_old_val_query_forecast = """UPDATE forecast_vendor SET
- expected_production_in_mt =
- forecast_vendor.expected_production_in_mt - %s,
- forecasted_yield_mt =
- forecast_vendor.forecasted_yield_mt - %s,
- forecasted_harvest_sale_value =
- forecast_vendor.forecasted_harvest_sale_value - %s,
- total_coop_land_size =
- forecast_vendor.total_coop_land_size - %s,
- vendor_percentage_land =
- forecast_vendor.vendor_percentage_land - %s,
- current_ppp_commitment =
- forecast_vendor.current_ppp_commitment - %s,
- vendor_contribution_ppp =
- forecast_vendor.vendor_contribution_ppp - %s
- WHERE vendor_id = %s AND harvest_id = %s
- """ % (forecast_data_bef[0], forecast_data_bef[1],
- forecast_data_bef[2], tot_b_coop_land_size,
- forecast_data_bef[3], forecast_data_bef[4],
- forecast_data_bef[5], self.vendor_id.id, self.harvest_id.id)
- self.env.cr.execute(deduct_old_val_query_forecast)
- # Add new forecast data and expected yield value
- add_new_val_query_forecast = """UPDATE forecast_vendor SET
- expected_production_in_mt =
- forecast_vendor.expected_production_in_mt + %s,
- forecasted_yield_mt =
- forecast_vendor.forecasted_yield_mt + %s,
- forecasted_harvest_sale_value =
- forecast_vendor.forecasted_harvest_sale_value + %s,
- total_coop_land_size =
- forecast_vendor.total_coop_land_size + %s,
- vendor_percentage_land =
- forecast_vendor.vendor_percentage_land + %s,
- current_ppp_commitment =
- forecast_vendor.current_ppp_commitment + %s,
- vendor_contribution_ppp =
- forecast_vendor.vendor_contribution_ppp + %s
- WHERE vendor_id = %s AND harvest_id = %s
- """ % (forecast_data_after[0], forecast_data_after[1],
- forecast_data_after[2], tot_coop_land_size,
- forecast_data_after[3], forecast_data_after[4],
- forecast_data_after[5], self.vendor_id.id, self.harvest_id.id)
- self.env.cr.execute(add_new_val_query_forecast)
- return land_update_info
- @api.multi
- def unlink(self):
- """
- Delete farmer land size
- """
- # Update farmer forecast data and expected yield for coop
- tot_farmer_land_size = get_total_farmer_land_size(self)
- tot_coop_land_size = get_total_coop_land_size(self)
- forecast_data = compute_forecast_data(tot_farmer_land_size,
- tot_coop_land_size,
- self)
- # Deduct old forecast data and expected yield value
- deduct_val_query_forecast = """UPDATE forecast_vendor SET
- expected_production_in_mt =
- forecast_vendor.expected_production_in_mt - %s,
- forecasted_yield_mt =
- forecast_vendor.forecasted_yield_mt - %s,
- forecasted_harvest_sale_value =
- forecast_vendor.forecasted_harvest_sale_value - %s,
- total_coop_land_size =
- forecast_vendor.total_coop_land_size - %s,
- vendor_percentage_land =
- forecast_vendor.vendor_percentage_land - %s,
- current_ppp_commitment =
- forecast_vendor.current_ppp_commitment - %s,
- vendor_contribution_ppp =
- forecast_vendor.vendor_contribution_ppp - %s
- WHERE vendor_id = %s AND harvest_id = %s
- """ % (forecast_data[0], forecast_data[1],
- forecast_data[2], tot_coop_land_size,
- forecast_data[3], forecast_data[4],
- forecast_data[5], self.vendor_id.id, self.harvest_id.id)
- self.env.cr.execute(deduct_val_query_forecast)
- return super(VendorLand, self).unlink()
- class BaseLineVendor(models.Model):
- """ BaseLine Vendor """
- _name = 'baseline.vendor'
- _description = 'BaseLine Vendor'
- seasona_harvest = fields.Float(string='Total production in KG')
- lost_harvest_total = fields.Float(string='Total Lost in KG')
- sold_harvest_total = fields.Float(string='Total Sold in KG')
- total_qty_coops = fields.Float(string='Total volume sold to your'
- + ' coop in KG')
- price_sold_coops = fields.Float(string='Price sold to the coop per KG')
- total_qty_middlemen = fields.Float(string='Total volume that was' +
- ' side-sold in KG')
- price_sold_middlemen = fields.Float(string='Price side-sold in KG')
- harvest_id = fields.Many2one('harvest.season', string='Harvest Season',
- required=True)
- vendor_id = fields.Many2one('vendor.farmer', string='Vendor',
- required=True)
- class ForecastVendor(models.Model):
- """ Forecast Vendor """
- _name = 'forecast.vendor'
- _description = 'Forecast Vendor'
- _sql_constraints = [('vendor_harv_season',
- 'unique(harvest_id, vendor_id)',
- 'Duplicate vendor id and harvest season')]
- total_arable_land_plots = fields.Float(string='Total number of '
- + 'arable land plots'
- + ' for maize production',
- digits=(10, 0), default=0.0)
- expected_production_in_mt = fields.Float(
- string='Expected Total Production in KG', readonly=True)
- forecasted_yield_mt = fields.Float(
- string='Expected sales outside the FTMA', readonly=True)
- forecasted_harvest_sale_value = fields.Float(
- string='Expected postharvest loss in KG', readonly=True)
- total_coop_land_size = fields.Float(
- 'Total Coop Land Size (in HA)', readonly=True)
- vendor_percentage_land = fields.Float(string='Farmer % of total coop '
- + ' land size', readonly=True)
- current_ppp_commitment = fields.Integer(string='Current FTMA Commitment '
- + ' in kg', readonly=True)
- vendor_contribution_ppp = fields.Float(
- 'Farmer contribution towards FTMA commitment in KG', readonly=True)
- vendor_expected_min_ppp = fields.Float('Vendors expected minimum revenue'
- + ' from FTMA sale in RWF',
- default=7200,
- digits=(10, 0))
- minimum_flow_price = fields.Float("Minimum floor price per kg in RWF",
- default=215)
- harvest_id = fields.Many2one('harvest.season', string='Harvest Season',
- required=True)
- vendor_id = fields.Many2one('vendor.farmer', string='Vendor',
- required=True)
- class FinanceDataVendor(models.Model):
- """ Finance Data Vendor """
- _name = 'finance.data.vendor'
- _description = 'Finance Data Vendor'
- outstanding_loan = fields.Boolean(string='Outstanding Loan')
- total_loan_amount = fields.Float(string='Total loan amount (in RWF)',
- group_operator="avg")
- total_outstanding = fields.Float(string='Total outstanding (in RWF)')
- interest_rate = fields.Float(string='Interest Rate (% in months)',
- group_operator="avg")
- duration = fields.Integer(string='Duration (in months)',
- group_operator="avg")
- loan_provider = fields.Selection([('bank', 'Bank'),
- ('cooperative', 'Cooperative'),
- ('sacco', 'Sacco'),
- ('other', 'Other')],
- string='Loan provider')
- # Loan Purpose
- loan_purpose_i = fields.Boolean(string='Input')
- loan_purpose_a = fields.Boolean(string='Aggregation')
- loan_purpose_o = fields.Boolean(string='Other')
- mobile_money_account = fields.Boolean(string='Mobile Money Acct')
- harvest_id = fields.Many2one('harvest.season', string='Harvest Season',
- required=True)
- vendor_id = fields.Many2one('vendor.farmer', string='Vendor',
- required=True)
Add Comment
Please, Sign In to add comment