diff --git a/app/config/associate.js b/app/config/associate.js index ce1c840..b5f129d 100644 --- a/app/config/associate.js +++ b/app/config/associate.js @@ -7,7 +7,8 @@ module.exports = models => { Organization, Charge, PaymentPlan, - OrgBank + OrgBank, + GrantsOrganizations } = models; Donor.hasMany(Grant, { foreignKey: 'donor_id' }); diff --git a/app/config/db.config.js b/app/config/db.config.js index 830a5b3..da03800 100644 --- a/app/config/db.config.js +++ b/app/config/db.config.js @@ -7,7 +7,8 @@ const Sequelize = require('sequelize'), UserModel = require('../models/user.model.js'), PaymentPlanModel = require('../models/paymentplan.model'), ChargeModel = require('../models/charge.model'), - OrgBankModel = require('../models/bank_info.model'), + OrgBankModel = require('../models/orgBank.model'), + GrantsOrganizationsModel = require('../models/grantsOrganizations.model'), associate = require('./associate'); const connection_uri = process.env.JAWSDB_MARIA_URL; @@ -46,6 +47,7 @@ const User = UserModel(sequelize, Sequelize); const Charge = ChargeModel(sequelize, Sequelize); const PaymentPlan = PaymentPlanModel(sequelize, Sequelize); const OrgBank = OrgBankModel(sequelize, Sequelize); +const GrantsOrganizations = GrantsOrganizationsModel(sequelize, Sequelize); db.Donor = Donor; db.Grant = Grant; db.Cause = Cause; @@ -55,6 +57,7 @@ db.User = User; db.Charge = Charge; db.PaymentPlan = PaymentPlan; db.OrgBank = OrgBank; +db.GrantsOrganizations = GrantsOrganizations; // make associations with created models associate(db); diff --git a/app/controllers/donor/grant.controller.js b/app/controllers/donor/grant.controller.js index 7f4c9cd..6bbdb73 100644 --- a/app/controllers/donor/grant.controller.js +++ b/app/controllers/donor/grant.controller.js @@ -6,39 +6,49 @@ const { Grant, Cause, Region, Organization, sequelize } = db; // Create a grant for certain donor exports.create = (req, res, next) => { const donor_id = req.user.id; - const { name, amount, monthly, causes, regions, organizations } = req.body; + const { name, amounts, monthly, causes, regions, organizations } = req.body; + + const total_amount = 100; return sequelize - .transaction(function (t) { + .transaction(function(t) { return Grant.create( { donor_id, name, - amount, + amount: total_amount, monthly, num_causes: causes.length, num_regions: regions.length }, - { transaction: t } + { + transaction: t + } ).then(grant => { return Promise.all([ grant.addCauses(causes, { transaction: t }), grant.addRegions(regions, { transaction: t }), - grant.addOrganizations(organizations, { transaction: t }) + organizations.map(org => { + grant.addOrganization(org.id, { + through: { amount: org.amount }, + transaction: t + }); + }) ]).then(result => grant); }); }) - .then(function (grants) { + .then(function(grants) { // transaction committed // res.status(201).json({ // grant, // message: 'Grant Created' // }); + console.log(grants); next(grants.dataValues); return null; }) - .catch(function (error) { + .catch(function(error) { // transaction rollback next(error); }); diff --git a/app/controllers/donor/stripe.controller.js b/app/controllers/donor/stripe.controller.js index d115dd1..fc68f67 100644 --- a/app/controllers/donor/stripe.controller.js +++ b/app/controllers/donor/stripe.controller.js @@ -22,15 +22,15 @@ exports.grantCharge = async (grant, req, res, next) => { // check if already a stripe customer let { stripe_id, subscription_id } = donors[0]; - if (!stripe_id) { - const customer = await stripe.customers.create({ - source: stripeToken, - email: user.email - }); - stripe_id = await customer.id; + // if (!stripe_id) { + // const customer = await stripe.customers.create({ + // source: stripeToken, + // email: user.email + // }); + // stripe_id = await customer.id; - await Donor.update({ stripe_id }, { where: { id: user.id } }); - } + // await Donor.update({ stripe_id }, { where: { id: user.id } }); + // } // TODO: if there is, then update with the given source var result; @@ -40,9 +40,17 @@ exports.grantCharge = async (grant, req, res, next) => { let charge = await stripe.charges.create({ amount, currency: 'usd', - customer: stripe_id, + source: 'tok_visa', description: 'One time payment for grant', - statement_descriptor: 'one-time-grant' + statement_descriptor: 'one-time-grant', + transfer_group: 'Grant ' + grant_id + }); + + let transfers = stripe.transfers.create({ + amount: 7000, + currency: 'usd', + destination: '{CONNECTED_STRIPE_ACCOUNT_ID}', + transfer_group: '{ORDER10}' }); await Charge.create({ diff --git a/app/models/grantsOrganizations.model.js b/app/models/grantsOrganizations.model.js new file mode 100644 index 0000000..0d8663d --- /dev/null +++ b/app/models/grantsOrganizations.model.js @@ -0,0 +1,14 @@ +module.exports = (sequelize, DataTypes) => { + const GrantsOrganizations = sequelize.define('grants_organizations', { + id: { + type: DataTypes.INTEGER, + primaryKey: true, + autoIncrement: true + }, + amount: { + type: DataTypes.INTEGER, + allowNull: false + } + }); + return GrantsOrganizations; +}; diff --git a/app/models/bank_info.model.js b/app/models/orgBank.model.js similarity index 94% rename from app/models/bank_info.model.js rename to app/models/orgBank.model.js index 3844c0d..c6af5f4 100644 --- a/app/models/bank_info.model.js +++ b/app/models/orgBank.model.js @@ -4,8 +4,7 @@ module.exports = (sequelize, DataTypes) => { type: DataTypes.INTEGER, primaryKey: true, autoIncrement: true - }, - + } }); return OrgBank; };