[open-ils-commits] r12842 - trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq (erickson)

svn at svn.open-ils.org svn at svn.open-ils.org
Fri Apr 10 10:33:42 EDT 2009


Author: erickson
Date: 2009-04-10 10:33:40 -0400 (Fri, 10 Apr 2009)
New Revision: 12842

Modified:
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm
Log:
plugged in debit creation

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm	2009-04-10 14:27:37 UTC (rev 12841)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm	2009-04-10 14:33:40 UTC (rev 12842)
@@ -255,7 +255,146 @@
     }
 }
 
+sub get_li_price {
+    my $li = shift;
+    my $attrs = $li->attributes;
+    my ($marc_estimated, $local_estimated, $local_actual, $prov_estimated, $prov_actual);
+
+    for my $attr (@$attrs) {
+        if($attr->attr_name eq 'estimated_price') {
+            $local_estimated = $attr->attr_value 
+                if $attr->attr_type eq 'lineitem_local_attr_definition';
+            $prov_estimated = $attr->attr_value 
+                if $attr->attr_type eq 'lineitem_prov_attr_definition';
+            $marc_estimated = $attr->attr_value
+                if $attr->attr_type eq 'lineitem_marc_attr_definition';
+
+        } elsif($attr->attr_name eq 'actual_price') {
+            $local_actual = $attr->attr_value     
+                if $attr->attr_type eq 'lineitem_local_attr_definition';
+            $prov_actual = $attr->attr_value 
+                if $attr->attr_type eq 'lineitem_prov_attr_definition';
+        }
+    }
+
+    return ($local_actual, 1) if $local_actual;
+    return ($prov_actual, 2) if $prov_actual;
+    return ($local_estimated, 1) if $local_estimated;
+    return ($prov_estimated, 2) if $prov_estimated;
+    return ($marc_estimated, 3);
+}
+
+
 # ----------------------------------------------------------------------------
+# Lineitem Debits
+# ----------------------------------------------------------------------------
+sub create_lineitem_debits {
+    my($mgr, $li, $price, $ptype) = @_; 
+
+    ($price, $ptype) = get_li_price($li) unless $price;
+
+    unless($price) {
+        $mgr->editor->event(OpenILS::Event->new('ACQ_LINEITEM_NO_PRICE', payload => $li->id));
+        $mgr->editor->rollback;
+        return 0;
+    }
+
+    unless($li->provider) {
+        $mgr->editor->event(OpenILS::Event->new('ACQ_LINEITEM_NO_PROVIDER', payload => $li->id));
+        $mgr->editor->rollback;
+        return 0;
+    }
+
+    my $lid_ids = $mgr->editor->search_acq_lineitem_detail(
+        {lineitem => $li->id}, 
+        {idlist=>1}
+    );
+
+    for my $lid_id (@$lid_ids) {
+
+        my $lid = $mgr->editor->retrieve_acq_lineitem_detail([
+            $lid_id,
+            {   flesh => 1, 
+                flesh_fields => {acqlid => ['fund']}
+            }
+        ]);
+
+        create_lineitem_detail_debit($mgr, $li, $lid, $price, $ptype) or return 0;
+    }
+
+    return 1;
+}
+
+
+# flesh li->provider
+# flesh lid->fund
+# ptype 1=local, 2=provider, 3=marc
+sub create_lineitem_detail_debit {
+    my($mgr, $li, $lid, $price, $ptype) = @_;
+
+    unless(ref $li and ref $li->provider) {
+       $li = $mgr->editor->retrieve_acq_lineitem([
+            $li,
+            {   flesh => 1,
+                flesh_fields => {jub => ['provider']},
+            }
+        ]);
+    }
+
+    unless(ref $lid and ref $lid->fund) {
+        $lid = $mgr->editor->retrieve_acq_lineitem_detail([
+            $lid,
+            {   flesh => 1, 
+                flesh_fields => {acqlid => ['fund']}
+            }
+        ]);
+    }
+
+    my $ctype = $lid->fund->currency_type;
+    my $amount = $price;
+
+    if($ptype == 2) { # price from vendor
+        $ctype = $li->provider->currency_type;
+        $amount = currency_conversion($mgr, $ctype, $lid->fund->currency_type, $price);
+    }
+
+    my $debit = create_fund_debit(
+        $mgr, 
+        fund => $lid->fund->id,
+        origin_amount => $price,
+        origin_currency_type => $ctype,
+        amount => $amount
+    ) or return 0;
+
+    $lid->fund_debit($debit->id);
+    $lid->fund($lid->fund->id);
+    $mgr->editor->update_acq_lineitem_detail($lid) or return 0;
+    return $debit;
+}
+
+
+# ----------------------------------------------------------------------------
+# Fund Debit
+# ----------------------------------------------------------------------------
+sub create_fund_debit {
+    my($mgr, %args) = @_;
+    my $debit = Fieldmapper::acq::fund_debit->new;
+    $debit->debit_type('purchase');
+    $debit->encumbrance('t');
+    $debit->$_($args{$_}) for keys %args;
+    $mgr->add_debit($debit->amount);
+    return $mgr->editor->create_acq_fund_debit($debit);
+}
+
+sub currency_conversion {
+    my($mgr, $src_currency, $dest_currency, $amount) = @_;
+    my $result = $mgr->editor->json_query(
+        {from => ['acq.exchange_ratio', $src_currency, $dest_currency, $amount]});
+    return $result->[0]->{'acq.exchange_ratio'};
+}
+
+
+# ----------------------------------------------------------------------------
 # Picklist
 # ----------------------------------------------------------------------------
 sub create_picklist {
@@ -548,11 +687,14 @@
 
 	my $e = new_editor(authtoken => $auth, xact => 1);
     return $e->die_event unless $e->checkauth;
+
     my $mgr = OpenILS::Application::Acq::BatchManager->new(
-        editor => $e, conn => $conn, throttle => 5);
+        editor => $e, 
+        conn => $conn, 
+        throttle => 5
+    );
 
     my $cache = OpenSRF::Utils::Cache->new;
-    my $evt;
 
     my $data = $cache->get_cache("vandelay_import_spool_$key");
 	my $purpose = $data->{purpose};
@@ -561,7 +703,9 @@
     my $picklist = $data->{picklist};
     my $create_po = $data->{create_po};
     my $ordering_agency = $data->{ordering_agency};
+    my $create_assets = $data->{create_assets};
     my $po;
+    my $evt;
 
     unless(-r $filename) {
         $logger->error("unable to read MARC file $filename");
@@ -640,13 +784,15 @@
 
         my $li = create_lineitem($mgr, %args) or return $mgr->editor->die_event;
         $mgr->respond;
+        $li->provider($provider); # flesh it, we'll need it later
 
         import_lineitem_details($mgr, $ordering_agency, $li) or return $mgr->editor->die_event;
         $mgr->respond;
 
-        if($li->purchase_order) {
-            create_lineitem_assets($mgr, $li->id) or return 0;
+        if($create_assets) {
+            create_lineitem_assets($mgr, $li->id) or return $mgr->editor->die_event;
         }
+
         $mgr->respond;
 	}
 
@@ -668,12 +814,18 @@
 
     my $idx = 1;
     while(1) {
+        # create a lineitem detail for each copy in the data
+
         my $compiled = extract_lineitem_detail_data($mgr, $org_path, $holdings, $idx);
         last unless defined $compiled;
         return 0 unless $compiled;
 
+        # this takes the price of the last copy and uses it as the lineitem price
+        # need to determine if a given record would include different prices for the same item
+        $price = $$compiled{price};
+
         for(1..$$compiled{quantity}) {
-            create_lineitem_detail($mgr, 
+            my $lid = create_lineitem_detail($mgr, 
                 lineitem => $li->id,
                 owning_lib => $$compiled{owning_lib},
                 cn_label => $$compiled{call_number},
@@ -687,6 +839,7 @@
         $idx++;
     }
 
+    # set the price attr so we'll know the source of the price
     set_lineitem_attr(
         $mgr, 
         attr_name => 'estimated_price',
@@ -695,6 +848,12 @@
         lineitem => $li->id
     ) or return 0;
 
+    # if we're creating a purchase order, create the debits
+    if($li->purchase_order) {
+        create_lineitem_debits($mgr, $li, $price, 2) or return 0;
+        $mgr->respond;
+    }
+
     return 1;
 }
 



More information about the open-ils-commits mailing list