ishanra

Untitled

Jul 15th, 2021
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.16 KB | None | 0 0
  1. from datetime import datetime
  2. from odoo import fields, models, api
  3. import csv
  4. import base64
  5. import io
  6. import uuid
  7. import pandas as pd
  8.  
  9.  
  10. class DisbursementFile(models.Model):
  11. _name = "openg2p.disbursement.file"
  12.  
  13. batch_name = fields.Char(string="Batch Name", required=True)
  14.  
  15. file = fields.Binary(string="CSV File", required=True)
  16.  
  17. @api.multi
  18. def parse_csv(self):
  19. # id,firstname,lastname,program,location,street,gender,city,state,country,acc_number,amount,payment_mode,currency
  20. csv_data = base64.b64decode(self.file)
  21. data_file = io.StringIO(csv_data.decode("utf-8"))
  22.  
  23. df = pd.read_csv(data_file, delimiter=",", header=None)
  24. df = pd.DataFrame(
  25. df.values,
  26. columns=[
  27. "ID",
  28. "firstname",
  29. "lastname",
  30. "program",
  31. "location",
  32. "street",
  33. "gender",
  34. "city",
  35. "state",
  36. "country",
  37. "acc_number",
  38. "amount",
  39. "payment_mode",
  40. "currency",
  41. ],
  42. )
  43.  
  44. beneficiary_list = []
  45. # Creating beneficiaries
  46. for index, b in df.iterrows():
  47.  
  48. # Checking country
  49. country_id = (
  50. self.env["res.country"].search([("name", "=", str(b["country"]))]).id
  51. )
  52. if not country_id:
  53. country_id = self.env["res.country"].create({"name": b["country"]}).id
  54.  
  55. # Checking state
  56. state_id = (
  57. self.env["res.country.state"]
  58. .search([("name", "=", str(b["state"]))])
  59. .id
  60. )
  61. if not state_id:
  62. state_id = self.env["res.country.state"].create({"name": b["state"]}).id
  63.  
  64. # Checking location
  65. location_id = (
  66. self.env["openg2p.location"]
  67. .search([("name", "=", str(b["location"]))])
  68. .id
  69. )
  70. if not location_id:
  71. location_id = (
  72. self.env["openg2p.location"].create({"name": b["location"]}).id
  73. )
  74.  
  75. # Checking program
  76. program_id = (
  77. self.env["openg2p.program"]
  78. .search([("name", "=", str(b["program"]))])
  79. .id
  80. )
  81. if not program_id:
  82. program_id = (
  83. self.env["openg2p.program"].create({"name": b["program"]}).id
  84. )
  85.  
  86. bank_id, existing = self._get_bank_id(b)
  87. if not existing:
  88. beneficiary = self.env["openg2p.beneficiary"].create(
  89. {
  90. "firstname": b["firstname"],
  91. "lastname": b["lastname"],
  92. "location_id": location_id,
  93. "street": b["street"],
  94. "gender": b["gender"],
  95. "city": b["city"],
  96. "state_id": state_id,
  97. "country_id": country_id,
  98. "bank_account_id": bank_id.id,
  99. }
  100. )
  101.  
  102. else:
  103. beneficiary = self.env["openg2p.beneficiary"].search(
  104. [("bank_account_id", "=", bank_id.id)]
  105. )
  106. beneficiary.write({"program_ids": [(4, program_id)]})
  107. beneficiary_list.append(beneficiary)
  108. self.create_batch_transaction(beneficiary_list)
  109.  
  110. @api.multi
  111. def _get_bank_id(self, data=None):
  112. if isinstance(data, pd.core.series.Series):
  113. bank_id = self.env["res.partner.bank"].search(
  114. [("acc_number", "=", str(data["acc_number"]))], limit=1
  115. )
  116. else:
  117. bank_id = self.env["res.partner.bank"].search(
  118. [("acc_number", "=", data.bank_account_id.acc_number)], limit=1
  119. )
  120.  
  121. if len(bank_id) == 0:
  122. bank_id = self.env["res.partner.bank"].create(
  123. {
  124. "acc_holder_name": str(data["firstname"] + " " + data["lastname"]),
  125. "acc_number": str(data["acc_number"]),
  126. "partner_id": self.env.ref("base.main_partner").id,
  127. "payment_mode": data["payment_mode"],
  128. "currency_id": self.env["res.currency"]
  129. .search([("name", "=", data["currency"])])
  130. .id,
  131. }
  132. )
  133. return bank_id, False
  134. else:
  135. return bank_id, True
  136.  
  137. @api.multi
  138. def create_batch_transaction(self, beneficiaries_selected):
  139. # id,firstname,lastname,program,location,street,gender,city,state,country,acc_number,amount,payment_mode,currency
  140. program_wise = {}
  141. for b in beneficiaries_selected:
  142. print(b.program_ids.ids)
  143. for program_id in b.program_ids.ids:
  144. if program_id in program_wise.keys():
  145. program_wise[program_id].append(b)
  146. else:
  147. program_wise[program_id] = [b]
  148.  
  149. for program, beneficiaries in program_wise.items():
  150. request_id = uuid.uuid4().hex
  151. batch_size = 1000
  152. count = 0
  153.  
  154. while len(beneficiaries[count:]) > 0:
  155. beneficiaries_list = beneficiaries[
  156. count : min(count + batch_size, len(beneficiaries))
  157. ]
  158.  
  159. # Creating batch
  160. batch = self.env["openg2p.disbursement.batch.transaction"].create(
  161. {
  162. "name": self.batch_name
  163. + "-"
  164. + str(datetime.now().strftime("%d%m%y-%I:%M")),
  165. "program_id": program,
  166. "state": "draft",
  167. "date_start": datetime.now(),
  168. "date_end": datetime.now(),
  169. "request_id": request_id,
  170. }
  171. )
  172. # id,request_id,payment_mode,acc_number,acc_holder_name,amount,currency,note
  173. for b in beneficiaries_list:
  174. bank_id, existing = self._get_bank_id(b)
  175. m = self.env["openg2p.disbursement.main"].create(
  176. {
  177. "bank_account_id": bank_id.id,
  178. "batch_id": batch.id,
  179. "state": "draft",
  180. "name": str(b.id),
  181. "beneficiary_id": b.id,
  182. "amount": 100.0,
  183. "program_id": b.program_ids.ids[0],
  184. "date_start": datetime.now(),
  185. "date_end": datetime.now(),
  186. "currency_id": 1,
  187. "payment_mode": bank_id.payment_mode,
  188. }
  189. )
  190. m.generate_uuid()
  191. count += 1000
  192. return {"type": "ir.actions.act_window_close"}
  193.  
Add Comment
Please, Sign In to add comment