balanced/balanced-dashboard

View on GitHub
app/lib/file-readers/credit_creator.js

Summary

Maintainability
F
4 days
Test Coverage
import CreditCreatorFields from "./credit-creator-fields";
import Constants from "balanced-dashboard/utils/constants";
import ValidationHelpers from "balanced-dashboard/utils/validation-helpers";
import CreditCreatorCsvObjectMapper from "./credit-creator-csv-object-mapper";
import Credit from "balanced-dashboard/models/credit";
import baseValidationsObject from "./base-validations";

import ExistingCustomerCreditCreator from "./existing-customer-credit-creator";
import NewCustomerCreditCreator from "./new-customer-credit-creator";

var CreditCreator = Ember.Object.extend(Ember.Validations, {

    isInvalid: Ember.computed.gt("validationErrors.length", 0),
    isValid: Ember.computed.not("isInvalid"),

    appears_on_statement_max_length: Constants.MAXLENGTH.APPEARS_ON_STATEMENT_BANK_ACCOUNT,

    isLoaded: function() {
        var self = this;
        var fields = ["credit", "bankAccount", "customer"];
        return fields.every(function(field) {
            return self.get(field) !== undefined;
        });
    }.property("credit", "bankAccount", "customer"),

    isSaved: Ember.computed.not("credit.isNew"),
    isSaveable: Ember.computed.and("credit.isNew", "isValid"),

    canSave: function() {
        var self = this;
        return this.get("isValid") && _.every(["bankAccount", "credit", "customer"], function(key) {
            return self.get(key).get("isValid");
        });
    },

    credit: function() {
        var mapper = CreditCreatorCsvObjectMapper.create();
        var attr = mapper.extractCreditAttributes(this.get("csvFields"));
        var customer = this.get("customer");
        var bankAccount = this.get("bankAccount");

        var attributes = _.extend({}, attr, {
            customer: customer,
        });

        if (bankAccount) {
            _.extend(attributes, {
                destination: bankAccount,
                bank_account: bankAccount,
                uri: bankAccount.get("credits_uri")
            });
        }

        return Credit.create(attributes);
    }.property("csvFields", "bankAccount", "bankAccount.credits_uri", "customer"),

    getErrorMessagesSentences: function() {
        var self = this;
        var errors = [];
        ["csvFields", "bankAccount", "customer"].forEach(function(name) {
            var messages = self.get("validationErrors." + name + ".allMessages") || [];
            errors = errors.concat(messages);
        });

        return errors.map(function(value) {
            return value.join(" ");
        });
    },

    toLabeledCsvRowObject: function() {
        var self = this;
        var result = {};
        var csvFields = self.get("fieldNames");

        _.each(csvFields, function(columnName) {
            result[columnName] = self.get("csvFields." + columnName) || "";
        });

        result.errors = this.getErrorMessagesSentences().join("\n");
        return result;
    }
});

CreditCreator.reopenClass({
    isValidCreditCreatorColumns: function(csvColumns) {
        var requiredColumns = [
            CreditCreatorFields.EXISTING_CUSTOMER_FIELDS,
            CreditCreatorFields.NEW_CUSTOMER_FIELDS
        ];
        return requiredColumns.any(function(requiredColumns) {
            return _.difference(requiredColumns, csvColumns).length === 0;
        });
    },
    fromCsvRow: function(marketplace, object) {
        var creditCreator = null;

        if (object.existing_customer_name_or_email !== undefined) {
            creditCreator = ExistingCustomerCreditCreator.createFromQuery(marketplace, object);
        } else {
            creditCreator = NewCustomerCreditCreator.create({
                csvFields: object
            });
        }
        creditCreator.validate();
        return creditCreator;
    }
});

export default CreditCreator;