Facebook
From Jittery Kitten, 4 Years ago, written in Plain Text.
Embed
Download Paste or View Raw
Hits: 106
  1. import * as Yup from "yup";
  2. import { calcWorkloadSum } from "./../../services/projectService";
  3.  
  4. const REQUIRED_FIELD_ERROR_MESSAGE = "Field is Required";
  5. const AUTHOR_NAME_PATTERN = /^[A-Z][a-z]+\s[A-Z][a-z]+$/;
  6. const DATE_PATTERN = /^\d{2}\s[A-Z][a-z]{2}\s\d{4}$/;
  7. const VALID_NUMBER_PATTERN = /^\d+(\.\d+)?$/;
  8. const INVALID_DATE_ERROR_MESSAGE =
  9.   "Please provide the date in valid format(dd MMM yyyy)";
  10. const PROVIDE_A_VALID_NUMBER = "Please provide a valid number";
  11. export const VALID_PAYMENT_SCHEMAS = ["40/40/10/10", "70/30", "100"];
  12.  
  13. const isNotEmpty = val => {
  14.   if (!val) return false;
  15.   const trimmed = val.trim();
  16.   return !(trimmed === "" || trimmed === " ");
  17. };
  18.  
  19. function isBeforeDate(val, dateName, parent) {
  20.   const date = parent[dateName];
  21.   console.log(date, dateName);
  22.   if (!date || !val) {
  23.     return true;
  24.   }
  25.   return Date.parse(val) >= Date.parse(date);
  26. }
  27.  
  28. export const validationSchema = Yup.object({
  29.   release: Yup.string().required(REQUIRED_FIELD_ERROR_MESSAGE),
  30.   date: Yup.string()
  31.     .required(REQUIRED_FIELD_ERROR_MESSAGE)
  32.     .matches(DATE_PATTERN, INVALID_DATE_ERROR_MESSAGE),
  33.   proxiadRefNumber: Yup.string().test(
  34.     "is not empty",
  35.     "Proxiad ref number cannot be empty",
  36.     isNotEmpty
  37.   ),
  38.   boursoramaRefNumber: Yup.string(),
  39.   billingEntity: Yup.string().required(REQUIRED_FIELD_ERROR_MESSAGE),
  40.   author: Yup.string()
  41.     .required(REQUIRED_FIELD_ERROR_MESSAGE)
  42.     .matches(
  43.       AUTHOR_NAME_PATTERN,
  44.       "Please provide a valid name e.g(Ivan Ivanov)"
  45.     ),
  46.   inputDocumentTitle: Yup.string(),
  47.   inputDocumentReceivedOn: Yup.string().matches(
  48.     DATE_PATTERN,
  49.     INVALID_DATE_ERROR_MESSAGE
  50.   ),
  51.   inputDocumentSendBy: Yup.string(),
  52.   stratOfDevelopment: Yup.string().matches(
  53.     DATE_PATTERN,
  54.     INVALID_DATE_ERROR_MESSAGE
  55.   ),
  56.   deliveryInProduction: Yup.string()
  57.     .matches(DATE_PATTERN, INVALID_DATE_ERROR_MESSAGE)
  58.     .test(
  59.       "is after delivery for testing",
  60.       "Date must be after delivery for testing",
  61.       function(val) {
  62.         isBeforeDate(val, "deliveryForTesting", this.parent);
  63.       }
  64.     ),
  65.   deliveryForTesting: Yup.string()
  66.     .matches(DATE_PATTERN, INVALID_DATE_ERROR_MESSAGE)
  67.     .test(
  68.       "is after start date",
  69.       "Date must be after start of development",
  70.       function(val) {
  71.         isBeforeDate(val, "stratOfDevelopment", this.parent);
  72.       }
  73.     ),
  74.   paymentSchema: Yup.string().oneOf(
  75.     VALID_PAYMENT_SCHEMAS,
  76.     `Payment schema should be one of: ${VALID_PAYMENT_SCHEMAS.join(" ")}`
  77.   ),
  78.   macroEstimationReceivedOn: Yup.string().matches(
  79.     DATE_PATTERN,
  80.     INVALID_DATE_ERROR_MESSAGE
  81.   ),
  82.   macroEstimationSendBy: Yup.string(),
  83.   macroEstimationTitle: Yup.string(),
  84.   requirementsAnalysis: Yup.string(),
  85.   devWorkloadMd: Yup.number()
  86.     .test(
  87.       "is equal to dev workload sum",
  88.       "Should match the sum of dev workload",
  89.       function(val) {
  90.         const { devWorkload } = this.parent;
  91.         return Number(val) === calcWorkloadSum(devWorkload);
  92.       }
  93.     )
  94.     .typeError(PROVIDE_A_VALID_NUMBER),
  95.   workloadDesign: Yup.string()
  96.     .typeError(PROVIDE_A_VALID_NUMBER)
  97.     .matches(VALID_NUMBER_PATTERN, PROVIDE_A_VALID_NUMBER),
  98.   workloadTest: Yup.string()
  99.     .typeError(PROVIDE_A_VALID_NUMBER)
  100.     .matches(VALID_NUMBER_PATTERN, PROVIDE_A_VALID_NUMBER),
  101.   workloadUat: Yup.string()
  102.     .typeError(PROVIDE_A_VALID_NUMBER)
  103.     .matches(VALID_NUMBER_PATTERN, PROVIDE_A_VALID_NUMBER),
  104.   workloadManagement: Yup.string()
  105.     .typeError(PROVIDE_A_VALID_NUMBER)
  106.     .matches(VALID_NUMBER_PATTERN, PROVIDE_A_VALID_NUMBER),
  107.   workloadOther: Yup.string()
  108.     .typeError(PROVIDE_A_VALID_NUMBER)
  109.     .matches(VALID_NUMBER_PATTERN, PROVIDE_A_VALID_NUMBER),
  110.   totalBudget: Yup.string()
  111.     .matches(VALID_NUMBER_PATTERN, PROVIDE_A_VALID_NUMBER)
  112.     .test(
  113.       "is equal to sum of all components",
  114.       "Incorrect Budget value",
  115.       function(val) {
  116.         const {
  117.           devWorkloadMd,
  118.           workloadDesign,
  119.           workloadTest,
  120.           workloadUat,
  121.           workloadManagement,
  122.           workloadOther
  123.         } = this.parent;
  124.  
  125.         const sum =
  126.           Number(devWorkloadMd) +
  127.           Number(workloadDesign) +
  128.           Number(workloadTest) +
  129.           Number(workloadUat) +
  130.           Number(workloadManagement) +
  131.           Number(workloadOther);
  132.  
  133.         if (isNaN(sum)) {
  134.           return true;
  135.         }
  136.  
  137.         return Number(val) === sum;
  138.       }
  139.     )
  140. });
  141.