Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
 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;
 }
Exemplo n.º 3
0
 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;
 }