public static function Factory($data, &$errors = array(), $do_name = null) { if ($data['debit'] > 0) { $data['value'] = BCADD($data['debit'], 0); } elseif ($data['credit'] > 0) { $data['value'] = BCMUL($data['credit'], -1); } return parent::Factory($data, $errors, $do_name); }
function agedDebtor($_slmaster_id = '', $_aged_months = '') { if (!empty($_aged_months)) { $this->agedMonths = $_aged_months; } $this->_tablename = 'sl_aged_debtors_overview'; $this->orderby = array('slmaster_id', 'age'); $sh = new SearchHandler($this, false); $cc = new ConstraintChain(); if (!empty($_slmaster_id)) { if (!is_array($_slmaster_id)) { $_slmaster_id = array($_slmaster_id); } $cc = new Constraint('slmaster_id', 'in', '(' . implode(',', $_slmaster_id) . ')'); $sh->addConstraintChain($cc); } $this->load($sh); for ($i = -1; $i <= $this->agedMonths; $i++) { $this->agedBalances[$i]['title'] = 'Month+' . $i; $this->agedBalances[$i]['value'] = '0.00'; } $this->agedBalances[-1]['title'] = 'Future'; $this->agedBalances[0]['title'] = 'Current Month'; $this->agedBalances[$this->agedMonths + 1]['title'] = 'Older'; $this->agedBalances[$this->agedMonths + 1]['value'] = '0.00'; $total = 0; foreach ($this as $agedcreditors) { $total = bcadd($total, $agedcreditors->value); if ($agedcreditors->age > $this->agedMonths) { $this->agedBalances[$this->agedMonths]['value'] = BCADD($this->agedBalances[$this->agedMonths]['value'], $agedcreditors->value, 2); } elseif ($agedcreditors->age < 0) { $this->agedBalances[-1]['value'] = BCADD($this->agedBalances[-1]['value'], $agedcreditors->value, 2); } else { $this->agedBalances[$agedcreditors->age]['value'] = BCADD($this->agedBalances[$agedcreditors->age]['value'], $agedcreditors->value, 2); } } $this->agedBalances[$this->agedMonths + 2]['title'] = 'Total'; $this->agedBalances[$this->agedMonths + 2]['value'] = $total; return $this->agedBalances; }
public static function makeFromJournalEntry($gl_data, $lines_data, &$errors = array()) { $db = DB::Instance(); $glperiod = GLPeriod::getPeriod(fix_date($gl_data['transaction_date'])); if (!$glperiod || count($glperiod) == 0) { $errors[] = 'No period exists for this date'; return array(); } $gl_data['docref'] = $db->GenID('gl_transactions_docref_seq'); $gl_transactions = array(); foreach ($lines_data as $line) { if ($line['debit'] < 0 || $line['credit'] < 0) { $errors[] = 'Credit/Debit values cannot be negative'; } elseif ($line['debit'] == 0 && $line['credit'] == 0) { $errors[] = 'Can\'t enter a journal line without either a credit or a debit'; } elseif ($line['debit'] > 0 && $line['credit'] > 0) { $errors[] = 'A journal line cannot have both a credit and a debit'; } else { $gl_data['value'] = 0; if ($line['debit'] > 0) { $gl_data['value'] = BCADD($line['debit'], 0); } elseif ($line['credit'] > 0) { $gl_data['value'] = BCMUL($line['credit'], -1); } $gl_data['glperiods_id'] = $glperiod['id']; $gl_data['glaccount_id'] = $line['glaccount_id']; $gl_data['glcentre_id'] = $line['glcentre_id']; $gl_data['comment'] = $line['comment']; GLTransaction::setTwinCurrency($gl_data); $gl_transaction = GLTransaction::Factory($gl_data, $errors); $gl_transactions[] = $gl_transaction; if (isset($gl_data['accrual'])) { $gl_data['glperiods_id'] = $gl_data['accrual_period_id']; $gl_data['twinvalue'] *= -1; $gl_data['value'] *= -1; $gl_data['comment'] = 'Reverse ' . $gl_data['comment']; $gl_transaction = GLTransaction::Factory($gl_data, $errors); $gl_transactions[] = $gl_transaction; } } } return $gl_transactions; }
public static function getItemDetail($stitem) { // Get the current stock level for the item $in_stock = $stitem->currentBalance(); $balance = $in_stock; $orders = array(); // Get any Purchase Orders for the item, by date $porders = $stitem->getPOrderLines(); foreach ($porders as $porder) { if (isset($orders[$porder->due_delivery_date . 'PO' . $porder->order_id])) { $orders[$porder->due_delivery_date . 'PO' . $porder->order_id]['on_order'] += round($stitem->convertToUoM($porder->stuom_id, $stitem->uom_id, $porder->os_qty), $stitem->qty_decimals); } else { $orders[$porder->due_delivery_date . 'PO' . $porder->order_id] = array('due_date' => un_fix_date($porder->due_delivery_date), 'order_type' => 'PO', 'reference' => $porder->order_number, 'reference_id' => $porder->order_id, 'stitem_id' => $porder->stitem_id, 'stitem' => $porder->stitem, 'uom_name' => $porder->uom_name, 'decimals' => $stitem->qty_decimals, 'on_order' => round($stitem->convertToUoM($porder->stuom_id, $stitem->uom_id, $porder->os_qty), $stitem->qty_decimals), 'required' => 0); } } // Get any Works Orders to make this item, by date $worders = $stitem->getWorkOrders(); foreach ($worders as $worder) { $orders[$worder->required_by . 'WO' . $worder->id] = array('due_date' => un_fix_date($worder->required_by), 'order_type' => 'WO', 'reference' => $worder->wo_number, 'reference_id' => $worder->id, 'stitem_id' => $worder->stitem_id, 'stitem' => $worder->stitem, 'uom_name' => $stitem->uom_name, 'decimals' => $stitem->qty_decimals, 'on_order' => round($worder->outstandingQty(), $stitem->qty_decimals), 'required' => 0); } // Get any Sales Orders by date for the item $sorders = $stitem->getSOrderLines(); foreach ($sorders as $sorder) { if (isset($orders[$sorder->due_despatch_date . 'SO' . $sorder->order_id])) { $orders[$sorder->due_despatch_date . 'SO' . $sorder->order_id]['required'] += round($stitem->convertToUoM($sorder->stuom_id, $stitem->uom_id, $sorder->os_qty), $stitem->qty_decimals); } else { $orders[$sorder->due_despatch_date . 'SO' . $sorder->order_id] = array('due_date' => un_fix_date($sorder->due_despatch_date), 'order_type' => 'SO', 'reference' => $sorder->order_number, 'reference_id' => $sorder->order_id, 'stitem_id' => $sorder->stitem_id, 'stitem' => $sorder->stitem, 'uom_name' => $sorder->uom_name, 'decimals' => $stitem->qty_decimals, 'on_order' => 0, 'required' => round($stitem->convertToUoM($sorder->stuom_id, $stitem->uom_id, $sorder->os_qty), $stitem->qty_decimals)); } } // Get any Works Orders that use this item, by date $wostructures = $stitem->getWOStructures(); foreach ($wostructures as $wostructure) { $orders[$wostructure->required_by . 'WO' . $wostructure->work_order_id] = array('due_date' => un_fix_date($wostructure->required_by), 'order_type' => 'WO', 'reference' => $wostructure->wo_number, 'reference_id' => $wostructure->work_order_id, 'stitem_id' => $wostructure->stitem_id, 'stitem' => $wostructure->ststructure, 'stitem_code' => $wostructure->stitem_code, 'uom_name' => $wostructure->uom, 'decimals' => $stitem->qty_decimals, 'on_order' => 0, 'required' => round($stitem->convertToUoM($wostructure->uom_id, $stitem->uom_id, $wostructure->outstandingQty()), $stitem->qty_decimals)); } // Get any Purchase Orders for items that use this item, by date $porders = $stitem->getPOStructures(); foreach ($porders as $porder) { $structure = DataObjectFactory::Factory('STitem'); $structure->load($porder->ststructure_id); $mfstructure = DataObjectFactory::Factory('MFStructure'); $mfstructure->loadBy(array('stitem_id', 'ststructure_id'), array($porder->stitem_id, $porder->ststructure_id)); $required = $porder->required * 100 / (100 - $mfstructure->waste_pc); if (isset($orders[$porder->due_delivery_date . 'PO' . $porder->order_id])) { $orders[$porder->due_delivery_date . 'PO' . $porder->order_id]['required'] += round($structure->convertToUoM($porder->uom_id, $structure->uom_id, $required), $stitem->qty_decimals); } else { $orders[$porder->due_delivery_date . 'PO' . $porder->id] = array('due_date' => un_fix_date($porder->due_delivery_date), 'order_type' => 'PO', 'reference' => $porder->order_number, 'reference_id' => $porder->order_id, 'stitem_id' => $porder->stitem_id, 'stitem' => $porder->stitem, 'stitem_code' => $porder->item_code, 'uom_name' => $porder->uom_name, 'decimals' => $stitem->qty_decimals, 'on_order' => 0, 'required' => round($structure->convertToUoM($porder->uom_id, $structure->uom_id, $required), $stitem->qty_decimals)); } } ksort($orders); // Now build the manufacturing plan for the order dates foreach ($orders as $key => $row) { $required = BCADD(sprintf('%0' . $row['decimals'] . 'f', $row['required']), 0, $row['decimals']); $on_order = BCADD(sprintf('%0' . $row['decimals'] . 'f', $row['on_order']), 0, $row['decimals']); $orders[$key]['required'] = $required; $orders[$key]['on_order'] = $on_order; $balance = BCSUB(BCADD($balance, $on_order, $row['decimals']), $required, $row['decimals']); $orders[$key]['in_stock'] = $balance; if ($orders[$key]['in_stock'] < 0) { $orders[$key]['in_stock'] = sprintf('%0.' . $row['decimals'] . 'f', 0); } $orders[$key]['shortfall'] = sprintf('%0.' . $row['decimals'] . 'f', 0); if ($balance < 0) { $orders[$key]['shortfall'] = bcsub(0, $balance, $row['decimals']); } } return $orders; }