Advertisement
SherinKR

Frappe Dialog with table

Feb 22nd, 2024 (edited)
634
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
JavaScript 5.90 KB | Source Code | 0 0
  1. function allocate_budget_popup(project, sub_budget_item, fiscal_years, available_amount, labels){
  2.         let d = new frappe.ui.Dialog({
  3.           title: 'Team Allocation',
  4.           size: "large",
  5.           fields: [
  6.           {
  7.             label: "Fiscal Year",
  8.             fieldname: "fiscal_year",
  9.             fieldtype: "Select",
  10.             options: fiscal_years,
  11.             reqd: 1,
  12.             onchange: function(e) {
  13.               var primary_action_label = 'Allocate';
  14.               var selected_fiscal_year = this.value;
  15.               var idx = fiscal_years.indexOf(selected_fiscal_year);
  16.               primary_action_label = labels[idx];
  17.               d.set_value('allocated_amount', available_amount[idx]);
  18.               d.set_primary_action(primary_action_label, (values) => {
  19.                 allocate_budget_to_teams(project, sub_budget_item, values.fiscal_year, values);
  20.                 d.hide();
  21.               });
  22.               frappe.db.get_value("Budget Item", sub_budget_item, 'parent_budget_item').then((result) => {
  23.                 d.set_value('budget_item', result.message.parent_budget_item)
  24.                 d.set_value('sub_budget_item', sub_budget_item)
  25.               });
  26.             }
  27.           },
  28.           {
  29.             label: "Budget Item",
  30.             fieldname: "budget_item",
  31.             fieldtype: "Link",
  32.             options: 'Budget Item',
  33.             read_only: 1,
  34.             depends_on: "eval: doc.fiscal_year"
  35.           },
  36.           {
  37.             label: "Sub Budget Item",
  38.             fieldname: "sub_budget_item",
  39.             fieldtype: "Link",
  40.             options: 'Budget Item',
  41.             read_only: 1,
  42.             depends_on: "eval: doc.fiscal_year"
  43.           },
  44.           {
  45.             label: "Available Amount",
  46.             fieldname: "allocated_amount",
  47.             fieldtype: "Currency",
  48.             read_only: 1,
  49.             default: 0,
  50.             depends_on: "eval: doc.fiscal_year",
  51.             onchange: function(e) {
  52.               var allocated_amount = this.value;
  53.               var fiscal_year = d.get_value('fiscal_year');
  54.               frappe.call({
  55.                 method: 'pradan.pradan.doctype.pradan_budget.pradan_budget.get_team_wise_budget',
  56.                 args: {
  57.                   project: project,
  58.                   available_amount: allocated_amount,
  59.                   sub_budget_item: sub_budget_item,
  60.                   fiscal_year: fiscal_year
  61.                 },
  62.                 freeze: true,
  63.                 freeze_message: __("Fetching team details.."),
  64.                 callback: (r) => {
  65.                   if(r.message){
  66.                     let data = r.message.team_wise_budget;
  67.                     d.fields_dict.team_wise_budget.df.read_only = r.message.is_salary_head
  68.                     d.fields_dict.team_wise_budget.df.fields[2].read_only = r.message.is_salary_head
  69.                     d.fields_dict.team_wise_budget.df.data = data
  70.                     let available_amount = parseFloat(d.get_value('allocated_amount')) || 0;
  71.                     let allocated_amount = 0;
  72.                     data.forEach(row => {
  73.                       allocated_amount += row.allocated_amount;
  74.                     });
  75.                     let balance_amount = available_amount - allocated_amount;
  76.                     d.set_value('balance_amount', balance_amount);
  77.                     d.fields_dict.team_wise_budget.grid.refresh();
  78.                   }
  79.                   else {
  80.                     frappe.throw('No team has allocated to this Project')
  81.                   }
  82.                 }
  83.               });
  84.             }
  85.           },
  86.           {
  87.             label: "Team wise Budget",
  88.             fieldname: "team_wise_budget",
  89.             fieldtype: "Table",
  90.             reqd: 1,
  91.             cannot_add_rows: true,
  92.             cannot_delete_rows: true,
  93.             cannot_delete_all_rows: true,
  94.             in_place_edit: true,
  95.             depends_on: "eval: doc.fiscal_year",
  96.             fields: [
  97.               {
  98.                 fieldtype: 'Link',
  99.                 label: 'Project',
  100.                 fieldname: 'project',
  101.                 options: 'Project',
  102.                 in_list_view: 1,
  103.                 reqd: 1,
  104.                 read_only: 1
  105.               },
  106.               {
  107.                 fieldtype: 'Link',
  108.                 label: 'Teams',
  109.                 fieldname: 'teams',
  110.                 options: 'Branch',
  111.                 in_list_view: 1,
  112.                 reqd: 1,
  113.                 read_only: 1
  114.               },
  115.               {
  116.                 fieldtype: 'Currency',
  117.                 label: 'Allocated Amount',
  118.                 fieldname: 'allocated_amount',
  119.                 in_list_view: 1,
  120.                 reqd: 1,
  121.                 default: 0,
  122.                 onchange: function(e) {
  123.                   var available_amount = parseFloat(d.get_value('allocated_amount')) || 0;
  124.                   var table_data = d.get_value('team_wise_budget');
  125.                   var allocated_amount = 0;
  126.                   table_data.forEach(row => {
  127.                     allocated_amount += row.allocated_amount;
  128.                   });
  129.                   var balance_amount = available_amount - allocated_amount;
  130.                   d.set_value('balance_amount', balance_amount);
  131.                   // if(available_amount<allocated_amount){
  132.                   //   frappe.throw('Total allocation should not exceed than the available amount!');
  133.                   // }
  134.                 }
  135.               },
  136.               {
  137.                 fieldtype: 'Data',
  138.                 label: 'Remarks',
  139.                 fieldname: 'remarks',
  140.                 in_list_view: 1
  141.               },
  142.             ]
  143.           },
  144.           {
  145.             label: "Balance Amount",
  146.             fieldname: "balance_amount",
  147.             fieldtype: "Currency",
  148.             default: 0,
  149.             read_only: 1
  150.           }
  151.           ]
  152.         });
  153.         d.show();
  154.       }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement